From 80574fee56e6085ae55866e4fd8bb99247b60a60 Mon Sep 17 00:00:00 2001 From: TechKat Date: Thu, 6 Feb 2014 22:42:43 +0000 Subject: [PATCH] Added easy-pie-chart from versions 1.0.0 to 2.1.4 --- .../1.0.0/jquery.easy-pie-chart.css | 10 + .../1.0.0/jquery.easy-pie-chart.js | 176 ++++++++ .../1.0.1/jquery.easy-pie-chart.css | 10 + .../1.0.1/jquery.easy-pie-chart.js | 185 ++++++++ .../1.0.2/jquery.easy-pie-chart.css | 10 + .../1.0.2/jquery.easy-pie-chart.js | 182 ++++++++ .../1.1.0/jquery.easy-pie-chart.css | 10 + .../1.1.0/jquery.easy-pie-chart.js | 187 +++++++++ .../1.2.2/jquery.easy-pie-chart.css | 10 + .../1.2.2/jquery.easy-pie-chart.js | 190 +++++++++ .../1.2.3/jquery.easy-pie-chart.css | 10 + .../1.2.3/jquery.easy-pie-chart.js | 193 +++++++++ .../1.2.4/jquery.easy-pie-chart.css | 10 + .../1.2.4/jquery.easy-pie-chart.js | 199 +++++++++ .../1.2.5/jquery.easy-pie-chart.css | 10 + .../1.2.5/jquery.easy-pie-chart.js | 200 +++++++++ .../2.0.0/angular.easypiechart.js | 273 ++++++++++++ .../2.0.0/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.0.0/easypiechart.js | 211 ++++++++++ .../easy-pie-chart/2.0.0/easypiechart.min.js | 9 + .../2.0.0/jquery.easypiechart.js | 219 ++++++++++ .../2.0.0/jquery.easypiechart.min.js | 9 + .../2.0.1/angular.easypiechart.js | 279 +++++++++++++ .../2.0.1/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.0.1/easypiechart.js | 217 ++++++++++ .../easy-pie-chart/2.0.1/easypiechart.min.js | 9 + .../2.0.1/jquery.easypiechart.js | 225 ++++++++++ .../2.0.1/jquery.easypiechart.min.js | 9 + .../2.0.2/angular.easypiechart.js | 298 +++++++++++++ .../2.0.2/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.0.2/easypiechart.js | 236 +++++++++++ .../easy-pie-chart/2.0.2/easypiechart.min.js | 9 + .../2.0.2/jquery.easypiechart.js | 244 +++++++++++ .../2.0.2/jquery.easypiechart.min.js | 9 + .../2.0.3/angular.easypiechart.js | 345 +++++++++++++++ .../2.0.3/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.0.3/easypiechart.js | 283 +++++++++++++ .../easy-pie-chart/2.0.3/easypiechart.min.js | 9 + .../2.0.3/jquery.easypiechart.js | 291 +++++++++++++ .../2.0.3/jquery.easypiechart.min.js | 9 + .../2.0.4/angular.easypiechart.js | 348 ++++++++++++++++ .../2.0.4/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.0.4/easypiechart.js | 283 +++++++++++++ .../easy-pie-chart/2.0.4/easypiechart.min.js | 9 + .../2.0.4/jquery.easypiechart.js | 291 +++++++++++++ .../2.0.4/jquery.easypiechart.min.js | 9 + .../2.0.5/angular.easypiechart.js | 350 ++++++++++++++++ .../2.0.5/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.0.5/easypiechart.js | 283 +++++++++++++ .../easy-pie-chart/2.0.5/easypiechart.min.js | 9 + .../2.0.5/jquery.easypiechart.js | 291 +++++++++++++ .../2.0.5/jquery.easypiechart.min.js | 9 + .../2.1.0/angular.easypiechart.js | 350 ++++++++++++++++ .../2.1.0/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.1.0/easypiechart.js | 299 +++++++++++++ .../easy-pie-chart/2.1.0/easypiechart.min.js | 9 + .../2.1.0/jquery.easypiechart.js | 306 ++++++++++++++ .../2.1.0/jquery.easypiechart.min.js | 9 + .../2.1.1/angular.easypiechart.js | 350 ++++++++++++++++ .../2.1.1/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.1.1/easypiechart.js | 299 +++++++++++++ .../easy-pie-chart/2.1.1/easypiechart.min.js | 9 + .../2.1.1/jquery.easypiechart.js | 306 ++++++++++++++ .../2.1.1/jquery.easypiechart.min.js | 9 + .../2.1.2/angular.easypiechart.js | 350 ++++++++++++++++ .../2.1.2/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.1.2/easypiechart.js | 299 +++++++++++++ .../easy-pie-chart/2.1.2/easypiechart.min.js | 9 + .../2.1.2/jquery.easypiechart.js | 309 ++++++++++++++ .../2.1.2/jquery.easypiechart.min.js | 9 + .../2.1.3/angular.easypiechart.js | 349 ++++++++++++++++ .../2.1.3/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.1.3/easypiechart.js | 298 +++++++++++++ .../easy-pie-chart/2.1.3/easypiechart.min.js | 9 + .../2.1.3/jquery.easypiechart.js | 308 ++++++++++++++ .../2.1.3/jquery.easypiechart.min.js | 9 + .../2.1.4/angular.easypiechart.js | 394 ++++++++++++++++++ .../2.1.4/angular.easypiechart.min.js | 9 + .../libs/easy-pie-chart/2.1.4/easypiechart.js | 346 +++++++++++++++ .../easy-pie-chart/2.1.4/easypiechart.min.js | 9 + .../2.1.4/jquery.easypiechart.js | 357 ++++++++++++++++ .../2.1.4/jquery.easypiechart.min.js | 9 + 82 files changed, 11776 insertions(+) create mode 100644 ajax/libs/easy-pie-chart/1.0.0/jquery.easy-pie-chart.css create mode 100644 ajax/libs/easy-pie-chart/1.0.0/jquery.easy-pie-chart.js create mode 100644 ajax/libs/easy-pie-chart/1.0.1/jquery.easy-pie-chart.css create mode 100644 ajax/libs/easy-pie-chart/1.0.1/jquery.easy-pie-chart.js create mode 100644 ajax/libs/easy-pie-chart/1.0.2/jquery.easy-pie-chart.css create mode 100644 ajax/libs/easy-pie-chart/1.0.2/jquery.easy-pie-chart.js create mode 100644 ajax/libs/easy-pie-chart/1.1.0/jquery.easy-pie-chart.css create mode 100644 ajax/libs/easy-pie-chart/1.1.0/jquery.easy-pie-chart.js create mode 100644 ajax/libs/easy-pie-chart/1.2.2/jquery.easy-pie-chart.css create mode 100644 ajax/libs/easy-pie-chart/1.2.2/jquery.easy-pie-chart.js create mode 100644 ajax/libs/easy-pie-chart/1.2.3/jquery.easy-pie-chart.css create mode 100644 ajax/libs/easy-pie-chart/1.2.3/jquery.easy-pie-chart.js create mode 100644 ajax/libs/easy-pie-chart/1.2.4/jquery.easy-pie-chart.css create mode 100644 ajax/libs/easy-pie-chart/1.2.4/jquery.easy-pie-chart.js create mode 100644 ajax/libs/easy-pie-chart/1.2.5/jquery.easy-pie-chart.css create mode 100644 ajax/libs/easy-pie-chart/1.2.5/jquery.easy-pie-chart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.0/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.0/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.0/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.0/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.0/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.0/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.1/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.1/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.1/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.1/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.1/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.1/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.2/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.2/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.2/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.2/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.2/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.2/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.3/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.3/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.3/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.3/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.3/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.3/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.4/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.4/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.4/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.4/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.4/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.4/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.5/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.5/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.5/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.5/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.0.5/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.0.5/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.0/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.0/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.0/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.0/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.0/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.0/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.1/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.1/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.1/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.1/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.1/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.1/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.2/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.2/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.2/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.2/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.2/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.2/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.3/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.3/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.3/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.3/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.3/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.3/jquery.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.4/angular.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.4/angular.easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.4/easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.4/easypiechart.min.js create mode 100644 ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.js create mode 100644 ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.min.js diff --git a/ajax/libs/easy-pie-chart/1.0.0/jquery.easy-pie-chart.css b/ajax/libs/easy-pie-chart/1.0.0/jquery.easy-pie-chart.css new file mode 100644 index 000000000..0b7be9e60 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.0.0/jquery.easy-pie-chart.css @@ -0,0 +1,10 @@ +.easyPieChart { + position: relative; + text-align: center; +} + +.easyPieChart canvas { + position: absolute; + top: 0; + left: 0; +} diff --git a/ajax/libs/easy-pie-chart/1.0.0/jquery.easy-pie-chart.js b/ajax/libs/easy-pie-chart/1.0.0/jquery.easy-pie-chart.js new file mode 100644 index 000000000..86f5e2a5a --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.0.0/jquery.easy-pie-chart.js @@ -0,0 +1,176 @@ +// Generated by CoffeeScript 1.4.0 + +/* +Easy pie chart is a jquery plugin to display simple animated pie charts for only one value + +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) +and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + +Built on top of the jQuery library (http://jquery.com) + +@source: http://github.com/rendro/easy-pie-chart/ +@autor: Robert Fleischmann +@version: 1.0.1 + +Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210 +Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script +*/ + + +(function() { + + (function($) { + $.easyPieChart = function(el, options) { + var addScaleLine, animateLine, drawLine, easeInOutQuad, renderBackground, renderScale, renderTrack, + _this = this; + this.el = el; + this.$el = $(el); + this.$el.data("easyPieChart", this); + this.init = function() { + var percent; + _this.options = $.extend({}, $.easyPieChart.defaultOptions, options); + percent = parseInt(_this.$el.data('percent'), 10); + _this.percentage = 0; + _this.canvas = $("").get(0); + _this.$el.append(_this.canvas); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(_this.canvas); + } + _this.ctx = _this.canvas.getContext('2d'); + _this.ctx.translate(_this.options.size / 2, _this.options.size / 2); + _this.$el.addClass('easyPieChart'); + _this.$el.css({ + width: _this.options.size, + height: _this.options.size, + lineHeight: "" + _this.options.size + "px" + }); + _this.update(percent); + return _this; + }; + this.update = function(percent) { + if (_this.options.animate === false) { + return drawLine(percent); + } else { + return animateLine(_this.percentage, percent); + } + }; + renderScale = function() { + var i, _i, _results; + _this.ctx.fillStyle = _this.options.scaleColor; + _this.ctx.lineWidth = 1; + _results = []; + for (i = _i = 0; _i <= 24; i = ++_i) { + _results.push(addScaleLine(i)); + } + return _results; + }; + addScaleLine = function(i) { + var offset; + offset = i % 6 === 0 ? 0 : _this.options.size * 0.017; + _this.ctx.save(); + _this.ctx.rotate(i * Math.PI / 12); + _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1); + return _this.ctx.restore(); + }; + renderTrack = function() { + var offset; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true); + _this.ctx.closePath(); + _this.ctx.strokeStyle = _this.options.trackColor; + _this.ctx.lineWidth = _this.options.lineWidth; + return _this.ctx.stroke(); + }; + renderBackground = function() { + if (_this.options.scaleColor !== false) { + renderScale(); + } + if (_this.options.trackColor !== false) { + return renderTrack(); + } + }; + drawLine = function(percent) { + var offset; + renderBackground(); + _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor; + _this.ctx.lineCap = _this.options.lineCap; + _this.ctx.lineWidth = _this.options.lineWidth; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.save(); + _this.ctx.rotate(-Math.PI / 2); + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false); + _this.ctx.stroke(); + return _this.ctx.restore(); + }; + animateLine = function(from, to) { + var currentStep, fps, steps; + fps = 30; + steps = fps * _this.options.animate / 1000; + currentStep = 0; + _this.options.onStart.call(_this); + _this.percentage = to; + if (_this.animation) { + clearInterval(_this.animation); + _this.animation = false; + } + return _this.animation = setInterval(function() { + _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size); + renderBackground.call(_this); + drawLine.call(_this, [easeInOutQuad(currentStep, from, to - from, steps)]); + currentStep++; + if ((currentStep / steps) > 1) { + clearInterval(_this.animation); + _this.animation = false; + return _this.options.onStop.call(_this); + } + }, 1000 / fps); + }; + easeInOutQuad = function(t, b, c, d) { + var easeIn, easing; + easeIn = function(t) { + return Math.pow(t, 2); + }; + easing = function(t) { + if (t < 1) { + return easeIn(t); + } else { + return 2 - easeIn((t / 2) * -2 + 2); + } + }; + t /= d / 2; + return c / 2 * easing(t) + b; + }; + return this.init(); + }; + $.easyPieChart.defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f2f2f2', + scaleColor: '#dfe0e0', + lineCap: 'round', + size: 110, + lineWidth: 3, + animate: false, + onStart: $.noop, + onStop: $.noop + }; + $.fn.easyPieChart = function(options) { + return $.each(this, function(i, el) { + var $el; + $el = $(el); + if (!$el.data('easyPieChart')) { + return $el.data('easyPieChart', new $.easyPieChart(el, options)); + } + }); + }; + return void 0; + })(jQuery); + +}).call(this); diff --git a/ajax/libs/easy-pie-chart/1.0.1/jquery.easy-pie-chart.css b/ajax/libs/easy-pie-chart/1.0.1/jquery.easy-pie-chart.css new file mode 100644 index 000000000..0b7be9e60 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.0.1/jquery.easy-pie-chart.css @@ -0,0 +1,10 @@ +.easyPieChart { + position: relative; + text-align: center; +} + +.easyPieChart canvas { + position: absolute; + top: 0; + left: 0; +} diff --git a/ajax/libs/easy-pie-chart/1.0.1/jquery.easy-pie-chart.js b/ajax/libs/easy-pie-chart/1.0.1/jquery.easy-pie-chart.js new file mode 100644 index 000000000..59e5a81f4 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.0.1/jquery.easy-pie-chart.js @@ -0,0 +1,185 @@ +// Generated by CoffeeScript 1.4.0 + +/* +Easy pie chart is a jquery plugin to display simple animated pie charts for only one value + +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) +and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + +Built on top of the jQuery library (http://jquery.com) + +@source: http://github.com/rendro/easy-pie-chart/ +@autor: Robert Fleischmann +@version: 1.0.1 + +Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210 +Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script +*/ + + +(function() { + + (function($) { + $.easyPieChart = function(el, options) { + var addScaleLine, animateLine, drawLine, easeInOutQuad, renderBackground, renderScale, renderTrack, + _this = this; + this.el = el; + this.$el = $(el); + this.$el.data("easyPieChart", this); + this.init = function() { + var percent; + _this.options = $.extend({}, $.easyPieChart.defaultOptions, options); + percent = parseInt(_this.$el.data('percent'), 10); + _this.percentage = 0; + _this.canvas = $("").get(0); + _this.$el.append(_this.canvas); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(_this.canvas); + } + _this.ctx = _this.canvas.getContext('2d'); + if (window.devicePixelRatio > 1.5) { + $(_this.canvas).css({ + width: _this.options.size, + height: _this.options.size + }); + _this.canvas.width *= 2; + _this.canvas.height *= 2; + _this.ctx.scale(2, 2); + } + _this.ctx.translate(_this.options.size / 2, _this.options.size / 2); + _this.$el.addClass('easyPieChart'); + _this.$el.css({ + width: _this.options.size, + height: _this.options.size, + lineHeight: "" + _this.options.size + "px" + }); + _this.update(percent); + return _this; + }; + this.update = function(percent) { + if (_this.options.animate === false) { + return drawLine(percent); + } else { + return animateLine(_this.percentage, percent); + } + }; + renderScale = function() { + var i, _i, _results; + _this.ctx.fillStyle = _this.options.scaleColor; + _this.ctx.lineWidth = 1; + _results = []; + for (i = _i = 0; _i <= 24; i = ++_i) { + _results.push(addScaleLine(i)); + } + return _results; + }; + addScaleLine = function(i) { + var offset; + offset = i % 6 === 0 ? 0 : _this.options.size * 0.017; + _this.ctx.save(); + _this.ctx.rotate(i * Math.PI / 12); + _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1); + return _this.ctx.restore(); + }; + renderTrack = function() { + var offset; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true); + _this.ctx.closePath(); + _this.ctx.strokeStyle = _this.options.trackColor; + _this.ctx.lineWidth = _this.options.lineWidth; + return _this.ctx.stroke(); + }; + renderBackground = function() { + if (_this.options.scaleColor !== false) { + renderScale(); + } + if (_this.options.trackColor !== false) { + return renderTrack(); + } + }; + drawLine = function(percent) { + var offset; + renderBackground(); + _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor; + _this.ctx.lineCap = _this.options.lineCap; + _this.ctx.lineWidth = _this.options.lineWidth; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.save(); + _this.ctx.rotate(-Math.PI / 2); + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false); + _this.ctx.stroke(); + return _this.ctx.restore(); + }; + animateLine = function(from, to) { + var currentStep, fps, steps; + fps = 30; + steps = fps * _this.options.animate / 1000; + currentStep = 0; + _this.options.onStart.call(_this); + _this.percentage = to; + if (_this.animation) { + clearInterval(_this.animation); + _this.animation = false; + } + return _this.animation = setInterval(function() { + _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size); + renderBackground.call(_this); + drawLine.call(_this, [easeInOutQuad(currentStep, from, to - from, steps)]); + currentStep++; + if ((currentStep / steps) > 1) { + clearInterval(_this.animation); + _this.animation = false; + return _this.options.onStop.call(_this); + } + }, 1000 / fps); + }; + easeInOutQuad = function(t, b, c, d) { + var easeIn, easing; + easeIn = function(t) { + return Math.pow(t, 2); + }; + easing = function(t) { + if (t < 1) { + return easeIn(t); + } else { + return 2 - easeIn((t / 2) * -2 + 2); + } + }; + t /= d / 2; + return c / 2 * easing(t) + b; + }; + return this.init(); + }; + $.easyPieChart.defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f2f2f2', + scaleColor: '#dfe0e0', + lineCap: 'round', + size: 110, + lineWidth: 3, + animate: false, + onStart: $.noop, + onStop: $.noop + }; + $.fn.easyPieChart = function(options) { + return $.each(this, function(i, el) { + var $el; + $el = $(el); + if (!$el.data('easyPieChart')) { + return $el.data('easyPieChart', new $.easyPieChart(el, options)); + } + }); + }; + return void 0; + })(jQuery); + +}).call(this); diff --git a/ajax/libs/easy-pie-chart/1.0.2/jquery.easy-pie-chart.css b/ajax/libs/easy-pie-chart/1.0.2/jquery.easy-pie-chart.css new file mode 100644 index 000000000..0b7be9e60 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.0.2/jquery.easy-pie-chart.css @@ -0,0 +1,10 @@ +.easyPieChart { + position: relative; + text-align: center; +} + +.easyPieChart canvas { + position: absolute; + top: 0; + left: 0; +} diff --git a/ajax/libs/easy-pie-chart/1.0.2/jquery.easy-pie-chart.js b/ajax/libs/easy-pie-chart/1.0.2/jquery.easy-pie-chart.js new file mode 100644 index 000000000..948c150fa --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.0.2/jquery.easy-pie-chart.js @@ -0,0 +1,182 @@ +// Generated by CoffeeScript 1.4.0 +/* +Easy pie chart is a jquery plugin to display simple animated pie charts for only one value + +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) +and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + +Built on top of the jQuery library (http://jquery.com) + +@source: http://github.com/rendro/easy-pie-chart/ +@autor: Robert Fleischmann +@version: 1.0.2 + +Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210 +Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script +*/ + +(function($) { + $.easyPieChart = function(el, options) { + var addScaleLine, animateLine, drawLine, easeInOutQuad, rAF, renderBackground, renderScale, renderTrack, + _this = this; + this.el = el; + this.$el = $(el); + this.$el.data("easyPieChart", this); + this.init = function() { + var percent, scaleBy; + _this.options = $.extend({}, $.easyPieChart.defaultOptions, options); + percent = parseInt(_this.$el.data('percent'), 10); + _this.percentage = 0; + _this.canvas = $("").get(0); + _this.$el.append(_this.canvas); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(_this.canvas); + } + _this.ctx = _this.canvas.getContext('2d'); + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + $(_this.canvas).css({ + width: _this.options.size, + height: _this.options.size + }); + _this.canvas.width *= scaleBy; + _this.canvas.height *= scaleBy; + _this.ctx.scale(scaleBy, scaleBy); + } + _this.ctx.translate(_this.options.size / 2, _this.options.size / 2); + _this.$el.addClass('easyPieChart'); + _this.$el.css({ + width: _this.options.size, + height: _this.options.size, + lineHeight: "" + _this.options.size + "px" + }); + _this.update(percent); + return _this; + }; + this.update = function(percent) { + if (_this.options.animate === false) { + return drawLine(percent); + } else { + return animateLine(_this.percentage, percent); + } + }; + renderScale = function() { + var i, _i, _results; + _this.ctx.fillStyle = _this.options.scaleColor; + _this.ctx.lineWidth = 1; + _results = []; + for (i = _i = 0; _i <= 24; i = ++_i) { + _results.push(addScaleLine(i)); + } + return _results; + }; + addScaleLine = function(i) { + var offset; + offset = i % 6 === 0 ? 0 : _this.options.size * 0.017; + _this.ctx.save(); + _this.ctx.rotate(i * Math.PI / 12); + _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1); + return _this.ctx.restore(); + }; + renderTrack = function() { + var offset; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true); + _this.ctx.closePath(); + _this.ctx.strokeStyle = _this.options.trackColor; + _this.ctx.lineWidth = _this.options.lineWidth; + return _this.ctx.stroke(); + }; + renderBackground = function() { + if (_this.options.scaleColor !== false) { + renderScale(); + } + if (_this.options.trackColor !== false) { + return renderTrack(); + } + }; + drawLine = function(percent) { + var offset; + renderBackground(); + _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor; + _this.ctx.lineCap = _this.options.lineCap; + _this.ctx.lineWidth = _this.options.lineWidth; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.save(); + _this.ctx.rotate(-Math.PI / 2); + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false); + _this.ctx.stroke(); + return _this.ctx.restore(); + }; + rAF = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(); + animateLine = function(from, to) { + var anim, startTime; + _this.options.onStart.call(_this); + _this.percentage = to; + startTime = Date.now(); + anim = function() { + var currentValue, process; + process = Date.now() - startTime; + if (process < _this.options.animate) { + rAF(anim); + } + _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size); + renderBackground.call(_this); + currentValue = [easeInOutQuad(process, from, to - from, _this.options.animate)]; + _this.options.onStep.call(_this, currentValue); + return drawLine.call(_this, currentValue); + }; + return rAF(anim); + }; + easeInOutQuad = function(t, b, c, d) { + var easeIn, easing; + easeIn = function(t) { + return Math.pow(t, 2); + }; + easing = function(t) { + if (t < 1) { + return easeIn(t); + } else { + return 2 - easeIn((t / 2) * -2 + 2); + } + }; + t /= d / 2; + return c / 2 * easing(t) + b; + }; + return this.init(); + }; + $.easyPieChart.defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f2f2f2', + scaleColor: '#dfe0e0', + lineCap: 'round', + size: 110, + lineWidth: 3, + animate: false, + onStart: $.noop, + onStop: $.noop, + onStep: $.noop + }; + $.fn.easyPieChart = function(options) { + return $.each(this, function(i, el) { + var $el; + $el = $(el); + if (!$el.data('easyPieChart')) { + return $el.data('easyPieChart', new $.easyPieChart(el, options)); + } + }); + }; + return void 0; +})(jQuery); diff --git a/ajax/libs/easy-pie-chart/1.1.0/jquery.easy-pie-chart.css b/ajax/libs/easy-pie-chart/1.1.0/jquery.easy-pie-chart.css new file mode 100644 index 000000000..0b7be9e60 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.1.0/jquery.easy-pie-chart.css @@ -0,0 +1,10 @@ +.easyPieChart { + position: relative; + text-align: center; +} + +.easyPieChart canvas { + position: absolute; + top: 0; + left: 0; +} diff --git a/ajax/libs/easy-pie-chart/1.1.0/jquery.easy-pie-chart.js b/ajax/libs/easy-pie-chart/1.1.0/jquery.easy-pie-chart.js new file mode 100644 index 000000000..e21c6fd8a --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.1.0/jquery.easy-pie-chart.js @@ -0,0 +1,187 @@ +// Generated by CoffeeScript 1.4.0 +/* +Easy pie chart is a jquery plugin to display simple animated pie charts for only one value + +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) +and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + +Built on top of the jQuery library (http://jquery.com) + +@source: http://github.com/rendro/easy-pie-chart/ +@autor: Robert Fleischmann +@version: 1.1.0 + +Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210 +Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script +*/ + +(function($) { + $.easyPieChart = function(el, options) { + var addScaleLine, animateLine, drawLine, easeInOutQuad, rAF, renderBackground, renderScale, renderTrack, + _this = this; + this.el = el; + this.$el = $(el); + this.$el.data("easyPieChart", this); + this.init = function() { + var percent, scaleBy; + _this.options = $.extend({}, $.easyPieChart.defaultOptions, options); + percent = parseInt(_this.$el.data('percent'), 10); + _this.percentage = 0; + _this.canvas = $("").get(0); + _this.$el.append(_this.canvas); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(_this.canvas); + } + _this.ctx = _this.canvas.getContext('2d'); + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + $(_this.canvas).css({ + width: _this.options.size, + height: _this.options.size + }); + _this.canvas.width *= scaleBy; + _this.canvas.height *= scaleBy; + _this.ctx.scale(scaleBy, scaleBy); + } + _this.ctx.translate(_this.options.size / 2, _this.options.size / 2); + _this.$el.addClass('easyPieChart'); + _this.$el.css({ + width: _this.options.size, + height: _this.options.size, + lineHeight: "" + _this.options.size + "px" + }); + _this.update(percent); + return _this; + }; + this.update = function(percent) { + percent = parseFloat(percent) || 0; + if (_this.options.animate === false) { + drawLine(percent); + } else { + animateLine(_this.percentage, percent); + } + return _this; + }; + renderScale = function() { + var i, _i, _results; + _this.ctx.fillStyle = _this.options.scaleColor; + _this.ctx.lineWidth = 1; + _results = []; + for (i = _i = 0; _i <= 24; i = ++_i) { + _results.push(addScaleLine(i)); + } + return _results; + }; + addScaleLine = function(i) { + var offset; + offset = i % 6 === 0 ? 0 : _this.options.size * 0.017; + _this.ctx.save(); + _this.ctx.rotate(i * Math.PI / 12); + _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1); + _this.ctx.restore(); + }; + renderTrack = function() { + var offset; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true); + _this.ctx.closePath(); + _this.ctx.strokeStyle = _this.options.trackColor; + _this.ctx.lineWidth = _this.options.lineWidth; + _this.ctx.stroke(); + }; + renderBackground = function() { + if (_this.options.scaleColor !== false) { + renderScale(); + } + if (_this.options.trackColor !== false) { + renderTrack(); + } + }; + drawLine = function(percent) { + var offset; + renderBackground(); + _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor; + _this.ctx.lineCap = _this.options.lineCap; + _this.ctx.lineWidth = _this.options.lineWidth; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.save(); + _this.ctx.rotate(-Math.PI / 2); + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false); + _this.ctx.stroke(); + _this.ctx.restore(); + }; + rAF = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(); + animateLine = function(from, to) { + var anim, startTime; + _this.options.onStart.call(_this); + _this.percentage = to; + startTime = Date.now(); + anim = function() { + var currentValue, process; + process = Date.now() - startTime; + if (process < _this.options.animate) { + rAF(anim); + } + _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size); + renderBackground.call(_this); + currentValue = [easeInOutQuad(process, from, to - from, _this.options.animate)]; + _this.options.onStep.call(_this, currentValue); + drawLine.call(_this, currentValue); + if (process >= _this.options.animate) { + return _this.options.onStop.call(_this); + } + }; + rAF(anim); + }; + easeInOutQuad = function(t, b, c, d) { + var easeIn, easing; + easeIn = function(t) { + return Math.pow(t, 2); + }; + easing = function(t) { + if (t < 1) { + return easeIn(t); + } else { + return 2 - easeIn((t / 2) * -2 + 2); + } + }; + t /= d / 2; + return c / 2 * easing(t) + b; + }; + return this.init(); + }; + $.easyPieChart.defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f2f2f2', + scaleColor: '#dfe0e0', + lineCap: 'round', + size: 110, + lineWidth: 3, + animate: false, + onStart: $.noop, + onStop: $.noop, + onStep: $.noop + }; + $.fn.easyPieChart = function(options) { + return $.each(this, function(i, el) { + var $el; + $el = $(el); + if (!$el.data('easyPieChart')) { + return $el.data('easyPieChart', new $.easyPieChart(el, options)); + } + }); + }; + return void 0; +})(jQuery); diff --git a/ajax/libs/easy-pie-chart/1.2.2/jquery.easy-pie-chart.css b/ajax/libs/easy-pie-chart/1.2.2/jquery.easy-pie-chart.css new file mode 100644 index 000000000..0b7be9e60 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.2.2/jquery.easy-pie-chart.css @@ -0,0 +1,10 @@ +.easyPieChart { + position: relative; + text-align: center; +} + +.easyPieChart canvas { + position: absolute; + top: 0; + left: 0; +} diff --git a/ajax/libs/easy-pie-chart/1.2.2/jquery.easy-pie-chart.js b/ajax/libs/easy-pie-chart/1.2.2/jquery.easy-pie-chart.js new file mode 100644 index 000000000..5c9e4f4a0 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.2.2/jquery.easy-pie-chart.js @@ -0,0 +1,190 @@ +// Generated by CoffeeScript 1.6.3 +/* +Easy pie chart is a jquery plugin to display simple animated pie charts for only one value + +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) +and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + +Built on top of the jQuery library (http://jquery.com) + +@source: http://github.com/rendro/easy-pie-chart/ +@autor: Robert Fleischmann +@version: 1.2.2 + +Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210 +Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script +*/ + +(function($) { + $.easyPieChart = function(el, options) { + var addScaleLine, animateLine, drawLine, easeInOutQuad, rAF, renderBackground, renderScale, renderTrack, + _this = this; + this.el = el; + this.$el = $(el); + this.$el.data("easyPieChart", this); + this.init = function() { + var percent, scaleBy; + _this.options = $.extend({}, $.easyPieChart.defaultOptions, options); + percent = parseInt(_this.$el.data('percent'), 10); + _this.percentage = 0; + _this.canvas = $("").get(0); + _this.$el.append(_this.canvas); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(_this.canvas); + } + _this.ctx = _this.canvas.getContext('2d'); + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + $(_this.canvas).css({ + width: _this.options.size, + height: _this.options.size + }); + _this.canvas.width *= scaleBy; + _this.canvas.height *= scaleBy; + _this.ctx.scale(scaleBy, scaleBy); + } + _this.ctx.translate(_this.options.size / 2, _this.options.size / 2); + _this.ctx.rotate(_this.options.rotate * Math.PI / 180); + _this.$el.addClass('easyPieChart'); + _this.$el.css({ + width: _this.options.size, + height: _this.options.size, + lineHeight: "" + _this.options.size + "px" + }); + _this.update(percent); + return _this; + }; + this.update = function(percent) { + percent = parseFloat(percent) || 0; + if (_this.options.animate === false) { + drawLine(percent); + } else { + animateLine(_this.percentage, percent); + } + return _this; + }; + renderScale = function() { + var i, _i, _results; + _this.ctx.fillStyle = _this.options.scaleColor; + _this.ctx.lineWidth = 1; + _results = []; + for (i = _i = 0; _i <= 24; i = ++_i) { + _results.push(addScaleLine(i)); + } + return _results; + }; + addScaleLine = function(i) { + var offset; + offset = i % 6 === 0 ? 0 : _this.options.size * 0.017; + _this.ctx.save(); + _this.ctx.rotate(i * Math.PI / 12); + _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1); + _this.ctx.restore(); + }; + renderTrack = function() { + var offset; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true); + _this.ctx.closePath(); + _this.ctx.strokeStyle = _this.options.trackColor; + _this.ctx.lineWidth = _this.options.lineWidth; + _this.ctx.stroke(); + }; + renderBackground = function() { + if (_this.options.scaleColor !== false) { + renderScale(); + } + if (_this.options.trackColor !== false) { + renderTrack(); + } + }; + drawLine = function(percent) { + var offset; + renderBackground(); + _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor; + _this.ctx.lineCap = _this.options.lineCap; + _this.ctx.lineWidth = _this.options.lineWidth; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.save(); + _this.ctx.rotate(-Math.PI / 2); + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false); + _this.ctx.stroke(); + _this.ctx.restore(); + }; + rAF = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(); + animateLine = function(from, to) { + var anim, startTime; + _this.options.onStart.call(_this); + _this.percentage = to; + startTime = Date.now(); + anim = function() { + var currentValue, process; + process = Date.now() - startTime; + if (process < _this.options.animate) { + rAF(anim); + } + _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size); + renderBackground.call(_this); + currentValue = [easeInOutQuad(process, from, to - from, _this.options.animate)]; + _this.options.onStep.call(_this, currentValue); + drawLine.call(_this, currentValue); + if (process >= _this.options.animate) { + return _this.options.onStop.call(_this, currentValue, to); + } + }; + rAF(anim); + }; + easeInOutQuad = function(t, b, c, d) { + var easeIn, easing; + easeIn = function(t) { + return Math.pow(t, 2); + }; + easing = function(t) { + if (t < 1) { + return easeIn(t); + } else { + return 2 - easeIn((t / 2) * -2 + 2); + } + }; + t /= d / 2; + return c / 2 * easing(t) + b; + }; + return this.init(); + }; + $.easyPieChart.defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f2f2f2', + scaleColor: '#dfe0e0', + lineCap: 'round', + rotate: 0, + size: 110, + lineWidth: 3, + animate: false, + onStart: $.noop, + onStop: $.noop, + onStep: $.noop + }; + $.fn.easyPieChart = function(options) { + return $.each(this, function(i, el) { + var $el, instanceOptions; + $el = $(el); + if (!$el.data('easyPieChart')) { + instanceOptions = $.extend({}, options, $el.data()); + return $el.data('easyPieChart', new $.easyPieChart(el, instanceOptions)); + } + }); + }; + return void 0; +})(jQuery); diff --git a/ajax/libs/easy-pie-chart/1.2.3/jquery.easy-pie-chart.css b/ajax/libs/easy-pie-chart/1.2.3/jquery.easy-pie-chart.css new file mode 100644 index 000000000..0b7be9e60 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.2.3/jquery.easy-pie-chart.css @@ -0,0 +1,10 @@ +.easyPieChart { + position: relative; + text-align: center; +} + +.easyPieChart canvas { + position: absolute; + top: 0; + left: 0; +} diff --git a/ajax/libs/easy-pie-chart/1.2.3/jquery.easy-pie-chart.js b/ajax/libs/easy-pie-chart/1.2.3/jquery.easy-pie-chart.js new file mode 100644 index 000000000..888a5acba --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.2.3/jquery.easy-pie-chart.js @@ -0,0 +1,193 @@ +// Generated by CoffeeScript 1.6.3 +/* +Easy pie chart is a jquery plugin to display simple animated pie charts for only one value + +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) +and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + +Built on top of the jQuery library (http://jquery.com) + +@source: http://github.com/rendro/easy-pie-chart/ +@autor: Robert Fleischmann +@version: 1.2.3 + +Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210 +Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script +*/ + +(function($) { + $.easyPieChart = function(el, options) { + var addScaleLine, animateLine, drawLine, easeInOutQuad, rAF, renderBackground, renderScale, renderTrack, + _this = this; + this.el = el; + this.$el = $(el); + this.$el.data("easyPieChart", this); + this.init = function() { + var percent, scaleBy; + _this.options = $.extend({}, $.easyPieChart.defaultOptions, options); + percent = parseInt(_this.$el.data('percent'), 10); + _this.percentage = 0; + _this.canvas = $("").get(0); + _this.$el.append(_this.canvas); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(_this.canvas); + } + _this.ctx = _this.canvas.getContext('2d'); + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + $(_this.canvas).css({ + width: _this.options.size, + height: _this.options.size + }); + _this.canvas.width *= scaleBy; + _this.canvas.height *= scaleBy; + _this.ctx.scale(scaleBy, scaleBy); + } + _this.ctx.translate(_this.options.size / 2, _this.options.size / 2); + _this.ctx.rotate(_this.options.rotate * Math.PI / 180); + _this.$el.addClass('easyPieChart'); + _this.$el.css({ + width: _this.options.size, + height: _this.options.size, + lineHeight: "" + _this.options.size + "px" + }); + _this.update(percent); + return _this; + }; + this.update = function(percent) { + percent = parseFloat(percent) || 0; + if (_this.options.animate === false) { + drawLine(percent); + } else { + animateLine(_this.percentage, percent); + } + return _this; + }; + renderScale = function() { + var i, _i, _results; + _this.ctx.fillStyle = _this.options.scaleColor; + _this.ctx.lineWidth = 1; + _results = []; + for (i = _i = 0; _i <= 24; i = ++_i) { + _results.push(addScaleLine(i)); + } + return _results; + }; + addScaleLine = function(i) { + var offset; + offset = i % 6 === 0 ? 0 : _this.options.size * 0.017; + _this.ctx.save(); + _this.ctx.rotate(i * Math.PI / 12); + _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1); + _this.ctx.restore(); + }; + renderTrack = function() { + var offset; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true); + _this.ctx.closePath(); + _this.ctx.strokeStyle = _this.options.trackColor; + _this.ctx.lineWidth = _this.options.lineWidth; + _this.ctx.stroke(); + }; + renderBackground = function() { + if (_this.options.scaleColor !== false) { + renderScale(); + } + if (_this.options.trackColor !== false) { + renderTrack(); + } + }; + drawLine = function(percent) { + var offset; + renderBackground(); + _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor; + _this.ctx.lineCap = _this.options.lineCap; + _this.ctx.lineWidth = _this.options.lineWidth; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.save(); + _this.ctx.rotate(-Math.PI / 2); + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false); + _this.ctx.stroke(); + _this.ctx.restore(); + }; + rAF = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(); + animateLine = function(from, to) { + var anim, startTime; + _this.options.onStart.call(_this); + _this.percentage = to; + Date.now || (Date.now = function() { + return +(new Date); + }); + startTime = Date.now(); + anim = function() { + var currentValue, process; + process = Date.now() - startTime; + if (process < _this.options.animate) { + rAF(anim); + } + _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size); + renderBackground.call(_this); + currentValue = [easeInOutQuad(process, from, to - from, _this.options.animate)]; + _this.options.onStep.call(_this, currentValue); + drawLine.call(_this, currentValue); + if (process >= _this.options.animate) { + return _this.options.onStop.call(_this, currentValue, to); + } + }; + rAF(anim); + }; + easeInOutQuad = function(t, b, c, d) { + var easeIn, easing; + easeIn = function(t) { + return Math.pow(t, 2); + }; + easing = function(t) { + if (t < 1) { + return easeIn(t); + } else { + return 2 - easeIn((t / 2) * -2 + 2); + } + }; + t /= d / 2; + return c / 2 * easing(t) + b; + }; + return this.init(); + }; + $.easyPieChart.defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f2f2f2', + scaleColor: '#dfe0e0', + lineCap: 'round', + rotate: 0, + size: 110, + lineWidth: 3, + animate: false, + onStart: $.noop, + onStop: $.noop, + onStep: $.noop + }; + $.fn.easyPieChart = function(options) { + return $.each(this, function(i, el) { + var $el, instanceOptions; + $el = $(el); + if (!$el.data('easyPieChart')) { + instanceOptions = $.extend({}, options, $el.data()); + return $el.data('easyPieChart', new $.easyPieChart(el, instanceOptions)); + } + }); + }; + return void 0; +})(jQuery); diff --git a/ajax/libs/easy-pie-chart/1.2.4/jquery.easy-pie-chart.css b/ajax/libs/easy-pie-chart/1.2.4/jquery.easy-pie-chart.css new file mode 100644 index 000000000..0b7be9e60 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.2.4/jquery.easy-pie-chart.css @@ -0,0 +1,10 @@ +.easyPieChart { + position: relative; + text-align: center; +} + +.easyPieChart canvas { + position: absolute; + top: 0; + left: 0; +} diff --git a/ajax/libs/easy-pie-chart/1.2.4/jquery.easy-pie-chart.js b/ajax/libs/easy-pie-chart/1.2.4/jquery.easy-pie-chart.js new file mode 100644 index 000000000..1d0c49438 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.2.4/jquery.easy-pie-chart.js @@ -0,0 +1,199 @@ +// Generated by CoffeeScript 1.6.3 +/* +Easy pie chart is a jquery plugin to display simple animated pie charts for only one value + +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) +and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + +Built on top of the jQuery library (http://jquery.com) + +@source: http://github.com/rendro/easy-pie-chart/ +@autor: Robert Fleischmann +@version: 1.2.4 + +Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210 +Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script +*/ + +(function($) { + $.easyPieChart = function(el, options) { + var addScaleLine, animateLine, drawLine, easeInOutQuad, rAF, renderBackground, renderScale, renderTrack, + _this = this; + this.el = el; + this.$el = $(el); + this.$el.data("easyPieChart", this); + this.init = function() { + var percent, scaleBy; + _this.options = $.extend({}, $.easyPieChart.defaultOptions, options); + percent = parseInt(_this.$el.data('percent'), 10); + _this.percentage = 0; + _this.canvas = $("").get(0); + _this.$el.append(_this.canvas); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(_this.canvas); + } + _this.ctx = _this.canvas.getContext('2d'); + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + $(_this.canvas).css({ + width: _this.options.size, + height: _this.options.size + }); + _this.canvas.width *= scaleBy; + _this.canvas.height *= scaleBy; + _this.ctx.scale(scaleBy, scaleBy); + } + _this.ctx.translate(_this.options.size / 2, _this.options.size / 2); + _this.ctx.rotate(_this.options.rotate * Math.PI / 180); + _this.$el.addClass('easyPieChart'); + _this.$el.css({ + width: _this.options.size, + height: _this.options.size, + lineHeight: "" + _this.options.size + "px" + }); + _this.update(percent); + return _this; + }; + this.update = function(percent) { + percent = parseFloat(percent) || 0; + if (_this.options.animate === false) { + drawLine(percent); + } else { + if (_this.options.delay) { + animateLine(_this.percentage, 0); + setTimeout(function() { + return animateLine(_this.percentage, percent); + }, _this.options.delay); + } else { + animateLine(_this.percentage, percent); + } + } + return _this; + }; + renderScale = function() { + var i, _i, _results; + _this.ctx.fillStyle = _this.options.scaleColor; + _this.ctx.lineWidth = 1; + _results = []; + for (i = _i = 0; _i <= 24; i = ++_i) { + _results.push(addScaleLine(i)); + } + return _results; + }; + addScaleLine = function(i) { + var offset; + offset = i % 6 === 0 ? 0 : _this.options.size * 0.017; + _this.ctx.save(); + _this.ctx.rotate(i * Math.PI / 12); + _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1); + _this.ctx.restore(); + }; + renderTrack = function() { + var offset; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true); + _this.ctx.closePath(); + _this.ctx.strokeStyle = _this.options.trackColor; + _this.ctx.lineWidth = _this.options.lineWidth; + _this.ctx.stroke(); + }; + renderBackground = function() { + if (_this.options.scaleColor !== false) { + renderScale(); + } + if (_this.options.trackColor !== false) { + renderTrack(); + } + }; + drawLine = function(percent) { + var offset; + renderBackground(); + _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor; + _this.ctx.lineCap = _this.options.lineCap; + _this.ctx.lineWidth = _this.options.lineWidth; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.save(); + _this.ctx.rotate(-Math.PI / 2); + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false); + _this.ctx.stroke(); + _this.ctx.restore(); + }; + rAF = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(); + animateLine = function(from, to) { + var anim, startTime; + _this.options.onStart.call(_this); + _this.percentage = to; + Date.now || (Date.now = function() { + return +(new Date); + }); + startTime = Date.now(); + anim = function() { + var currentValue, process; + process = Math.min(Date.now() - startTime, _this.options.animate); + _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size); + renderBackground.call(_this); + currentValue = [easeInOutQuad(process, from, to - from, _this.options.animate)]; + _this.options.onStep.call(_this, currentValue); + drawLine.call(_this, currentValue); + if (process >= _this.options.animate) { + return _this.options.onStop.call(_this, currentValue, to); + } else { + return rAF(anim); + } + }; + rAF(anim); + }; + easeInOutQuad = function(t, b, c, d) { + var easeIn, easing; + easeIn = function(t) { + return Math.pow(t, 2); + }; + easing = function(t) { + if (t < 1) { + return easeIn(t); + } else { + return 2 - easeIn((t / 2) * -2 + 2); + } + }; + t /= d / 2; + return c / 2 * easing(t) + b; + }; + return this.init(); + }; + $.easyPieChart.defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f2f2f2', + scaleColor: '#dfe0e0', + lineCap: 'round', + rotate: 0, + size: 110, + lineWidth: 3, + animate: false, + onStart: $.noop, + onStop: $.noop, + onStep: $.noop + }; + $.fn.easyPieChart = function(options) { + return $.each(this, function(i, el) { + var $el, instanceOptions; + $el = $(el); + if (!$el.data('easyPieChart')) { + instanceOptions = $.extend({}, options, $el.data()); + return $el.data('easyPieChart', new $.easyPieChart(el, instanceOptions)); + } + }); + }; + return void 0; +})(jQuery); diff --git a/ajax/libs/easy-pie-chart/1.2.5/jquery.easy-pie-chart.css b/ajax/libs/easy-pie-chart/1.2.5/jquery.easy-pie-chart.css new file mode 100644 index 000000000..0b7be9e60 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.2.5/jquery.easy-pie-chart.css @@ -0,0 +1,10 @@ +.easyPieChart { + position: relative; + text-align: center; +} + +.easyPieChart canvas { + position: absolute; + top: 0; + left: 0; +} diff --git a/ajax/libs/easy-pie-chart/1.2.5/jquery.easy-pie-chart.js b/ajax/libs/easy-pie-chart/1.2.5/jquery.easy-pie-chart.js new file mode 100644 index 000000000..179264478 --- /dev/null +++ b/ajax/libs/easy-pie-chart/1.2.5/jquery.easy-pie-chart.js @@ -0,0 +1,200 @@ +// Generated by CoffeeScript 1.6.3 +/* +Easy pie chart is a jquery plugin to display simple animated pie charts for only one value + +Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) +and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + +Built on top of the jQuery library (http://jquery.com) + +@source: http://github.com/rendro/easy-pie-chart/ +@autor: Robert Fleischmann +@version: 1.2.5 + +Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210 +Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script +*/ + +(function($) { + $.easyPieChart = function(el, options) { + var addScaleLine, animateLine, drawLine, easeInOutQuad, rAF, renderBackground, renderScale, renderTrack, + _this = this; + this.el = el; + this.$el = $(el); + this.$el.data("easyPieChart", this); + this.init = function() { + var percent, scaleBy; + _this.options = $.extend({}, $.easyPieChart.defaultOptions, options); + percent = parseInt(_this.$el.data('percent'), 10); + _this.percentage = 0; + _this.canvas = $("").get(0); + _this.$el.append(_this.canvas); + if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) { + G_vmlCanvasManager.initElement(_this.canvas); + } + _this.ctx = _this.canvas.getContext('2d'); + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + $(_this.canvas).css({ + width: _this.options.size, + height: _this.options.size + }); + _this.canvas.width *= scaleBy; + _this.canvas.height *= scaleBy; + _this.ctx.scale(scaleBy, scaleBy); + } + _this.ctx.translate(_this.options.size / 2, _this.options.size / 2); + _this.ctx.rotate(_this.options.rotate * Math.PI / 180); + _this.$el.addClass('easyPieChart'); + _this.$el.css({ + width: _this.options.size, + height: _this.options.size, + lineHeight: "" + _this.options.size + "px" + }); + _this.update(percent); + return _this; + }; + this.update = function(percent) { + percent = parseFloat(percent) || 0; + if (_this.options.animate === false) { + drawLine(percent); + } else { + if (_this.options.delay) { + animateLine(_this.percentage, 0); + setTimeout(function() { + return animateLine(_this.percentage, percent); + }, _this.options.delay); + } else { + animateLine(_this.percentage, percent); + } + } + return _this; + }; + renderScale = function() { + var i, _i, _results; + _this.ctx.fillStyle = _this.options.scaleColor; + _this.ctx.lineWidth = 1; + _results = []; + for (i = _i = 0; _i <= 24; i = ++_i) { + _results.push(addScaleLine(i)); + } + return _results; + }; + addScaleLine = function(i) { + var offset; + offset = i % 6 === 0 ? 0 : _this.options.size * 0.017; + _this.ctx.save(); + _this.ctx.rotate(i * Math.PI / 12); + _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1); + _this.ctx.restore(); + }; + renderTrack = function() { + var offset; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true); + _this.ctx.closePath(); + _this.ctx.strokeStyle = _this.options.trackColor; + _this.ctx.lineWidth = _this.options.lineWidth; + _this.ctx.stroke(); + }; + renderBackground = function() { + if (_this.options.scaleColor !== false) { + renderScale(); + } + if (_this.options.trackColor !== false) { + renderTrack(); + } + }; + drawLine = function(percent) { + var offset; + renderBackground(); + _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor; + _this.ctx.lineCap = _this.options.lineCap; + _this.ctx.lineWidth = _this.options.lineWidth; + offset = _this.options.size / 2 - _this.options.lineWidth / 2; + if (_this.options.scaleColor !== false) { + offset -= _this.options.size * 0.08; + } + _this.ctx.save(); + _this.ctx.rotate(-Math.PI / 2); + _this.ctx.beginPath(); + _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false); + _this.ctx.stroke(); + _this.ctx.restore(); + }; + rAF = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(); + animateLine = function(from, to) { + var anim, startTime; + _this.options.onStart.call(_this); + _this.percentage = to; + Date.now || (Date.now = function() { + return +(new Date); + }); + startTime = Date.now(); + anim = function() { + var currentValue, process; + process = Math.min(Date.now() - startTime, _this.options.animate); + _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size); + renderBackground.call(_this); + currentValue = [easeInOutQuad(process, from, to - from, _this.options.animate)]; + _this.options.onStep.call(_this, currentValue); + drawLine.call(_this, currentValue); + if (process >= _this.options.animate) { + return _this.options.onStop.call(_this, currentValue, to); + } else { + return rAF(anim); + } + }; + rAF(anim); + }; + easeInOutQuad = function(t, b, c, d) { + var easeIn, easing; + easeIn = function(t) { + return Math.pow(t, 2); + }; + easing = function(t) { + if (t < 1) { + return easeIn(t); + } else { + return 2 - easeIn((t / 2) * -2 + 2); + } + }; + t /= d / 2; + return c / 2 * easing(t) + b; + }; + return this.init(); + }; + $.easyPieChart.defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f2f2f2', + scaleColor: '#dfe0e0', + lineCap: 'round', + rotate: 0, + size: 110, + lineWidth: 3, + animate: false, + delay: false, + onStart: $.noop, + onStop: $.noop, + onStep: $.noop + }; + $.fn.easyPieChart = function(options) { + return $.each(this, function(i, el) { + var $el, instanceOptions; + $el = $(el); + if (!$el.data('easyPieChart')) { + instanceOptions = $.extend({}, options, $el.data()); + return $el.data('easyPieChart', new $.easyPieChart(el, instanceOptions)); + } + }); + }; + return void 0; +})(jQuery); diff --git a/ajax/libs/easy-pie-chart/2.0.0/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.0/angular.easypiechart.js new file mode 100644 index 000000000..f089c9ee7 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.0/angular.easypiechart.js @@ -0,0 +1,273 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.0 + **/ + +(function() { +// Angular directives for easyPieChart +if ( (typeof(angular) === 'object') && (typeof(angular.version) === 'object')){ + angular.module('easypiechart',[]) + .directive('easypiechart', function($parse) { + return { + restrict: 'A', + require: '?ngModel', + link: function (scope, element, attrs) { + var options = {}; + var fx = attrs.easypiechart; + if (fx.length > 0) { + fx = fx.split(';'); // CSS like syntax + var REkey = new RegExp('[a-z]+', 'i'); + var REvalue = new RegExp(':.+'); + // Parse Effects + for (var i in fx) { + var value = fx[i].match(REkey); + var key = fx[i].match(REvalue); + value = value[0]; + key = key[0].substring(1); + if (!isNaN(parseInt(key, 10))) { + options[value] = parseFloat(key); + } else{ + switch (key) { + case 'true': + options[value] = true; + break; + case 'false': + options[value] = false; + break; + default: + options[value] = key; + } + } + } + } + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + clearTimeout(timer); + timer = setTimeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + }; + }); +} else{ + console.log('Angular not detected.'); +} + + +var CanvasRenderer = function(el, options) { + var self = this; + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i >= 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + this.clear(); + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth);; + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.0/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.0/angular.easypiechart.min.js new file mode 100644 index 000000000..73c246e6d --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.0/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.0 + **/ +!function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d){var e={},f=d.easypiechart;if(f.length>0){f=f.split(";");var g=new RegExp("[a-z]+","i"),h=new RegExp(":.+");for(var i in f){var j=f[i].match(g),k=f[i].match(h);if(j=j[0],k=k[0].substring(1),isNaN(parseInt(k,10)))switch(k){case"true":e[j]=!0;break;case"false":e[j]=!1;break;default:e[j]=k}else e[j]=parseFloat(k)}}var l=new b(c[0],e);a.percent&&l.update(a.percent);var m=null;a.$watch("percent",function(b,c){l.update(c),clearTimeout(m),m=setTimeout(function(){l.update(a.percent)},1e3/60)})}}}):console.log("Angular not detected.");var a=function(a,b){var c=document.createElement("canvas"),d=c.getContext("2d");if(c.width=c.height=b.size,a.appendChild(c),window.devicePixelRatio>1){var e=window.devicePixelRatio;c.style.width=c.style.height=[b.size,"px"].join(""),c.width=c.height=b.size*e,d.scale(e,e)}d.translate(b.size/2,b.size/2),d.rotate((-0.5+b.rotate/180)*Math.PI);var f=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(f-=b.scaleLength+2);var g=function(a,b,c){c=Math.min(Math.max(0,c||1),1),d.beginPath(),d.arc(0,0,f,0,2*Math.PI*c,!1),d.strokeStyle=a,d.lineWidth=b,d.stroke()},h=function(){var a,c,e=24;d.lineWidth=1,d.fillStyle=b.scaleColor,d.save();for(var e=24;e>=0;--e)0===e%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),d.fillRect(-b.size/2+a,0,c,1),d.rotate(Math.PI/12);d.restore()};Date.now=Date.now||function(){return+new Date};var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}();this.clear=function(){d.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){this.clear(),b.scaleColor&&h(),b.trackColor&&g(b.trackColor,b.lineWidth),d.lineCap=b.lineCap;var c;c="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&g(c,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):i(e)}.bind(this);i(e)}.bind(this)},b=function(b,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:a,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=b,this.options=f;for(var a in e)e.hasOwnProperty(a)&&(f[a]=c&&"undefined"!=typeof c[a]?c[a]:e[a],"function"==typeof f[a]&&(f[a]=f[a].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(b,f),d.draw(g),b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()}}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.0/easypiechart.js b/ajax/libs/easy-pie-chart/2.0.0/easypiechart.js new file mode 100644 index 000000000..ccd9c04d0 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.0/easypiechart.js @@ -0,0 +1,211 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.0 + **/ + +(function() { +var CanvasRenderer = function(el, options) { + var self = this; + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i >= 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + this.clear(); + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth);; + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +window.EasyPieChart = EasyPieChart;}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.0/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.0/easypiechart.min.js new file mode 100644 index 000000000..ff2cf5de3 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.0/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.0 + **/ +!function(){var a=function(a,b){var c=document.createElement("canvas"),d=c.getContext("2d");if(c.width=c.height=b.size,a.appendChild(c),window.devicePixelRatio>1){var e=window.devicePixelRatio;c.style.width=c.style.height=[b.size,"px"].join(""),c.width=c.height=b.size*e,d.scale(e,e)}d.translate(b.size/2,b.size/2),d.rotate((-0.5+b.rotate/180)*Math.PI);var f=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(f-=b.scaleLength+2);var g=function(a,b,c){c=Math.min(Math.max(0,c||1),1),d.beginPath(),d.arc(0,0,f,0,2*Math.PI*c,!1),d.strokeStyle=a,d.lineWidth=b,d.stroke()},h=function(){var a,c,e=24;d.lineWidth=1,d.fillStyle=b.scaleColor,d.save();for(var e=24;e>=0;--e)0===e%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),d.fillRect(-b.size/2+a,0,c,1),d.rotate(Math.PI/12);d.restore()};Date.now=Date.now||function(){return+new Date};var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}();this.clear=function(){d.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){this.clear(),b.scaleColor&&h(),b.trackColor&&g(b.trackColor,b.lineWidth),d.lineCap=b.lineCap;var c;c="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&g(c,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):i(e)}.bind(this);i(e)}.bind(this)},b=function(b,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:a,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=b,this.options=f;for(var a in e)e.hasOwnProperty(a)&&(f[a]=c&&"undefined"!=typeof c[a]?c[a]:e[a],"function"==typeof f[a]&&(f[a]=f[a].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(b,f),d.draw(g),b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()};window.EasyPieChart=b}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.0/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.0/jquery.easypiechart.js new file mode 100644 index 000000000..b6e22b885 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.0/jquery.easypiechart.js @@ -0,0 +1,219 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.0 + **/ + +(function($) { +var CanvasRenderer = function(el, options) { + var self = this; + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i >= 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + this.clear(); + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth);; + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + if (!$.data(this, 'easyPieChart')) { + $.data(this, 'easyPieChart', new EasyPieChart(this, options)); + } + }); +}; + +}(jQuery)); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.0/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.0/jquery.easypiechart.min.js new file mode 100644 index 000000000..d4d9fa54a --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.0/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.0 + **/ +!function(a){var b=function(a,b){var c=document.createElement("canvas"),d=c.getContext("2d");if(c.width=c.height=b.size,a.appendChild(c),window.devicePixelRatio>1){var e=window.devicePixelRatio;c.style.width=c.style.height=[b.size,"px"].join(""),c.width=c.height=b.size*e,d.scale(e,e)}d.translate(b.size/2,b.size/2),d.rotate((-0.5+b.rotate/180)*Math.PI);var f=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(f-=b.scaleLength+2);var g=function(a,b,c){c=Math.min(Math.max(0,c||1),1),d.beginPath(),d.arc(0,0,f,0,2*Math.PI*c,!1),d.strokeStyle=a,d.lineWidth=b,d.stroke()},h=function(){var a,c,e=24;d.lineWidth=1,d.fillStyle=b.scaleColor,d.save();for(var e=24;e>=0;--e)0===e%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),d.fillRect(-b.size/2+a,0,c,1),d.rotate(Math.PI/12);d.restore()};Date.now=Date.now||function(){return+new Date};var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}();this.clear=function(){d.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){this.clear(),b.scaleColor&&h(),b.trackColor&&g(b.trackColor,b.lineWidth),d.lineCap=b.lineCap;var c;c="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&g(c,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):i(e)}.bind(this);i(e)}.bind(this)},c=function(a,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:b,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=a,this.options=f;for(var b in e)e.hasOwnProperty(b)&&(f[b]=c&&"undefined"!=typeof c[b]?c[b]:e[b],"function"==typeof f[b]&&(f[b]=f[b].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(a,f),d.draw(g),a.dataset.percent&&this.update(parseInt(a.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()};a.fn.easyPieChart=function(b){return this.each(function(){a.data(this,"easyPieChart")||a.data(this,"easyPieChart",new c(this,b))})}}(jQuery); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.1/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.1/angular.easypiechart.js new file mode 100644 index 000000000..bbebfac78 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.1/angular.easypiechart.js @@ -0,0 +1,279 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.1 + **/ + +(function() { +// Angular directives for easyPieChart +if ( (typeof(angular) === 'object') && (typeof(angular.version) === 'object')){ + angular.module('easypiechart',[]) + .directive('easypiechart', function($parse) { + return { + restrict: 'A', + require: '?ngModel', + link: function (scope, element, attrs) { + var options = {}; + var fx = attrs.easypiechart; + if (fx.length > 0) { + fx = fx.split(';'); // CSS like syntax + var REkey = new RegExp('[a-z]+', 'i'); + var REvalue = new RegExp(':.+'); + // Parse Effects + for (var i in fx) { + var value = fx[i].match(REkey); + var key = fx[i].match(REvalue); + value = value[0]; + key = key[0].substring(1); + if (!isNaN(parseInt(key, 10))) { + options[value] = parseFloat(key); + } else{ + switch (key) { + case 'true': + options[value] = true; + break; + case 'false': + options[value] = false; + break; + default: + options[value] = key; + } + } + } + } + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + clearTimeout(timer); + timer = setTimeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + }; + }); +} else{ + console.log('Angular not detected.'); +} + + +var CanvasRenderer = function(el, options) { + var self = this; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i >= 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + this.clear(); + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth);; + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.1/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.1/angular.easypiechart.min.js new file mode 100644 index 000000000..bf5410ab4 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.1/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.1 + **/ +!function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d){var e={},f=d.easypiechart;if(f.length>0){f=f.split(";");var g=new RegExp("[a-z]+","i"),h=new RegExp(":.+");for(var i in f){var j=f[i].match(g),k=f[i].match(h);if(j=j[0],k=k[0].substring(1),isNaN(parseInt(k,10)))switch(k){case"true":e[j]=!0;break;case"false":e[j]=!1;break;default:e[j]=k}else e[j]=parseFloat(k)}}var l=new b(c[0],e);a.percent&&l.update(a.percent);var m=null;a.$watch("percent",function(b,c){l.update(c),clearTimeout(m),m=setTimeout(function(){l.update(a.percent)},1e3/60)})}}}):console.log("Angular not detected.");var a=function(a,b){var c=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(c);var d=c.getContext("2d");if(c.width=c.height=b.size,a.appendChild(c),window.devicePixelRatio>1){var e=window.devicePixelRatio;c.style.width=c.style.height=[b.size,"px"].join(""),c.width=c.height=b.size*e,d.scale(e,e)}d.translate(b.size/2,b.size/2),d.rotate((-0.5+b.rotate/180)*Math.PI);var f=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(f-=b.scaleLength+2);var g=function(a,b,c){c=Math.min(Math.max(0,c||1),1),d.beginPath(),d.arc(0,0,f,0,2*Math.PI*c,!1),d.strokeStyle=a,d.lineWidth=b,d.stroke()},h=function(){var a,c,e=24;d.lineWidth=1,d.fillStyle=b.scaleColor,d.save();for(var e=24;e>=0;--e)0===e%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),d.fillRect(-b.size/2+a,0,c,1),d.rotate(Math.PI/12);d.restore()};Date.now=Date.now||function(){return+new Date};var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}();this.clear=function(){d.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){this.clear(),b.scaleColor&&h(),b.trackColor&&g(b.trackColor,b.lineWidth),d.lineCap=b.lineCap;var c;c="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&g(c,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):i(e)}.bind(this);i(e)}.bind(this)},b=function(b,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:a,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=b,this.options=f;for(var a in e)e.hasOwnProperty(a)&&(f[a]=c&&"undefined"!=typeof c[a]?c[a]:e[a],"function"==typeof f[a]&&(f[a]=f[a].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(b,f),d.draw(g),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()}}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.1/easypiechart.js b/ajax/libs/easy-pie-chart/2.0.1/easypiechart.js new file mode 100644 index 000000000..652d2b797 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.1/easypiechart.js @@ -0,0 +1,217 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.1 + **/ + +(function() { +var CanvasRenderer = function(el, options) { + var self = this; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i >= 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + this.clear(); + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth);; + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +window.EasyPieChart = EasyPieChart;}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.1/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.1/easypiechart.min.js new file mode 100644 index 000000000..c16c804da --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.1/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.1 + **/ +!function(){var a=function(a,b){var c=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(c);var d=c.getContext("2d");if(c.width=c.height=b.size,a.appendChild(c),window.devicePixelRatio>1){var e=window.devicePixelRatio;c.style.width=c.style.height=[b.size,"px"].join(""),c.width=c.height=b.size*e,d.scale(e,e)}d.translate(b.size/2,b.size/2),d.rotate((-0.5+b.rotate/180)*Math.PI);var f=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(f-=b.scaleLength+2);var g=function(a,b,c){c=Math.min(Math.max(0,c||1),1),d.beginPath(),d.arc(0,0,f,0,2*Math.PI*c,!1),d.strokeStyle=a,d.lineWidth=b,d.stroke()},h=function(){var a,c,e=24;d.lineWidth=1,d.fillStyle=b.scaleColor,d.save();for(var e=24;e>=0;--e)0===e%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),d.fillRect(-b.size/2+a,0,c,1),d.rotate(Math.PI/12);d.restore()};Date.now=Date.now||function(){return+new Date};var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}();this.clear=function(){d.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){this.clear(),b.scaleColor&&h(),b.trackColor&&g(b.trackColor,b.lineWidth),d.lineCap=b.lineCap;var c;c="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&g(c,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):i(e)}.bind(this);i(e)}.bind(this)},b=function(b,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:a,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=b,this.options=f;for(var a in e)e.hasOwnProperty(a)&&(f[a]=c&&"undefined"!=typeof c[a]?c[a]:e[a],"function"==typeof f[a]&&(f[a]=f[a].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(b,f),d.draw(g),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()};window.EasyPieChart=b}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.1/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.1/jquery.easypiechart.js new file mode 100644 index 000000000..e9944a7fa --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.1/jquery.easypiechart.js @@ -0,0 +1,225 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.1 + **/ + +(function($) { +var CanvasRenderer = function(el, options) { + var self = this; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i >= 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + this.clear(); + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth);; + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + if (!$.data(this, 'easyPieChart')) { + $.data(this, 'easyPieChart', new EasyPieChart(this, options)); + } + }); +}; + +}(jQuery)); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.1/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.1/jquery.easypiechart.min.js new file mode 100644 index 000000000..afb6ff4bc --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.1/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.1 + **/ +!function(a){var b=function(a,b){var c=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(c);var d=c.getContext("2d");if(c.width=c.height=b.size,a.appendChild(c),window.devicePixelRatio>1){var e=window.devicePixelRatio;c.style.width=c.style.height=[b.size,"px"].join(""),c.width=c.height=b.size*e,d.scale(e,e)}d.translate(b.size/2,b.size/2),d.rotate((-0.5+b.rotate/180)*Math.PI);var f=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(f-=b.scaleLength+2);var g=function(a,b,c){c=Math.min(Math.max(0,c||1),1),d.beginPath(),d.arc(0,0,f,0,2*Math.PI*c,!1),d.strokeStyle=a,d.lineWidth=b,d.stroke()},h=function(){var a,c,e=24;d.lineWidth=1,d.fillStyle=b.scaleColor,d.save();for(var e=24;e>=0;--e)0===e%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),d.fillRect(-b.size/2+a,0,c,1),d.rotate(Math.PI/12);d.restore()};Date.now=Date.now||function(){return+new Date};var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}();this.clear=function(){d.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){this.clear(),b.scaleColor&&h(),b.trackColor&&g(b.trackColor,b.lineWidth),d.lineCap=b.lineCap;var c;c="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&g(c,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):i(e)}.bind(this);i(e)}.bind(this)},c=function(a,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:b,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=a,this.options=f;for(var b in e)e.hasOwnProperty(b)&&(f[b]=c&&"undefined"!=typeof c[b]?c[b]:e[b],"function"==typeof f[b]&&(f[b]=f[b].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(a,f),d.draw(g),a.dataset&&a.dataset.percent&&this.update(parseInt(a.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()};a.fn.easyPieChart=function(b){return this.each(function(){a.data(this,"easyPieChart")||a.data(this,"easyPieChart",new c(this,b))})}}(jQuery); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.2/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.2/angular.easypiechart.js new file mode 100644 index 000000000..676f95e56 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.2/angular.easypiechart.js @@ -0,0 +1,298 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.2 + **/ + +(function() { +// Angular directives for easyPieChart +if ( (typeof(angular) === 'object') && (typeof(angular.version) === 'object')){ + angular.module('easypiechart',[]) + .directive('easypiechart', function($parse) { + return { + restrict: 'A', + require: '?ngModel', + link: function (scope, element, attrs) { + var options = {}; + var fx = attrs.easypiechart; + if (fx.length > 0) { + fx = fx.split(';'); // CSS like syntax + var REkey = new RegExp('[a-z]+', 'i'); + var REvalue = new RegExp(':.+'); + // Parse Effects + for (var i in fx) { + var value = fx[i].match(REkey); + var key = fx[i].match(REvalue); + value = value[0]; + key = key[0].substring(1); + if (!isNaN(parseInt(key, 10))) { + options[value] = parseFloat(key); + } else{ + switch (key) { + case 'true': + options[value] = true; + break; + case 'false': + options[value] = false; + break; + default: + options[value] = key; + } + } + } + } + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + clearTimeout(timer); + timer = setTimeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + }; + }); +} else{ + console.log('Angular not detected.'); +} + + +var CanvasRenderer = function(el, options) { + var self = this; + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size, options.size); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.2/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.2/angular.easypiechart.min.js new file mode 100644 index 000000000..bd6c46d1e --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.2/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.2 + **/ +!function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d){var e={},f=d.easypiechart;if(f.length>0){f=f.split(";");var g=new RegExp("[a-z]+","i"),h=new RegExp(":.+");for(var i in f){var j=f[i].match(g),k=f[i].match(h);if(j=j[0],k=k[0].substring(1),isNaN(parseInt(k,10)))switch(k){case"true":e[j]=!0;break;case"false":e[j]=!1;break;default:e[j]=k}else e[j]=parseFloat(k)}}var l=new b(c[0],e);a.percent&&l.update(a.percent);var m=null;a.$watch("percent",function(b,c){l.update(c),clearTimeout(m),m=setTimeout(function(){l.update(a.percent)},1e3/60)})}}}):console.log("Angular not detected.");var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");if(d.width=d.height=b.size,a.appendChild(d),window.devicePixelRatio>1){var f=window.devicePixelRatio;d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)}e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2);var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()};Date.now=Date.now||function(){return+new Date};var j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size,b.size)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:a,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=b,this.options=f;for(var a in e)e.hasOwnProperty(a)&&(f[a]=c&&"undefined"!=typeof c[a]?c[a]:e[a],"function"==typeof f[a]&&(f[a]=f[a].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(b,f),d.draw(g),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()}}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.2/easypiechart.js b/ajax/libs/easy-pie-chart/2.0.2/easypiechart.js new file mode 100644 index 000000000..8c6173dc4 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.2/easypiechart.js @@ -0,0 +1,236 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.2 + **/ + +(function() { +var CanvasRenderer = function(el, options) { + var self = this; + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size, options.size); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +window.EasyPieChart = EasyPieChart;}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.2/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.2/easypiechart.min.js new file mode 100644 index 000000000..2931ec149 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.2/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.2 + **/ +!function(){var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");if(d.width=d.height=b.size,a.appendChild(d),window.devicePixelRatio>1){var f=window.devicePixelRatio;d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)}e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2);var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()};Date.now=Date.now||function(){return+new Date};var j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size,b.size)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:a,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=b,this.options=f;for(var a in e)e.hasOwnProperty(a)&&(f[a]=c&&"undefined"!=typeof c[a]?c[a]:e[a],"function"==typeof f[a]&&(f[a]=f[a].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(b,f),d.draw(g),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()};window.EasyPieChart=b}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.2/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.2/jquery.easypiechart.js new file mode 100644 index 000000000..81ce84220 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.2/jquery.easypiechart.js @@ -0,0 +1,244 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.2 + **/ + +(function($) { +var CanvasRenderer = function(el, options) { + var self = this; + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + if (window.devicePixelRatio > 1) { + var scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + Date.now = Date.now || function() { + return +(new Date()); + }; + + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size, options.size); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + renderer: CanvasRenderer, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + var options = {}; + var renderer; + var currentValue = 0; + + var init = function() { + + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + renderer = new options.renderer(el, options); + + // initial draw + renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + + }.bind(this); + + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + renderer.animate(currentValue, newValue); + } else { + renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + if (!$.data(this, 'easyPieChart')) { + $.data(this, 'easyPieChart', new EasyPieChart(this, options)); + } + }); +}; + +}(jQuery)); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.2/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.2/jquery.easypiechart.min.js new file mode 100644 index 000000000..da77c7c4d --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.2/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.2 + **/ +!function(a){var b=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");if(d.width=d.height=b.size,a.appendChild(d),window.devicePixelRatio>1){var f=window.devicePixelRatio;d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)}e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2);var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()};Date.now=Date.now||function(){return+new Date};var j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size,b.size)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d,e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,renderer:b,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}},f={},g=0,h=function(){this.el=a,this.options=f;for(var b in e)e.hasOwnProperty(b)&&(f[b]=c&&"undefined"!=typeof c[b]?c[b]:e[b],"function"==typeof f[b]&&(f[b]=f[b].bind(this)));f.easing="string"==typeof f.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[f.easing])?jQuery.easing[f.easing]:e.easing,d=new f.renderer(a,f),d.draw(g),a.dataset&&a.dataset.percent&&this.update(parseInt(a.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),f.animate?d.animate(g,a):d.draw(a),g=a,this}.bind(this),h()};a.fn.easyPieChart=function(b){return this.each(function(){a.data(this,"easyPieChart")||a.data(this,"easyPieChart",new c(this,b))})}}(jQuery); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.3/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.3/angular.easypiechart.js new file mode 100644 index 000000000..a1bab1271 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.3/angular.easypiechart.js @@ -0,0 +1,345 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.3 + **/ + +(function() { +// Angular directives for easyPieChart +if ( (typeof(angular) === 'object') && (typeof(angular.version) === 'object')){ + angular.module('easypiechart',[]) + .directive('easypiechart', function($parse) { + return { + restrict: 'A', + require: '?ngModel', + link: function (scope, element, attrs) { + var options = {}; + var fx = attrs.easypiechart; + if (fx.length > 0) { + fx = fx.split(';'); // CSS like syntax + var REkey = new RegExp('[a-z]+', 'i'); + var REvalue = new RegExp(':.+'); + // Parse Effects + for (var i in fx) { + var value = fx[i].match(REkey); + var key = fx[i].match(REvalue); + value = value[0]; + key = key[0].substring(1); + if (!isNaN(parseInt(key, 10))) { + options[value] = parseFloat(key); + } else{ + switch (key) { + case 'true': + options[value] = true; + break; + case 'false': + options[value] = false; + break; + default: + options[value] = key; + } + } + } + } + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + clearTimeout(timer); + timer = setTimeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + }; + }); +} else{ + console.log('Angular not detected.'); +} + + +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.3/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.3/angular.easypiechart.min.js new file mode 100644 index 000000000..f265c8cd1 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.3/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.3 + **/ +!function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d){var e={},f=d.easypiechart;if(f.length>0){f=f.split(";");var g=new RegExp("[a-z]+","i"),h=new RegExp(":.+");for(var i in f){var j=f[i].match(g),k=f[i].match(h);if(j=j[0],k=k[0].substring(1),isNaN(parseInt(k,10)))switch(k){case"true":e[j]=!0;break;case"false":e[j]=!1;break;default:e[j]=k}else e[j]=parseFloat(k)}}var l=new b(c[0],e);a.percent&&l.update(a.percent);var m=null;a.$watch("percent",function(b,c){l.update(c),clearTimeout(m),m=setTimeout(function(){l.update(a.percent)},1e3/60)})}}}):console.log("Angular not detected.");var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()}}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.3/easypiechart.js b/ajax/libs/easy-pie-chart/2.0.3/easypiechart.js new file mode 100644 index 000000000..e5e9efdcd --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.3/easypiechart.js @@ -0,0 +1,283 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.3 + **/ + +(function() { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +window.EasyPieChart = EasyPieChart;}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.3/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.3/easypiechart.min.js new file mode 100644 index 000000000..72afa5019 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.3/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.3 + **/ +!function(){var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};window.EasyPieChart=b}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.3/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.3/jquery.easypiechart.js new file mode 100644 index 000000000..0e0b6da2b --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.3/jquery.easypiechart.js @@ -0,0 +1,291 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.3 + **/ + +(function($) { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + if (!$.data(this, 'easyPieChart')) { + $.data(this, 'easyPieChart', new EasyPieChart(this, options)); + } + }); +}; + +}(jQuery)); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.3/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.3/jquery.easypiechart.min.js new file mode 100644 index 000000000..efcf01f31 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.3/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.3 + **/ +!function(a){var b=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent&&this.update(parseInt(a.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};a.fn.easyPieChart=function(b){return this.each(function(){a.data(this,"easyPieChart")||a.data(this,"easyPieChart",new c(this,b))})}}(jQuery); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.4/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.4/angular.easypiechart.js new file mode 100644 index 000000000..b6de19b1a --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.4/angular.easypiechart.js @@ -0,0 +1,348 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.4 + **/ + +(function() { +// Angular directives for easyPieChart +if ( (typeof(angular) === 'object') && (typeof(angular.version) === 'object')){ + angular.module('easypiechart',[]) + .directive('easypiechart', ['$timeout', function($timeout) { + return { + restrict: 'A', + require: '?ngModel', + scope: { + percent: '=ngPercent' + }, + link: function (scope, element, attrs) { + var options = {}; + var fx = attrs.easypiechart; + if (fx.length > 0) { + fx = fx.split(';'); // CSS like syntax + var REkey = new RegExp('[a-z]+', 'i'); + var REvalue = new RegExp(':.+'); + // Parse Effects + for (var i in fx) { + var value = fx[i].match(REkey); + var key = fx[i].match(REvalue); + value = value[0]; + key = key[0].substring(1); + if (!isNaN(parseInt(key, 10))) { + options[value] = parseFloat(key); + } else{ + switch (key) { + case 'true': + options[value] = true; + break; + case 'false': + options[value] = false; + break; + default: + options[value] = key; + } + } + } + } + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + timer.cancel(); + timer = $timeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + } + }]); +} else{ + console.log('Angular not detected.'); +} + + +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.4/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.4/angular.easypiechart.min.js new file mode 100644 index 000000000..5d64d3ac4 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.4/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.4 + **/ +!function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",["$timeout",function(a){return{restrict:"A",require:"?ngModel",scope:{percent:"=ngPercent"},link:function(c,d,e){var f={},g=e.easypiechart;if(g.length>0){g=g.split(";");var h=new RegExp("[a-z]+","i"),i=new RegExp(":.+");for(var j in g){var k=g[j].match(h),l=g[j].match(i);if(k=k[0],l=l[0].substring(1),isNaN(parseInt(l,10)))switch(l){case"true":f[k]=!0;break;case"false":f[k]=!1;break;default:f[k]=l}else f[k]=parseFloat(l)}}var m=new b(d[0],f);c.percent&&m.update(c.percent);var n=null;c.$watch("percent",function(b,d){m.update(d),n.cancel(),n=a(function(){m.update(c.percent)},1e3/60)})}}}]):console.log("Angular not detected.");var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()}}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.4/easypiechart.js b/ajax/libs/easy-pie-chart/2.0.4/easypiechart.js new file mode 100644 index 000000000..1cf3ce867 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.4/easypiechart.js @@ -0,0 +1,283 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.4 + **/ + +(function() { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +window.EasyPieChart = EasyPieChart;}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.4/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.4/easypiechart.min.js new file mode 100644 index 000000000..e6b88d677 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.4/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.4 + **/ +!function(){var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};window.EasyPieChart=b}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.4/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.4/jquery.easypiechart.js new file mode 100644 index 000000000..f0c58994d --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.4/jquery.easypiechart.js @@ -0,0 +1,291 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.4 + **/ + +(function($) { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + if (!$.data(this, 'easyPieChart')) { + $.data(this, 'easyPieChart', new EasyPieChart(this, options)); + } + }); +}; + +}(jQuery)); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.4/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.4/jquery.easypiechart.min.js new file mode 100644 index 000000000..af429a1e8 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.4/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.4 + **/ +!function(a){var b=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent&&this.update(parseInt(a.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};a.fn.easyPieChart=function(b){return this.each(function(){a.data(this,"easyPieChart")||a.data(this,"easyPieChart",new c(this,b))})}}(jQuery); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.5/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.5/angular.easypiechart.js new file mode 100644 index 000000000..61d07fc79 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.5/angular.easypiechart.js @@ -0,0 +1,350 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.5 + **/ + +(function() { +// Angular directives for easyPieChart +if ( (typeof(angular) === 'object') && (typeof(angular.version) === 'object')){ + angular.module('easypiechart',[]) + .directive('easypiechart', ['$timeout', function($timeout) { + return { + restrict: 'A', + require: '?ngModel', + scope: { + percent: '=ngPercent' + }, + link: function (scope, element, attrs) { + var options = {}; + var fx = attrs.easypiechart; + if (fx.length > 0) { + fx = fx.split(';'); // CSS like syntax + var REkey = new RegExp('[a-z]+', 'i'); + var REvalue = new RegExp(':.+'); + // Parse Effects + for (var i in fx) { + var value = fx[i].match(REkey); + var key = fx[i].match(REvalue); + value = value[0]; + key = key[0].substring(1); + if (!isNaN(parseInt(key, 10))) { + options[value] = parseFloat(key); + } else{ + switch (key) { + case 'true': + options[value] = true; + break; + case 'false': + options[value] = false; + break; + default: + options[value] = key; + } + } + } + } + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + if(timer) { + $timeout.cancel(timer); + } + timer = $timeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + } + }]); +} else{ + console.log('Angular not detected.'); +} + + +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.5/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.5/angular.easypiechart.min.js new file mode 100644 index 000000000..e9616ab65 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.5/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.5 + **/ +!function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",["$timeout",function(a){return{restrict:"A",require:"?ngModel",scope:{percent:"=ngPercent"},link:function(c,d,e){var f={},g=e.easypiechart;if(g.length>0){g=g.split(";");var h=new RegExp("[a-z]+","i"),i=new RegExp(":.+");for(var j in g){var k=g[j].match(h),l=g[j].match(i);if(k=k[0],l=l[0].substring(1),isNaN(parseInt(l,10)))switch(l){case"true":f[k]=!0;break;case"false":f[k]=!1;break;default:f[k]=l}else f[k]=parseFloat(l)}}var m=new b(d[0],f);c.percent&&m.update(c.percent);var n=null;c.$watch("percent",function(b,d){m.update(d),n&&a.cancel(n),n=a(function(){m.update(c.percent)},1e3/60)})}}}]):console.log("Angular not detected.");var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()}}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.5/easypiechart.js b/ajax/libs/easy-pie-chart/2.0.5/easypiechart.js new file mode 100644 index 000000000..460de0fda --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.5/easypiechart.js @@ -0,0 +1,283 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.5 + **/ + +(function() { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +window.EasyPieChart = EasyPieChart;}()); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.5/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.5/easypiechart.min.js new file mode 100644 index 000000000..efae453c1 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.5/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.5 + **/ +!function(){var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent&&this.update(parseInt(b.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};window.EasyPieChart=b}(); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.5/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.0.5/jquery.easypiechart.js new file mode 100644 index 000000000..47e25f5ad --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.5/jquery.easypiechart.js @@ -0,0 +1,291 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.5 + **/ + +(function($) { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseInt(el.dataset.percent, 10)); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseInt(newValue, 10); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + if (!$.data(this, 'easyPieChart')) { + $.data(this, 'easyPieChart', new EasyPieChart(this, options)); + } + }); +}; + +}(jQuery)); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.0.5/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.0.5/jquery.easypiechart.min.js new file mode 100644 index 000000000..7af96a7ce --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.0.5/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.0.5 + **/ +!function(a){var b=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return(b/=e/2)<1?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent&&this.update(parseInt(a.dataset.percent,10))}.bind(this);this.update=function(a){return a=parseInt(a,10),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};a.fn.easyPieChart=function(b){return this.each(function(){a.data(this,"easyPieChart")||a.data(this,"easyPieChart",new c(this,b))})}}(jQuery); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.0/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.0/angular.easypiechart.js new file mode 100644 index 000000000..d84d10883 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.0/angular.easypiechart.js @@ -0,0 +1,350 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.0 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('anuglar')); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', ['anuglar'], factory); + } + else { + factory(root.anuglar); + } +}(this, function(anuglar) { +// Angular directives for easyPieChart +if ((typeof(angular) === 'object') && (typeof(angular.version) === 'object')) { + angular.module('easypiechart',[]) + .directive('easypiechart', ['$timeout', function($timeout) { + return { + restrict: 'A', + require: '?ngModel', + scope: { + percent: '=', + options: '=' + }, + link: function (scope, element, attrs) { + var options = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000 + }; + angular.extend(options, scope.options); + + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + if(timer) { + $timeout.cancel(timer); + } + timer = $timeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + }; + }]); +} else{ + console.log('Angular not detected.'); +} + +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.0/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.0/angular.easypiechart.min.js new file mode 100644 index 000000000..b77ab616d --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.0/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.0 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("anuglar")):"function"==typeof define&&define.amd?define("EasyPieChart",["anuglar"],b):b(a.anuglar)}(this,function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",["$timeout",function(a){return{restrict:"A",require:"?ngModel",scope:{percent:"=",options:"="},link:function(c,d){var e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3};angular.extend(e,c.options);var f=new b(d[0],e);c.percent&&f.update(c.percent);var g=null;c.$watch("percent",function(b,d){f.update(d),g&&a.cancel(g),g=a(function(){f.update(c.percent)},1e3/60)})}}}]):console.log("Angular not detected.");var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.0/easypiechart.js b/ajax/libs/easy-pie-chart/2.1.0/easypiechart.js new file mode 100644 index 000000000..405dd3345 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.0/easypiechart.js @@ -0,0 +1,299 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.0 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', [], factory); + } + else { + root['EasyPieChart'] = factory(); + } +}(this, function() { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + + return EasyPieChart; +})); diff --git a/ajax/libs/easy-pie-chart/2.1.0/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.0/easypiechart.min.js new file mode 100644 index 000000000..491ffcaad --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.0/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.0 + **/ +!function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define("EasyPieChart",[],b):a.EasyPieChart=b()}(this,function(){var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};return b}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.0/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.0/jquery.easypiechart.js new file mode 100644 index 000000000..1255a5762 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.0/jquery.easypiechart.js @@ -0,0 +1,306 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.0 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('jQuery')); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', ['jQuery'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + if (!$.data(this, 'easyPieChart')) { + $.data(this, 'easyPieChart', new EasyPieChart(this, options)); + } + }); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.0/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.0/jquery.easypiechart.min.js new file mode 100644 index 000000000..7c75a07c3 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.0/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.0 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("jQuery")):"function"==typeof define&&define.amd?define("EasyPieChart",["jQuery"],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};a.fn.easyPieChart=function(b){return this.each(function(){a.data(this,"easyPieChart")||a.data(this,"easyPieChart",new c(this,b))})}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.1/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.1/angular.easypiechart.js new file mode 100644 index 000000000..074b1e183 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.1/angular.easypiechart.js @@ -0,0 +1,350 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.1 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('anuglar')); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', ['anuglar'], factory); + } + else { + factory(root.anuglar); + } +}(this, function(anuglar) { +// Angular directives for easyPieChart +if ((typeof(angular) === 'object') && (typeof(angular.version) === 'object')) { + angular.module('easypiechart',[]) + .directive('easypiechart', ['$timeout', function($timeout) { + return { + restrict: 'A', + require: '?ngModel', + scope: { + percent: '=', + options: '=' + }, + link: function (scope, element, attrs) { + var options = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000 + }; + angular.extend(options, scope.options); + + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + if(timer) { + $timeout.cancel(timer); + } + timer = $timeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + }; + }]); +} else{ + console.log('Angular not detected.'); +} + +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.1/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.1/angular.easypiechart.min.js new file mode 100644 index 000000000..d71cfe04d --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.1/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.1 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("anuglar")):"function"==typeof define&&define.amd?define("EasyPieChart",["anuglar"],b):b(a.anuglar)}(this,function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",["$timeout",function(a){return{restrict:"A",require:"?ngModel",scope:{percent:"=",options:"="},link:function(c,d){var e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3};angular.extend(e,c.options);var f=new b(d[0],e);c.percent&&f.update(c.percent);var g=null;c.$watch("percent",function(b,d){f.update(d),g&&a.cancel(g),g=a(function(){f.update(c.percent)},1e3/60)})}}}]):console.log("Angular not detected.");var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.1/easypiechart.js b/ajax/libs/easy-pie-chart/2.1.1/easypiechart.js new file mode 100644 index 000000000..a12f558ff --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.1/easypiechart.js @@ -0,0 +1,299 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.1 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', [], factory); + } + else { + root['EasyPieChart'] = factory(); + } +}(this, function() { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + + return EasyPieChart; +})); diff --git a/ajax/libs/easy-pie-chart/2.1.1/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.1/easypiechart.min.js new file mode 100644 index 000000000..c4abeddc4 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.1/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.1 + **/ +!function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define("EasyPieChart",[],b):a.EasyPieChart=b()}(this,function(){var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};return b}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.1/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.1/jquery.easypiechart.js new file mode 100644 index 000000000..bf378a560 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.1/jquery.easypiechart.js @@ -0,0 +1,306 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.1 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('jquery')); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', ['jquery'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + if (!$.data(this, 'easyPieChart')) { + $.data(this, 'easyPieChart', new EasyPieChart(this, options)); + } + }); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.1/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.1/jquery.easypiechart.min.js new file mode 100644 index 000000000..9446a8dd4 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.1/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.1 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define("EasyPieChart",["jquery"],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};a.fn.easyPieChart=function(b){return this.each(function(){a.data(this,"easyPieChart")||a.data(this,"easyPieChart",new c(this,b))})}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.2/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.2/angular.easypiechart.js new file mode 100644 index 000000000..398426a5b --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.2/angular.easypiechart.js @@ -0,0 +1,350 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.2 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('anuglar')); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', ['anuglar'], factory); + } + else { + factory(root.anuglar); + } +}(this, function(anuglar) { +// Angular directives for easyPieChart +if ((typeof(angular) === 'object') && (typeof(angular.version) === 'object')) { + angular.module('easypiechart',[]) + .directive('easypiechart', ['$timeout', function($timeout) { + return { + restrict: 'A', + require: '?ngModel', + scope: { + percent: '=', + options: '=' + }, + link: function (scope, element, attrs) { + var options = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000 + }; + angular.extend(options, scope.options); + + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + if(timer) { + $timeout.cancel(timer); + } + timer = $timeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + }; + }]); +} else{ + console.log('Angular not detected.'); +} + +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.2/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.2/angular.easypiechart.min.js new file mode 100644 index 000000000..789b12a5b --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.2/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.2 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("anuglar")):"function"==typeof define&&define.amd?define("EasyPieChart",["anuglar"],b):b(a.anuglar)}(this,function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",["$timeout",function(a){return{restrict:"A",require:"?ngModel",scope:{percent:"=",options:"="},link:function(c,d){var e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3};angular.extend(e,c.options);var f=new b(d[0],e);c.percent&&f.update(c.percent);var g=null;c.$watch("percent",function(b,d){f.update(d),g&&a.cancel(g),g=a(function(){f.update(c.percent)},1e3/60)})}}}]):console.log("Angular not detected.");var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.2/easypiechart.js b/ajax/libs/easy-pie-chart/2.1.2/easypiechart.js new file mode 100644 index 000000000..6bdb0c7cc --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.2/easypiechart.js @@ -0,0 +1,299 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.2 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', [], factory); + } + else { + root['EasyPieChart'] = factory(); + } +}(this, function() { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + + return EasyPieChart; +})); diff --git a/ajax/libs/easy-pie-chart/2.1.2/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.2/easypiechart.min.js new file mode 100644 index 000000000..7ab7ac8cf --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.2/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.2 + **/ +!function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define("EasyPieChart",[],b):a.EasyPieChart=b()}(this,function(){var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};return b}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.2/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.2/jquery.easypiechart.js new file mode 100644 index 000000000..159c176ff --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.2/jquery.easypiechart.js @@ -0,0 +1,309 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.2 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('jquery')); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', ['jquery'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between 0 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(0, percent || 1), 1); + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, false); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between 0 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + if (percent > 0) { + drawCircle(color, options.lineWidth, percent / 100); + } + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + var instanceOptions; + + if (!$.data(this, 'easyPieChart')) { + instanceOptions = $.extend({}, options, $(this).data()); + $.data(this, 'easyPieChart', new EasyPieChart(this, instanceOptions)); + } + }); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.2/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.2/jquery.easypiechart.min.js new file mode 100644 index 000000000..df5fc9ebd --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.2/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.2 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define("EasyPieChart",["jquery"],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(0,c||1),1),e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,!1),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,a>0&&h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,"easyPieChart")||(d=a.extend({},b,a(this).data()),a.data(this,"easyPieChart",new c(this,d)))})}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.3/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.3/angular.easypiechart.js new file mode 100644 index 000000000..febfc43ea --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.3/angular.easypiechart.js @@ -0,0 +1,349 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.3 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('anuglar')); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', ['anuglar'], factory); + } + else { + factory(root.anuglar); + } +}(this, function(anuglar) { +// Angular directives for easyPieChart +if ((typeof(angular) === 'object') && (typeof(angular.version) === 'object')) { + angular.module('easypiechart',[]) + .directive('easypiechart', ['$timeout', function($timeout) { + return { + restrict: 'A', + require: '?ngModel', + scope: { + percent: '=', + options: '=' + }, + link: function (scope, element, attrs) { + var options = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000 + }; + angular.extend(options, scope.options); + + var pieChart = new EasyPieChart(element[0], options); + + // initial pie rendering + if (scope.percent) { + pieChart.update(scope.percent); + } + + // on change of value + var timer = null; + scope.$watch('percent', function(oldVal, newVal) { + pieChart.update(newVal); + + // this is needed or the last value won't be updated + if(timer) { + $timeout.cancel(timer); + } + timer = $timeout(function() { + pieChart.update(scope.percent); + }, 1000 / 60); + }); + } + }; + }]); +} else{ + console.log('Angular not detected.'); +} + +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between -1 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(-1, percent || 0), 1); + var isNegative = percent <= 0 ? true : false; + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth, 1); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between -100 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + drawCircle(color, options.lineWidth, percent / 100); + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.3/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.3/angular.easypiechart.min.js new file mode 100644 index 000000000..f9b486516 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.3/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.3 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("anuglar")):"function"==typeof define&&define.amd?define("EasyPieChart",["anuglar"],b):b(a.anuglar)}(this,function(){"object"==typeof angular&&"object"==typeof angular.version?angular.module("easypiechart",[]).directive("easypiechart",["$timeout",function(a){return{restrict:"A",require:"?ngModel",scope:{percent:"=",options:"="},link:function(c,d){var e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3};angular.extend(e,c.options);var f=new b(d[0],e);c.percent&&f.update(c.percent);var g=null;c.$watch("percent",function(b,d){f.update(d),g&&a.cancel(g),g=a(function(){f.update(c.percent)},1e3/60)})}}}]):console.log("Angular not detected.");var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth,1)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.3/easypiechart.js b/ajax/libs/easy-pie-chart/2.1.3/easypiechart.js new file mode 100644 index 000000000..9194089b5 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.3/easypiechart.js @@ -0,0 +1,298 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.3 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', [], factory); + } + else { + root['EasyPieChart'] = factory(); + } +}(this, function() { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between -1 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(-1, percent || 0), 1); + var isNegative = percent <= 0 ? true : false; + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth, 1); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between -100 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + drawCircle(color, options.lineWidth, percent / 100); + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + + return EasyPieChart; +})); diff --git a/ajax/libs/easy-pie-chart/2.1.3/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.3/easypiechart.min.js new file mode 100644 index 000000000..f9669f6a9 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.3/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.3 + **/ +!function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define("EasyPieChart",[],b):a.EasyPieChart=b()}(this,function(){var a=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth,1)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},b=function(b,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof a)d.renderer=a;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=b,this.options=e;for(var a in d)d.hasOwnProperty(a)&&(e[a]=c&&"undefined"!=typeof c[a]?c[a]:d[a],"function"==typeof e[a]&&(e[a]=e[a].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(b,e),this.renderer.draw(f),b.dataset&&b.dataset.percent?this.update(parseFloat(b.dataset.percent)):b.getAttribute&&b.getAttribute("data-percent")&&this.update(parseFloat(b.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};return b}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.3/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.3/jquery.easypiechart.js new file mode 100644 index 000000000..96fc1c02c --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.3/jquery.easypiechart.js @@ -0,0 +1,308 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.3 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('jquery')); + } + else if(typeof define === 'function' && define.amd) { + define('EasyPieChart', ['jquery'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + el.appendChild(canvas); + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between -1 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(-1, percent || 0), 1); + var isNegative = percent <= 0 ? true : false; + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + var i = 24; + + ctx.lineWidth = 1 + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i%6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * .6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + options.scaleColor && drawScale(); + options.trackColor && drawCircle(options.trackColor, options.lineWidth, 1); + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between -100 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + drawCircle(color, options.lineWidth, percent / 100); + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate); + var currentValue = options.easing(this, process, from, to - from, options.animate); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: 1000, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + var instanceOptions; + + if (!$.data(this, 'easyPieChart')) { + instanceOptions = $.extend({}, options, $(this).data()); + $.data(this, 'easyPieChart', new EasyPieChart(this, instanceOptions)); + } + }); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.3/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.3/jquery.easypiechart.min.js new file mode 100644 index 000000000..7a20951cd --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.3/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.3 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define("EasyPieChart",["jquery"],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement("canvas");"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size,a.appendChild(d);var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c,d=24;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)0===d%6?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth,1)};this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate),g=b.easing(this,f,a,c-a,b.animate);this.draw(g),b.onStep(a,c,g),f>=b.animate?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:1e3,easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,"easyPieChart")||(d=a.extend({},b,a(this).data()),a.data(this,"easyPieChart",new c(this,d)))})}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.4/angular.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.4/angular.easypiechart.js new file mode 100644 index 000000000..4e402241c --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.4/angular.easypiechart.js @@ -0,0 +1,394 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.4 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('angular')); + } + else if(typeof define === 'function' && define.amd) { + define(['angular'], factory); + } + else { + factory(root.angular); + } +}(this, function(angular) { +(function (angular) { + + 'use strict'; + + return angular.module('easypiechart', []) + + .directive('easypiechart', [function() { + return { + restrict: 'A', + require: '?ngModel', + scope: { + percent: '=', + options: '=' + }, + link: function (scope, element, attrs) { + + scope.percent = scope.percent || 0; + + /** + * default easy pie chart options + * @type {Object} + */ + var options = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: { + duration: 1000, + enabled: true + } + }; + scope.options = angular.extend(options, scope.options); + + var pieChart = new EasyPieChart(element[0], options); + + scope.$watch('percent', function(newVal, oldVal) { + pieChart.update(newVal); + }); + } + }; + }]); + +})(angular); +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + el.appendChild(canvas); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between -1 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(-1, percent || 0), 1); + var isNegative = percent <= 0 ? true : false; + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + + ctx.lineWidth = 1; + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i % 6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * 0.6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + if(options.scaleColor) drawScale(); + if(options.trackColor) drawCircle(options.trackColor, options.lineWidth, 1); + }; + + /** + * Canvas accessor + */ + this.getCanvas = function() { + return canvas; + }; + + /** + * Canvas 2D context 'ctx' accessor + */ + this.getCtx = function() { + return ctx; + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between -100 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + drawCircle(color, options.lineWidth, percent / 100); + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate.duration); + var currentValue = options.easing(this, process, from, to - from, options.animate.duration); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate.duration) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: { + duration: 1000, + enabled: true + }, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // process earlier animate option to avoid bc breaks + if (typeof(options.animate) === 'number') { + options.animate = { + duration: options.animate, + enabled: true + }; + } + + if (typeof(options.animate) === 'boolean' && !options.animate) { + options.animate = { + duration: 1000, + enabled: options.animate + }; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate.enabled) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + /** + * Disable animation + * @return {object} Instance of the plugin for method chaining + */ + this.disableAnimation = function() { + options.animate.enabled = false; + return this; + }; + + /** + * Enable animation + * @return {object} Instance of the plugin for method chaining + */ + this.enableAnimation = function() { + options.animate.enabled = true; + return this; + }; + + init(); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.4/angular.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.4/angular.easypiechart.min.js new file mode 100644 index 000000000..4ab24b93f --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.4/angular.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.4 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("angular")):"function"==typeof define&&define.amd?define(["angular"],b):b(a.angular)}(this,function(a){!function(a){"use strict";return a.module("easypiechart",[]).directive("easypiechart",[function(){return{restrict:"A",require:"?ngModel",scope:{percent:"=",options:"="},link:function(b,d){b.percent=b.percent||0;var e={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:{duration:1e3,enabled:!0}};b.options=a.extend(e,b.options);var f=new c(d[0],e);b.$watch("percent",function(a){f.update(a)})}}}])}(a);var b=function(a,b){var c,d=document.createElement("canvas");a.appendChild(d),"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size;var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f>=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,"number"==typeof e.animate&&(e.animate={duration:e.animate,enabled:!0}),"boolean"!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()}}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.4/easypiechart.js b/ajax/libs/easy-pie-chart/2.1.4/easypiechart.js new file mode 100644 index 000000000..b69595c4e --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.4/easypiechart.js @@ -0,0 +1,346 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.4 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(); + } + else if(typeof define === 'function' && define.amd) { + define([], factory); + } + else { + factory(); + } +}(this, function() { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + el.appendChild(canvas); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between -1 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(-1, percent || 0), 1); + var isNegative = percent <= 0 ? true : false; + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + + ctx.lineWidth = 1; + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i % 6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * 0.6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + if(options.scaleColor) drawScale(); + if(options.trackColor) drawCircle(options.trackColor, options.lineWidth, 1); + }; + + /** + * Canvas accessor + */ + this.getCanvas = function() { + return canvas; + }; + + /** + * Canvas 2D context 'ctx' accessor + */ + this.getCtx = function() { + return ctx; + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between -100 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + drawCircle(color, options.lineWidth, percent / 100); + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate.duration); + var currentValue = options.easing(this, process, from, to - from, options.animate.duration); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate.duration) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: { + duration: 1000, + enabled: true + }, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // process earlier animate option to avoid bc breaks + if (typeof(options.animate) === 'number') { + options.animate = { + duration: options.animate, + enabled: true + }; + } + + if (typeof(options.animate) === 'boolean' && !options.animate) { + options.animate = { + duration: 1000, + enabled: options.animate + }; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate.enabled) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + /** + * Disable animation + * @return {object} Instance of the plugin for method chaining + */ + this.disableAnimation = function() { + options.animate.enabled = false; + return this; + }; + + /** + * Enable animation + * @return {object} Instance of the plugin for method chaining + */ + this.enableAnimation = function() { + options.animate.enabled = true; + return this; + }; + + init(); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.4/easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.4/easypiechart.min.js new file mode 100644 index 000000000..a6726ab39 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.4/easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.4 + **/ +!function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define([],b):b()}(this,function(){}); \ No newline at end of file diff --git a/ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.js b/ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.js new file mode 100644 index 000000000..0b9d74013 --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.js @@ -0,0 +1,357 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.4 + **/ + +(function(root, factory) { + if(typeof exports === 'object') { + module.exports = factory(require('jquery')); + } + else if(typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } + else { + factory(root.jQuery); + } +}(this, function($) { +/** + * Renderer to render the chart on a canvas object + * @param {DOMElement} el DOM element to host the canvas (root of the plugin) + * @param {object} options options object of the plugin + */ +var CanvasRenderer = function(el, options) { + var cachedBackground; + var canvas = document.createElement('canvas'); + + el.appendChild(canvas); + + if (typeof(G_vmlCanvasManager) !== 'undefined') { + G_vmlCanvasManager.initElement(canvas); + } + + var ctx = canvas.getContext('2d'); + + canvas.width = canvas.height = options.size; + + // canvas on retina devices + var scaleBy = 1; + if (window.devicePixelRatio > 1) { + scaleBy = window.devicePixelRatio; + canvas.style.width = canvas.style.height = [options.size, 'px'].join(''); + canvas.width = canvas.height = options.size * scaleBy; + ctx.scale(scaleBy, scaleBy); + } + + // move 0,0 coordinates to the center + ctx.translate(options.size / 2, options.size / 2); + + // rotate canvas -90deg + ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI); + + var radius = (options.size - options.lineWidth) / 2; + if (options.scaleColor && options.scaleLength) { + radius -= options.scaleLength + 2; // 2 is the distance between scale and bar + } + + // IE polyfill for Date + Date.now = Date.now || function() { + return +(new Date()); + }; + + /** + * Draw a circle around the center of the canvas + * @param {strong} color Valid CSS color string + * @param {number} lineWidth Width of the line in px + * @param {number} percent Percentage to draw (float between -1 and 1) + */ + var drawCircle = function(color, lineWidth, percent) { + percent = Math.min(Math.max(-1, percent || 0), 1); + var isNegative = percent <= 0 ? true : false; + + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative); + + ctx.strokeStyle = color; + ctx.lineWidth = lineWidth; + + ctx.stroke(); + }; + + /** + * Draw the scale of the chart + */ + var drawScale = function() { + var offset; + var length; + + ctx.lineWidth = 1; + ctx.fillStyle = options.scaleColor; + + ctx.save(); + for (var i = 24; i > 0; --i) { + if (i % 6 === 0) { + length = options.scaleLength; + offset = 0; + } else { + length = options.scaleLength * 0.6; + offset = options.scaleLength - length; + } + ctx.fillRect(-options.size/2 + offset, 0, length, 1); + ctx.rotate(Math.PI / 12); + } + ctx.restore(); + }; + + /** + * Request animation frame wrapper with polyfill + * @return {function} Request animation frame method or timeout fallback + */ + var reqAnimationFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + function(callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + + /** + * Draw the background of the plugin including the scale and the track + */ + var drawBackground = function() { + if(options.scaleColor) drawScale(); + if(options.trackColor) drawCircle(options.trackColor, options.lineWidth, 1); + }; + + /** + * Canvas accessor + */ + this.getCanvas = function() { + return canvas; + }; + + /** + * Canvas 2D context 'ctx' accessor + */ + this.getCtx = function() { + return ctx; + }; + + /** + * Clear the complete canvas + */ + this.clear = function() { + ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size); + }; + + /** + * Draw the complete chart + * @param {number} percent Percent shown by the chart between -100 and 100 + */ + this.draw = function(percent) { + // do we need to render a background + if (!!options.scaleColor || !!options.trackColor) { + // getImageData and putImageData are supported + if (ctx.getImageData && ctx.putImageData) { + if (!cachedBackground) { + drawBackground(); + cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy); + } else { + ctx.putImageData(cachedBackground, 0, 0); + } + } else { + this.clear(); + drawBackground(); + } + } else { + this.clear(); + } + + ctx.lineCap = options.lineCap; + + // if barcolor is a function execute it and pass the percent as a value + var color; + if (typeof(options.barColor) === 'function') { + color = options.barColor(percent); + } else { + color = options.barColor; + } + + // draw bar + drawCircle(color, options.lineWidth, percent / 100); + }.bind(this); + + /** + * Animate from some percent to some other percentage + * @param {number} from Starting percentage + * @param {number} to Final percentage + */ + this.animate = function(from, to) { + var startTime = Date.now(); + options.onStart(from, to); + var animation = function() { + var process = Math.min(Date.now() - startTime, options.animate.duration); + var currentValue = options.easing(this, process, from, to - from, options.animate.duration); + this.draw(currentValue); + options.onStep(from, to, currentValue); + if (process >= options.animate.duration) { + options.onStop(from, to); + } else { + reqAnimationFrame(animation); + } + }.bind(this); + + reqAnimationFrame(animation); + }.bind(this); +}; + +var EasyPieChart = function(el, opts) { + var defaultOptions = { + barColor: '#ef1e25', + trackColor: '#f9f9f9', + scaleColor: '#dfe0e0', + scaleLength: 5, + lineCap: 'round', + lineWidth: 3, + size: 110, + rotate: 0, + animate: { + duration: 1000, + enabled: true + }, + easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/ + t = t / (d/2); + if (t < 1) { + return c / 2 * t * t + b; + } + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + onStart: function(from, to) { + return; + }, + onStep: function(from, to, currentValue) { + return; + }, + onStop: function(from, to) { + return; + } + }; + + // detect present renderer + if (typeof(CanvasRenderer) !== 'undefined') { + defaultOptions.renderer = CanvasRenderer; + } else if (typeof(SVGRenderer) !== 'undefined') { + defaultOptions.renderer = SVGRenderer; + } else { + throw new Error('Please load either the SVG- or the CanvasRenderer'); + } + + var options = {}; + var currentValue = 0; + + /** + * Initialize the plugin by creating the options object and initialize rendering + */ + var init = function() { + this.el = el; + this.options = options; + + // merge user options into default options + for (var i in defaultOptions) { + if (defaultOptions.hasOwnProperty(i)) { + options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i]; + if (typeof(options[i]) === 'function') { + options[i] = options[i].bind(this); + } + } + } + + // check for jQuery easing + if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) { + options.easing = jQuery.easing[options.easing]; + } else { + options.easing = defaultOptions.easing; + } + + // process earlier animate option to avoid bc breaks + if (typeof(options.animate) === 'number') { + options.animate = { + duration: options.animate, + enabled: true + }; + } + + if (typeof(options.animate) === 'boolean' && !options.animate) { + options.animate = { + duration: 1000, + enabled: options.animate + }; + } + + // create renderer + this.renderer = new options.renderer(el, options); + + // initial draw + this.renderer.draw(currentValue); + + // initial update + if (el.dataset && el.dataset.percent) { + this.update(parseFloat(el.dataset.percent)); + } else if (el.getAttribute && el.getAttribute('data-percent')) { + this.update(parseFloat(el.getAttribute('data-percent'))); + } + }.bind(this); + + /** + * Update the value of the chart + * @param {number} newValue Number between 0 and 100 + * @return {object} Instance of the plugin for method chaining + */ + this.update = function(newValue) { + newValue = parseFloat(newValue); + if (options.animate.enabled) { + this.renderer.animate(currentValue, newValue); + } else { + this.renderer.draw(newValue); + } + currentValue = newValue; + return this; + }.bind(this); + + /** + * Disable animation + * @return {object} Instance of the plugin for method chaining + */ + this.disableAnimation = function() { + options.animate.enabled = false; + return this; + }; + + /** + * Enable animation + * @return {object} Instance of the plugin for method chaining + */ + this.enableAnimation = function() { + options.animate.enabled = true; + return this; + }; + + init(); +}; + +$.fn.easyPieChart = function(options) { + return this.each(function() { + var instanceOptions; + + if (!$.data(this, 'easyPieChart')) { + instanceOptions = $.extend({}, options, $(this).data()); + $.data(this, 'easyPieChart', new EasyPieChart(this, instanceOptions)); + } + }); +}; + +})); diff --git a/ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.min.js b/ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.min.js new file mode 100644 index 000000000..68b1d400c --- /dev/null +++ b/ajax/libs/easy-pie-chart/2.1.4/jquery.easypiechart.min.js @@ -0,0 +1,9 @@ +/**! + * easyPieChart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.4 + **/ +!function(a,b){"object"==typeof exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],b):b(a.jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement("canvas");a.appendChild(d),"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size;var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f>=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(){},onStep:function(){},onStop:function(){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));e.easing="string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?jQuery.easing[e.easing]:d.easing,"number"==typeof e.animate&&(e.animate={duration:e.animate,enabled:!0}),"boolean"!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,"easyPieChart")||(d=a.extend({},b,a(this).data()),a.data(this,"easyPieChart",new c(this,d)))})}}); \ No newline at end of file