(function (factory) { "use strict"; if (typeof define === 'function' && define.amd) { // AMD define(['jquery'], factory); } else if (typeof exports == "object" && typeof module == "object") { // CommonJS module.exports = factory(require('jquery')); } else { // Browser factory(jQuery); } }) (function($, undefined) { "use strict"; $.fn.percircle = function(options) { // default options var defaultOptions = { animate: true }; // extend with any provided options if (!options) options = {}; $.extend(options, defaultOptions); var rotationMultiplier = 3.6; // for each element matching selector return this.each(function(){ /* If it is about dynamic value update, ensure the filling of the bar will start from 0 degrees. Without this line, if it as about a dynamic update from a value > 50 to a value < 50, the bar filling will start from 180 degrees. However, this fix is not the best one, UX-wise, since user loses the gradual degredation of the bar. The way this should be best implemented is to perform a smooth animation from > 50deg back to the requested value, instead of first moving to 0deg and then "drawing" again. */ if ($(this).hasClass('gt50')) $(this).removeClass('gt50'); var percircle = $(this); var progressBarColor = ''; // When user tries adding a custom progress bar color, the text color should be updated as well. var changeTextColor = function (context, color) { // Change color text the same with progress bar color percircle.on('mouseover', function(){ context.children('span').css('color', color); }); percircle.on('mouseleave', function(){ context.children('span').attr('style', ''); }); }; // add percircle class for styling if (!percircle.hasClass('percircle')) percircle.addClass('percircle'); // apply options if (typeof(percircle.attr('data-animate')) !== 'undefined') options.animate = percircle.attr('data-animate') == 'true'; if (options.animate) percircle.addClass('animate'); if (typeof(percircle.attr('data-progressBarColor')) !== 'undefined') { options.progressBarColor = percircle.attr('data-progressBarColor'); progressBarColor = "style='border-color: "+ options.progressBarColor +"'"; changeTextColor($(this), options.progressBarColor); } else { if (typeof options.progressBarColor !== 'undefined'){ progressBarColor = "style='border-color: "+ options.progressBarColor +"'"; changeTextColor($(this), options.progressBarColor); } } var percent = percircle.attr('data-percent') || options.percent || 0; var perclock = percircle.attr('data-perclock') || options.perclock || 0; var perdown = percircle.attr('data-perdown') || options.perdown || 0; if (percent) { if (percent > 50) percircle.addClass('gt50'); var text = percircle.attr('data-text') || options.text || percent + '%'; percircle.html(''+text+''); // add divs for structure $('
').appendTo(percircle); if (percent > 50) $('.bar', percircle).css({ '-webkit-transform' : 'rotate(180deg)', '-moz-transform' : 'rotate(180deg)', '-ms-transform' : 'rotate(180deg)', '-o-transform' : 'rotate(180deg)', 'transform' : 'rotate(180deg)' }); var rotationDegrees = rotationMultiplier * percent; // set timeout causes the animation to be visible on load setTimeout(function(){ $('.bar', percircle).css({ '-webkit-transform' : 'rotate(' + rotationDegrees + 'deg)', '-moz-transform' : 'rotate(' + rotationDegrees + 'deg)', '-ms-transform' : 'rotate(' + rotationDegrees + 'deg)', '-o-transform' : 'rotate(' + rotationDegrees + 'deg)', 'transform' : 'rotate(' + rotationDegrees + 'deg)' }); }, 0); } else if(perclock){ if (!percircle.hasClass('perclock')) percircle.addClass('perclock'); setInterval(function(){ var d = new Date(); // without params it defaults to "now" var text = getPadded(d.getHours()) + ":" + getPadded(d.getMinutes()) + ":" + getPadded(d.getSeconds()); percircle.html(''+text+''); // add divs for structure $('
').appendTo(percircle); var seconds = d.getSeconds(); if (seconds === 0) percircle.removeClass('gt50'); if (seconds > 30){ percircle.addClass('gt50'); $('.bar', percircle).css({ '-webkit-transform' : 'rotate(180deg);scale(1,3)', '-moz-transform' : 'rotate(180deg);scale(1,3)', '-ms-transform' : 'rotate(180deg);scale(1,3)', '-o-transform' : 'rotate(180deg);scale(1,3)', 'transform' : 'rotate(180deg);scale(1,3)' }); } var rotationDegrees = 6 * seconds; // temporary clockwise rotation value $('.bar', percircle).css({ '-webkit-transform' : 'rotate(' + rotationDegrees + 'deg)', '-moz-transform' : 'rotate(' + rotationDegrees + 'deg)', '-ms-transform' : 'rotate(' + rotationDegrees + 'deg)', '-o-transform' : 'rotate(' + rotationDegrees + 'deg)', 'transform' : 'rotate(' + rotationDegrees + 'deg)' }); }, 1000); } else if(perdown) { getCountdown(percircle, options, progressBarColor); } }); }; // move to another file - functions var getCountdown = function(percircle, options, progressBarColor) { var secs = percircle.attr('data-secs') || options.secs; var timeUpText = percircle.attr('data-timeUpText') || options.timeUpText; var reset = percircle[0].hasAttribute('data-reset') || options.reset; if (timeUpText.length > 8) timeUpText='the end'; var counter; if (reset) { percircle.on("click", timerReset); } function timer() { secs-=1; if (secs > 30) percircle.addClass('gt50'); if (secs < 30) percircle.removeClass('gt50'); timerUpdate(); if (secs <= 0) { timerStop(); percircle.html(''+timeUpText+''); return; } } function timerStart() { counter = setInterval(timer, 1000); } function timerStop() { clearInterval(counter); } function timerReset() { timerStop(); secs = options.secs; timerUpdate(); timerStart(); } function timerUpdate() { percircle.html(''+secs+''); // add divs for structure $('
').appendTo(percircle); var rotationDegrees = 6 * secs; // temporary clockwise rotation value $('.bar', percircle).css({ '-webkit-transform' : 'rotate(' + rotationDegrees + 'deg)', '-moz-transform' : 'rotate(' + rotationDegrees + 'deg)', '-ms-transform' : 'rotate(' + rotationDegrees + 'deg)', '-o-transform' : 'rotate(' + rotationDegrees + 'deg)', 'transform' : 'rotate(' + rotationDegrees + 'deg)' }); } // Initialize timer timerStart(); }; // display a presentable format of current time var getPadded = function(val){ return val < 10 ? ('0' + val) : val; }; });