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