calendario
Version:
Check if a day is a workday or holiday
150 lines (120 loc) • 3.85 kB
JavaScript
;
var Range = require('./range'),
ical = require('ical2json'),
fs = require('fs');
function sameDay(date1, date2){
return date1.toDateString() === date2.toDateString();
}
function Calendario() {
this.events = [];
this.sources = [];
this.ignoreWeekend = false;
}
Calendario.prototype.use = function(name, source) {
name = name.toUpperCase();
var sourceType = typeof(source);
if (sourceType === 'undefined') {
if (name.indexOf('-') > -1) {
name = name.split('-');
source = require('../calendars/' + name[0] +
'/states/' + name.join('-'));
name = name.join('-');
this.useObjectSource(name, source);
} else {
this.useDefaultSource(name);
}
} else if (sourceType === 'object') {
if (source instanceof Array) {
this.useObjectSource(name, source);
} else {
this.parseSource(name, source);
}
}
}
Calendario.prototype.parseSource = function(name, source) {
var data = fs.readFileSync(source.file, 'utf-8');
if (source.parser === 'ics') {
data = ical.convert(data);
this.useDefaultSource(name, data);
}
}
Calendario.prototype.useObjectSource = function(name, source) {
var events = new Array(),
ev = new Object();
source.forEach(function(sourceEvent) {
ev = {};
ev.workday = (typeof(sourceEvent.workday) === 'undefined' ? true : sourceEvent.workday);
ev.summary = sourceEvent.summary || '';
if (sourceEvent.date) {
ev.date = sourceEvent.date;
events.push(ev)
}
})
this.sources.push({source: name, events: events});
}
Calendario.prototype.useDefaultSource = function(name, data) {
var events = [],
date;
if (!data)
data = require('../calendars/' + name + '/' + name + '.json');
data = data['VCALENDAR'][0]['VEVENT'];
data.forEach(function(ev) {
date = ev['DTSTART;VALUE=DATE']
date = date.slice(0,4) + '-' + date.slice(4,6) + '-' + date.slice(6,8);
events.push({
date: new Date(date + ' 00:00:00'),
summary: ev['SUMMARY'],
workday: false
})
})
this.sources.push({source: name, events: events});
}
Calendario.prototype.sourceList = function() {
return this.sources.map(function(a,b) { return a['source'] });
}
Calendario.prototype.clear = function() {
this.sources = [];
}
Calendario.prototype.ignoreWeekends = function(bool) {
if (bool === false)
return this.ignoreWeekend = false;
this.ignoreWeekend = true;
}
Calendario.prototype.eventList = function() {
var events = this.sources.map(function(a,b) { return a['events'] }),
eventsList = [];
for (var i = 1; i <= events.length; i++) {
eventsList = eventsList.concat(events[i - 1]);
}
return eventsList;
}
Calendario.prototype.dayDiff = function(dateEarlier, dateLater) {
var dayTime = 1000 * 60 * 60 * 24;
return (Math.round((dateLater.getTime()-dateEarlier.getTime())/dayTime));
}
Calendario.prototype.aboutDay = function(date) {
var events = this.eventList(),
day = [];
events.forEach(function(ev) {
if (sameDay(date, ev.date))
day.push(ev);
})
return day;
}
Calendario.prototype.isWorkday = function(date) {
var events = this.eventList(),
workday = true;
if (!this.ignoreWeekend) {
if (date.getDay() === 0 || date.getDay() === 6)
return false;
}
events.forEach(function(ev) {
if (sameDay(date, ev.date))
workday = ev.workday
})
return workday;
}
Calendario.prototype.range = function() {
return new Range(this);
}
module.exports = new Calendario();