jquery countdown
by ibroom
HTML
<div class="countdown-timer"></div>
JavaScript
/* jquery countdown timer */
// AMD support (Thanks to @FagnerMartinsBrack)
;(function(factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else {
factory(jQuery);
}
})(function($){
'use strict';
var instances = [],
matchers = [],
defaultOptions = {
precision: 100, // 0.1 seconds, used to update the DOM
elapse: false,
defer: false
};
// Miliseconds
matchers.push(/^[0-9]*$/.source);
// Month/Day/Year [hours:minutes:seconds]
matchers.push(/([0-9]{1,2}\/){2}[0-9]{4}( [0-9]{1,2}(:[0-9]{2}){2})?/
.source);
// Year/Day/Month [hours:minutes:seconds] and
// Year-Day-Month [hours:minutes:seconds]
matchers.push(/[0-9]{4}([\/\-][0-9]{1,2}){2}( [0-9]{1,2}(:[0-9]{2}){2})?/
.source);
// Cast the matchers to a regular expression object
matchers = new RegExp(matchers.join('|'));
// Parse a Date formatted has String to a native object
function parseDateString(dateString) {
// Pass through when a native object is sent
if(dateString instanceof Date) {
return dateString;
}
// Caste string to date object
if(String(dateString).match(matchers)) {
// If looks like a milisecond value cast to number before
// final casting (Thanks to @msigley)
if(String(dateString).match(/^[0-9]*$/)) {
dateString = Number(dateString);
}
// Replace dashes to slashes
if(String(dateString).match(/\-/)) {
dateString = String(dateString).replace(/\-/g, '/');
}
return new Date(dateString);
} else {
throw new Error('Couldn\'t cast `' + dateString +
'` to a date object.');
}
}
// Map to convert from a directive to offset object property
var DIRECTIVE_KEY_MAP = {
'Y': 'years',
'm': 'months',
'n': 'daysToMonth',
'd': 'daysToWeek',
'w': 'weeks',
'W': 'weeksToMonth',
'H': 'hours',
'M': 'minutes',
'S': 'seconds',
...