(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); })();