/**
* Countdown wrapper.
*
* @author Htmlstream
* @version 1.0
* @requires Countdown (v2.2.0, http://hilios.github.io/jQuery.countdown), circles.js (v0.0.6)
*
*/
;(function ($) {
'use strict';
$.HSCore.components.HSCountdown = {
/**
*
*
* @var Object _baseConfig
*/
_baseConfig: {
yearsElSelector: '.years',
monthElSelector: '.month',
daysElSelector: '.days',
hoursElSelector: '.hours',
minutesElSelector: '.minutes',
secondsElSelector: '.seconds',
// circles
circles: false,
wrpClass: 'wrpClass',
textClass: 'textClass',
valueStrokeClass: 'valueStrokeClass',
maxValueStrokeClass: 'maxValueStrokeClass',
styleWrapper: 'styleWrapper',
styleText: 'styleText'
},
/**
*
*
* @var jQuery pageCollection
*/
pageCollection: $(),
/**
*
*
* @var
*/
_circlesIds: [0],
/**
* Initialization of Countdown wrapper.
*
* @param String selector (optional)
* @param Object config (optional)
*
* @return jQuery pageCollection - collection of initialized items.
*/
init: function (selector, config) {
this.collection = selector && $(selector).length ? $(selector) : $();
if (!$(selector).length) return;
this.config = config && $.isPlainObject(config) ?
$.extend({}, this._baseConfig, config) : this._baseConfig;
this.config.itemSelector = selector;
this.initCountdowns();
return this.pageCollection;
},
/**
* Initialization of each Countdown of the page.
*
* @return undefined
*/
initCountdowns: function () {
var self = this;
this.collection.each(function (i, el) {
var $this = $(el),
options = {
endDate: $this.data('end-date') ? new Date($this.data('end-date')) : new Date(),
startDate: $this.data('start-date') ? new Date($this.data('start-date')) : new Date(),
yearsEl: $this.find(self.config['yearsElSelector']),
yearsFormat: $this.data('years-format'),
monthEl: $this.find(self.config['monthElSelector']),
monthFormat: $this.data('month-format'),
daysEl: $this.find(self.config['daysElSelector']),
daysFormat: $this.data('days-format'),
hoursEl: $this.find(self.config['hoursElSelector']),
hoursFormat: $this.data('hours-format'),
minutesEl: $this.find(self.config['minutesElSelector']),
minutesFormat: $this.data('minutes-format'),
secondsEl: $this.find(self.config['secondsElSelector']),
secondsFormat: $this.data('seconds-format')
};
if (self.config['circles'] && $this.data('start-date')) self._initPiesImplementation($this, options);
else self._initBaseImplementation($this, options);
self.pageCollection = self.pageCollection.add($this);
});
},
/**
*
* @param jQuery container
* @param Object options
*
* @return undefined
*/
_initBaseImplementation: function (container, options) {
container.countdown(options.endDate, function (e) {
if (options.yearsEl.length) {
options.yearsEl.text(e.strftime(options.yearsFormat));
}
if (options.monthEl.length) {
options.monthEl.text(e.strftime(options.monthFormat));
}
if (options.daysEl.length) {
options.daysEl.text(e.strftime(options.daysFormat));
}
if (options.hoursEl.length) {
options.hoursEl.text(e.strftime(options.hoursFormat));
}
if (options.minutesEl.length) {
options.minutesEl.text(e.strftime(options.minutesFormat));
}
if (options.secondsEl.length) {
options.secondsEl.text(e.strftime(options.secondsFormat));
}
});
},
/**
*
* @param jQuery container
* @param Object options
*
* @return undefined
*/
_initPiesImplementation: function (container, options) {
var self = this,
id,
oneDay = 24 * 60 * 60 * 1000;
// prepare elements
if (options.yearsEl.length) {
self._preparePieItem(options.yearsEl, {
maxValue: (options.endDate.getFullYear() - options.startDate.getFullYear()),
radius: container.data('circles-radius'),
width: container.data('circles-stroke-width'),
'fg-color': container.data('circles-fg-color'),
'bg-color': container.data('circles-bg-color'),
'additional-text': container.data('circles-additional-text'),
'font-size': container.data('circles-font-size')
});
}
if (options.monthEl.length) {
self._preparePieItem(options.monthEl, {
maxValue: Math.round(Math.abs((options.endDate.getTime() - options.startDate.getTime()) / (oneDay))) / 12,
radius: container.data('circles-radius'),
width: container.data('circles-stroke-width'),
'fg-color': container.data('circles-fg-color'),
'bg-color': container.data('circles-bg-color'),
'additional-text': container.data('circles-additional-text'),
'font-size': container.data('circles-font-size')
});
}
if (options.daysEl.length) {
self._preparePieItem(options.daysEl, {
maxValue: self._getDaysMaxValByFormat(options.daysFormat, options.startDate, options.endDate),
radius: container.data('circles-radius'),
width: container.data('circles-stroke-width'),
'fg-color': container.data('circles-fg-color'),
'bg-color': container.data('circles-bg-color'),
'additional-text': container.data('circles-additional-text'),
'font-size': container.data('circles-font-size')
});
}
if (options.hoursEl.length) {
self._preparePieItem(options.hoursEl, {
maxValue: 60,
radius: container.data('circles-radius'),
width: container.data('circles-stroke-width'),
'fg-color': container.data('circles-fg-color'),
'bg-color': container.data('circles-bg-color'),
'additional-text': container.data('circles-additional-text'),
'font-size': container.data('circles-font-size')
});
}
if (options.minutesEl.length) {
self._preparePieItem(options.minutesEl, {
maxValue: 60,
radius: container.data('circles-radius'),
width: container.data('circles-stroke-width'),
'fg-color': container.data('circles-fg-color'),
'bg-color': container.data('circles-bg-color'),
'additional-text': container.data('circles-additional-text'),
'font-size': container.data('circles-font-size')
});
}
if (options.secondsEl.length) {
self._preparePieItem(options.secondsEl, {
maxValue: 60,
radius: container.data('circles-radius'),
width: container.data('circles-stroke-width'),
'fg-color': container.data('circles-fg-color'),
'bg-color': container.data('circles-bg-color'),
'additional-text': container.data('circles-additional-text'),
'font-size': container.data('circles-font-size')
});
}
// init countdown
container.countdown(options.endDate, function (e) {
// years
if (options.yearsEl.length) {
options.yearsEl.data('circle').update(e.strftime(options.yearsFormat));
}
// months
if (options.monthEl.length) {
options.monthEl.data('circle').update(e.strftime(options.monthFormat));
}
// days
if (options.daysEl.length) {
options.daysEl.data('circle').update(e.strftime(options.daysFormat));
}
// hours
if (options.hoursEl.length) {
options.hoursEl.data('circle').update(e.strftime(options.hoursFormat));
}
// minutes
if (options.minutesEl.length) {
options.minutesEl.data('circle').update(e.strftime(options.minutesFormat));
}
// seconds
if (options.secondsEl.length) {
options.secondsEl.data('circle').update(e.strftime(options.secondsFormat));
}
});
},
/**
*
* @param jQuery el
* @param Object options
*
* @return undefined
*/
_preparePieItem: function (el, options) {
var self = this,
id = self._circlesIds[self._circlesIds.length - 1] + 1;
self._circlesIds.push(id);
el.attr('id', 'hs-countdown-element-' + id);
el.data('circle', Circles.create({
id: 'hs-countdown-element-' + id,
radius: options['radius'] || 80,
value: 0,
maxValue: options['maxValue'] || 100,
width: options['width'] || 10,
text: function (value) {
return value + (options['additional-text'] || '');
},
colors: [options['bg-color'] || '#eeeeee', options['fg-color'] || '#72c02c'],
duration: 0,
wrpClass: self.config['wrpClass'],
textClass: self.config['textClass'],
valueStrokeClass: self.config['valueStrokeClass'],
maxValueStrokeClass: self.config['maxValueStrokeClass'],
styleWrapper: self.config['styleWrapper'],
styleText: self.config['styleText']
}));
if (options['font-size']) {
el.find('.' + self.config['textClass']).css('font-size', options['font-size'] + 'px');
}
},
/**
*
* @param String format
* @param Date startDate
* @param Date endDate
*
* @return Number
*/
_getDaysMaxValByFormat: function (format, startDate, endDate) {
var oneDay = 24 * 60 * 60 * 1000;
switch (format) {
case '%D':
return Math.round(Math.abs((endDate.getTime() - startDate.getTime()) / (oneDay)));
break;
default:
return 31;
}
}
}
})(jQuery);