(function () {
var server_time = 1234567890123; // set to server time via PHP or something
var offset = (new Date()).valueOf() - server_time;
var zeropad = function (number, len) {
return ('0'.repeat(len) + number.toString()).substr(-len);
}
var countdown_text = function (limit, mode) {
// mode: -1: count only down, 0: down and up (with sign), 1: only up
limit += offset;
var current = (new Date()).valueOf();
var difference = Math.floor((current - limit) / 1000);
if (((difference < 0) && (mode > 0)) || ((difference > 0) && (mode < 0))) return ':00';
var sign = '';
if (difference < 0) {
if (mode == 0) sign = '-';
difference = -difference;
}
var result = ':' + zeropad(difference % 60, 2);
difference = Math.floor(difference / 60);
if (difference < 60) {
if (difference > 0) result = difference.toString() + result;
} else {
result = zeropad(difference % 60, 2) + result;
difference = Math.floor(difference / 60);
if (difference < 24)
result = difference.toString() + ':' + result;
else {
result = ' ' + zeropad(difference % 24, 2) + ':' + result;
difference = Math.floor(difference / 24);
if (difference == 1)
result = '1 day,' + result;
else
result = difference.toString() + ' days' + result;
}
}
return sign + result;
}
var calculate_limit = function (limit_string) {
if (limit_string.length == 0) return undefined;
var mode = -1;
if (limit_string.charAt(0) == '+')
mode = 1;
else if (limit_string.charAt(0) == '-')
mode = 0;
var components = limit_string.split(/[^0-9]+/).filter(function (str) {return str.length;}).slice(0, 7).map(parseFloat);
if (components.length == 0) return undefined;
var date = new Date(0);
for (var index = 0; index < components.length; index ++) {
if (index == 1) components[index] --;
date[(['setUTCFullYear', 'setUTCMonth', 'setUTCDate', 'setUTCHours', 'setUTCMinutes', 'setUTCSeconds', 'setUTCMilliseconds'])[index]](components[index]);
}
var limit = date.valueOf();
if (isNaN(limit)) return undefined;
return {limit: limit, mode: mode};
}
var update_count = function (element) {
if (!element.hasAttribute('data-limit')) return;
var limit = calculate_limit(element.attributes['data-limit'].value);
if (limit == undefined) return;
element.innerHTML = countdown_text(limit.limit, limit.mode);
}
setInterval(function () {Array.prototype.forEach.call(document.querySelectorAll('span.xx-countdown'), update_count);}, 165);
})();
Comments