(function( $ ) { var calenderTpl = `

No events today.

ALL EVENTS
`; var weekDaysFromSunday = '
S
M
T
W
T
F
S
'; var weekDaysFromMonday = '
M
T
W
T
F
S
S
'; var shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul","Aug", "Sep", "Oct", "Nov", "Dec"]; $.fn.miniEventCalendar = $.fn.MEC = function(options) { var settings = $.extend({ calendar_link : "", events: [], from_monday: false, onMonthChanged: null }, options ); var miniCalendar = this; miniCalendar.addClass('mini-cal').html(calenderTpl); var thead = miniCalendar.find("#calThead"); var tbody = miniCalendar.find("#calTbody"); var calTitle = miniCalendar.find("#monthYear"); var calFooter = miniCalendar.find("#calTFooter"); var eventTitle = miniCalendar.find("#eventTitle"); var eventsLink = miniCalendar.find("#calLink"); var today = new Date(); var curMonth = today.getMonth(); var curYear = today.getFullYear(); eventTitle.text("No events today."); eventsLink.text("ALL EVENTS"); eventsLink.attr("href", settings.calendar_link); if(settings.from_monday) thead.html(weekDaysFromMonday); else thead.html(weekDaysFromSunday); if(!settings.calendar_link.length && !settings.events.length) calFooter.css("display", "none"); miniCalendar.find(".month-mover").each(function(){ var mover = $(this); mover.bind("click", function(e){ e.preventDefault(); if(mover.hasClass("next")) viewNextMonth(); else viewPrevMonth(); }); }); miniCalendar.on("click touchstart", ".a-date", function(e){ e.preventDefault(); $(".a-date").removeClass('focused'); if(!$(this).hasClass('blurred')){ showEvent($(this).data('event')); $(this).focus(); $(this).addClass('focused'); } }); function populateCalendar(month, year, onInit) { tbody.html(""); calTitle.text(shortMonths[month] + " " + year); eventTitle.text("Click day to see event"); eventsLink.text("All Events"); eventsLink.attr("href", "#"); curMonth = month; curYear = year; var ldate = new Date(year, month); var dt = new Date(ldate); var weekDay = dt.getDay(); if(settings.from_monday) weekDay = dt.getDay() > 0 ? dt.getDay() - 1 : 6; if(ldate.getDate() === 1) tbody.append(lastDaysOfPrevMonth(weekDay)); while (ldate.getMonth() === month) { dt = new Date(ldate); var isToday = areSameDate(ldate, new Date()); var event = null; var eventIndex = settings.events.findIndex(function(ev) { return areSameDate(dt, new Date(ev.date)); }); if(eventIndex != -1){ event = settings.events[eventIndex]; if(onInit && isToday) showEvent(event); } tbody.append(dateTpl(false, ldate.getDate(), isToday, event, onInit && isToday)); ldate.setDate(ldate.getDate() + 1); var bufferDays = 43 - miniCalendar.find(".a-date").length; if(ldate.getMonth() != month){ for(var i = 1; i < bufferDays; i++){ tbody.append(dateTpl(true, i)); } } } if(settings.onMonthChanged){ settings.onMonthChanged(month, year); } } function lastDaysOfPrevMonth(day){ if(curMonth > 0){ var monthIdx = curMonth - 1; var yearIdx = curYear; } else{ if(curMonth < 11){ var monthIdx = 0; var yearIdx = curYear + 1; }else{ var monthIdx = 11; var yearIdx = curYear - 1; } } var prevMonth = getMonthDays(monthIdx, yearIdx); var lastDays = ""; for (var i = day; i > 0; i--) lastDays += dateTpl(true, prevMonth[prevMonth.length - i]); return lastDays; } function dateTpl(blurred, date, isToday, event, isSelected){ var tpl = "
"+date+"
"; if(!blurred){ var hasEvent = event && event !== null; var cls = isToday ? "current " : ""; cls += hasEvent && isSelected ? "focused " : ""; cls += hasEvent ? "event " : ""; var tpl =""; } return tpl; } function showEvent(event){ if(event && event !== null && event !== undefined){ eventTitle.text(event.title); eventsLink.text("VIEW EVENT"); eventsLink.attr("href", event.link); }else{ eventTitle.text("No events on this day."); eventsLink.text("ALL EVENTS"); eventsLink.attr("href", settings.calendar_link); } } function viewNextMonth(){ var nextMonth = curMonth < 11 ? curMonth + 1 : 0; var nextYear = curMonth < 11 ? curYear : curYear + 1; populateCalendar(nextMonth, nextYear); } function viewPrevMonth(){ var prevMonth = curMonth > 0 ? curMonth - 1 : 11; var prevYear = curMonth > 0 ? curYear : curYear - 1; populateCalendar(prevMonth, prevYear); } function areSameDate(d1, d2) { return d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate(); } function getMonthDays(month, year) { var date = new Date(year, month, 1); var days = []; while (date.getMonth() === month) { days.push(date.getDate()); date.setDate(date.getDate() + 1); } return days; } populateCalendar(curMonth, curYear, true); return miniCalendar; }; }( jQuery ));