/* ========================================================= * Bootstrap year calendar v1.1.0 * Repo: https://github.com/Paul-DS/bootstrap-year-calendar * ========================================================= * Created by Paul David-Sivelle * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================= */ (function($) { var Calendar = function(element, options) { this.element = element; this.element.addClass('calendar'); this._initializeEvents(options); this._initializeOptions(options); this.setYear(this.options.startYear); }; Calendar.prototype = { constructor: Calendar, _initializeOptions: function(opt) { if(opt == null) { opt = []; } this.options = { startYear: !isNaN(parseInt(opt.startYear)) ? parseInt(opt.startYear) : new Date().getFullYear(), minDate: opt.minDate instanceof Date ? opt.minDate : null, maxDate: opt.maxDate instanceof Date ? opt.maxDate : null, language: (opt.language != null && dates[opt.language] != null) ? opt.language : 'en', allowOverlap: opt.allowOverlap != null ? opt.allowOverlap : true, displayWeekNumber: opt.displayWeekNumber != null ? opt.displayWeekNumber : false, displayDisabledDataSource: opt.displayDisabledDataSource != null ? opt.displayDisabledDataSource : false, displayHeader: opt.displayHeader != null ? opt.displayHeader : true, alwaysHalfDay: opt.alwaysHalfDay != null ? opt.alwaysHalfDay : false, enableRangeSelection: opt.enableRangeSelection != null ? opt.enableRangeSelection : false, disabledDays: opt.disabledDays instanceof Array ? opt.disabledDays : [], disabledWeekDays: opt.disabledWeekDays instanceof Array ? opt.disabledWeekDays : [], hiddenWeekDays: opt.hiddenWeekDays instanceof Array ? opt.hiddenWeekDays : [], roundRangeLimits: opt.roundRangeLimits != null ? opt.roundRangeLimits : false, dataSource: opt.dataSource instanceof Array ? opt.dataSource : [], style: opt.style == 'background' || opt.style == 'border' || opt.style == 'custom' ? opt.style : 'border', enableContextMenu: opt.enableContextMenu != null ? opt.enableContextMenu : false, contextMenuItems: opt.contextMenuItems instanceof Array ? opt.contextMenuItems : [], customDayRenderer : $.isFunction(opt.customDayRenderer) ? opt.customDayRenderer : null, customDataSourceRenderer : $.isFunction(opt.customDataSourceRenderer) ? opt.customDataSourceRenderer : null, weekStart: !isNaN(parseInt(opt.weekStart)) ? parseInt(opt.weekStart) : null }; this._initializeDatasourceColors(); }, _initializeEvents: function(opt) { if(opt == null) { opt = []; } if(opt.yearChanged) { this.element.bind('yearChanged', opt.yearChanged); } if(opt.renderEnd) { this.element.bind('renderEnd', opt.renderEnd); } if(opt.clickDay) { this.element.bind('clickDay', opt.clickDay); } if(opt.dayContextMenu) { this.element.bind('dayContextMenu', opt.dayContextMenu); } if(opt.selectRange) { this.element.bind('selectRange', opt.selectRange); } if(opt.mouseOnDay) { this.element.bind('mouseOnDay', opt.mouseOnDay); } if(opt.mouseOutDay) { this.element.bind('mouseOutDay', opt.mouseOutDay); } }, _initializeDatasourceColors: function() { for(var i = 0; i < this.options.dataSource.length; i++) { if(this.options.dataSource[i].color == null) { this.options.dataSource[i].color = colors[i % colors.length]; } } }, render: function() { this.element.empty(); if(this.options.displayHeader) { this._renderHeader(); } this._renderBody(); this._renderDataSource(); this._applyEvents(); this.element.find('.months-container').fadeIn(500); this._triggerEvent('renderEnd', { currentYear: this.options.startYear }); }, _renderHeader: function() { var header = $(document.createElement('div')); header.addClass('calendar-header panel panel-default'); var headerTable = $(document.createElement('table')); var prevDiv = $(document.createElement('th')); prevDiv.addClass('prev'); if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) { prevDiv.addClass('disabled'); } var prevIcon = $(document.createElement('span')); prevIcon.addClass('glyphicon glyphicon-chevron-left'); prevDiv.append(prevIcon); headerTable.append(prevDiv); var prev2YearDiv = $(document.createElement('th')); prev2YearDiv.addClass('year-title year-neighbor2 hidden-sm hidden-xs'); prev2YearDiv.text(this.options.startYear - 2); if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 2, 11, 31)) { prev2YearDiv.addClass('disabled'); } headerTable.append(prev2YearDiv); var prevYearDiv = $(document.createElement('th')); prevYearDiv.addClass('year-title year-neighbor hidden-xs'); prevYearDiv.text(this.options.startYear - 1); if(this.options.minDate != null && this.options.minDate > new Date(this.options.startYear - 1, 11, 31)) { prevYearDiv.addClass('disabled'); } headerTable.append(prevYearDiv); var yearDiv = $(document.createElement('th')); yearDiv.addClass('year-title'); yearDiv.text(this.options.startYear); headerTable.append(yearDiv); var nextYearDiv = $(document.createElement('th')); nextYearDiv.addClass('year-title year-neighbor hidden-xs'); nextYearDiv.text(this.options.startYear + 1); if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) { nextYearDiv.addClass('disabled'); } headerTable.append(nextYearDiv); var next2YearDiv = $(document.createElement('th')); next2YearDiv.addClass('year-title year-neighbor2 hidden-sm hidden-xs'); next2YearDiv.text(this.options.startYear + 2); if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 2, 0, 1)) { next2YearDiv.addClass('disabled'); } headerTable.append(next2YearDiv); var nextDiv = $(document.createElement('th')); nextDiv.addClass('next'); if(this.options.maxDate != null && this.options.maxDate < new Date(this.options.startYear + 1, 0, 1)) { nextDiv.addClass('disabled'); } var nextIcon = $(document.createElement('span')); nextIcon.addClass('glyphicon glyphicon-chevron-right'); nextDiv.append(nextIcon); headerTable.append(nextDiv); header.append(headerTable); this.element.append(header); }, _renderBody: function() { var monthsDiv = $(document.createElement('div')); monthsDiv.addClass('months-container'); for(var m = 0; m < 12; m++) { /* Container */ var monthDiv = $(document.createElement('div')); monthDiv.addClass('month-container'); monthDiv.data('month-id', m); var firstDate = new Date(this.options.startYear, m, 1); var table = $(document.createElement('table')); table.addClass('month'); /* Month header */ var thead = $(document.createElement('thead')); var titleRow = $(document.createElement('tr')); var titleCell = $(document.createElement('th')); titleCell.addClass('month-title'); titleCell.attr('colspan', this.options.displayWeekNumber ? 8 : 7); titleCell.text(dates[this.options.language].months[m]); titleRow.append(titleCell); thead.append(titleRow); var headerRow = $(document.createElement('tr')); if(this.options.displayWeekNumber) { var weekNumberCell = $(document.createElement('th')); weekNumberCell.addClass('week-number'); weekNumberCell.text(dates[this.options.language].weekShort); headerRow.append(weekNumberCell); } var weekStart = this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart; var d = weekStart; do { var headerCell = $(document.createElement('th')); headerCell.addClass('day-header'); headerCell.text(dates[this.options.language].daysMin[d]); if(this._isHidden(d)) { headerCell.addClass('hidden'); } headerRow.append(headerCell); d++; if(d >= 7) d = 0; } while(d != weekStart) thead.append(headerRow); table.append(thead); /* Days */ var currentDate = new Date(firstDate.getTime()); var lastDate = new Date(this.options.startYear, m + 1, 0); while(currentDate.getDay() != weekStart) { currentDate.setDate(currentDate.getDate() - 1); } while(currentDate <= lastDate) { var row = $(document.createElement('tr')); if(this.options.displayWeekNumber) { var weekNumberCell = $(document.createElement('td')); weekNumberCell.addClass('week-number'); weekNumberCell.text(this.getWeekNumber(currentDate)); row.append(weekNumberCell); } do { var cell = $(document.createElement('td')); cell.addClass('day'); if(this._isHidden(currentDate.getDay())) { cell.addClass('hidden'); } if(currentDate < firstDate) { cell.addClass('old'); } else if(currentDate > lastDate) { cell.addClass('new'); } else { if(this._isDisabled(currentDate)) { cell.addClass('disabled'); } var cellContent = $(document.createElement('div')); cellContent.addClass('day-content'); cellContent.text(currentDate.getDate()); cell.append(cellContent); if(this.options.customDayRenderer) { this.options.customDayRenderer(cellContent, currentDate); } } row.append(cell); currentDate.setDate(currentDate.getDate() + 1); } while(currentDate.getDay() != weekStart) table.append(row); } monthDiv.append(table); monthsDiv.append(monthDiv); } this.element.append(monthsDiv); }, _renderDataSource: function() { var _this = this; if(this.options.dataSource != null && this.options.dataSource.length > 0) { this.element.find('.month-container').each(function() { var month = $(this).data('month-id'); var firstDate = new Date(_this.options.startYear, month, 1); var lastDate = new Date(_this.options.startYear, month + 1, 1); if((_this.options.minDate == null || lastDate > _this.options.minDate) && (_this.options.maxDate == null || firstDate <= _this.options.maxDate)) { var monthData = []; for(var i = 0; i < _this.options.dataSource.length; i++) { if(!(_this.options.dataSource[i].startDate >= lastDate) || (_this.options.dataSource[i].endDate < firstDate)) { monthData.push(_this.options.dataSource[i]); } } if(monthData.length > 0) { $(this).find('.day-content').each(function() { var currentDate = new Date(_this.options.startYear, month, $(this).text()); var nextDate = new Date(_this.options.startYear, month, currentDate.getDate() + 1); var dayData = []; if((_this.options.minDate == null || currentDate >= _this.options.minDate) && (_this.options.maxDate == null || currentDate <= _this.options.maxDate)) { for(var i = 0; i < monthData.length; i++) { if(monthData[i].startDate < nextDate && monthData[i].endDate >= currentDate) { dayData.push(monthData[i]); } } if(dayData.length > 0 && (_this.options.displayDisabledDataSource || !_this._isDisabled(currentDate))) { _this._renderDataSourceDay($(this), currentDate, dayData); } } }); } } }); } }, _renderDataSourceDay: function(elt, currentDate, events) { switch(this.options.style) { case 'border': var weight = 0; if(events.length == 1) { weight = 4; } else if(events.length <= 3) { weight = 2; } else { elt.parent().css('box-shadow', 'inset 0 -4px 0 0 black'); } if(weight > 0) { var boxShadow = ''; for (var i = 0; i < events.length; i++) { if(boxShadow != '') { boxShadow += ","; } boxShadow += 'inset 0 -' + (parseInt(i) + 1) * weight + 'px 0 0 ' + events[i].color; } elt.parent().css('box-shadow', boxShadow); } break; case 'background': elt.parent().css('background-color', events[events.length - 1].color); var currentTime = currentDate.getTime(); if(events[events.length - 1].startDate.getTime() == currentTime) { elt.parent().addClass('day-start'); if(events[events.length - 1].startHalfDay || this.options.alwaysHalfDay) { elt.parent().addClass('day-half'); // Find color for other half var otherColor = 'transparent'; for(var i = events.length - 2; i >= 0; i--) { if(events[i].startDate.getTime() != currentTime || (!events[i].startHalfDay && !this.options.alwaysHalfDay)) { otherColor = events[i].color; break; } } elt.parent().css('background', 'linear-gradient(-45deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')'); } else if(this.options.roundRangeLimits) { elt.parent().addClass('round-left'); } } else if(events[events.length - 1].endDate.getTime() == currentTime) { elt.parent().addClass('day-end'); if(events[events.length - 1].endHalfDay || this.options.alwaysHalfDay) { elt.parent().addClass('day-half'); // Find color for other half var otherColor = 'transparent'; for(var i = events.length - 2; i >= 0; i--) { if(events[i].endDate.getTime() != currentTime || (!events[i].endHalfDay && !this.options.alwaysHalfDay)) { otherColor = events[i].color; break; } } elt.parent().css('background', 'linear-gradient(135deg, ' + events[events.length - 1].color + ', ' + events[events.length - 1].color + ' 49%, ' + otherColor + ' 51%, ' + otherColor + ')'); } else if(this.options.roundRangeLimits) { elt.parent().addClass('round-right'); } } break; case 'custom': if(this.options.customDataSourceRenderer) { this.options.customDataSourceRenderer.call(this, elt, currentDate, events); } break; } }, _applyEvents: function () { var _this = this; /* Header buttons */ this.element.find('.year-neighbor, .year-neighbor2').click(function() { if(!$(this).hasClass('disabled')) { _this.setYear(parseInt($(this).text())); } }); this.element.find('.calendar-header .prev').click(function() { if(!$(this).hasClass('disabled')) { _this.element.find('.months-container').animate({'margin-left':'100%'},100, function() { _this.element.find('.months-container').css('visibility', 'hidden'); _this.element.find('.months-container').css('margin-left', '0'); setTimeout(function() { _this.setYear(_this.options.startYear - 1); }, 50); }); } }); this.element.find('.calendar-header .next').click(function() { if(!$(this).hasClass('disabled')) { _this.element.find('.months-container').animate({'margin-left':'-100%'},100, function() { _this.element.find('.months-container').css('visibility', 'hidden'); _this.element.find('.months-container').css('margin-left', '0'); setTimeout(function() { _this.setYear(_this.options.startYear + 1); }, 50); }); } }); var cells = this.element.find('.day:not(.old, .new, .disabled)'); /* Click on date */ cells.click(function(e) { e.stopPropagation(); var date = _this._getDate($(this)); _this._triggerEvent('clickDay', { element: $(this), which: e.which, date: date, events: _this.getEvents(date) }); }); /* Click right on date */ cells.bind('contextmenu', function(e) { if(_this.options.enableContextMenu) { e.preventDefault(); if(_this.options.contextMenuItems.length > 0) { _this._openContextMenu($(this)); } } var date = _this._getDate($(this)); _this._triggerEvent('dayContextMenu', { element: $(this), date: date, events: _this.getEvents(date) }); }); /* Range selection */ if(this.options.enableRangeSelection) { cells.mousedown(function (e) { if(e.which == 1) { var currentDate = _this._getDate($(this)); if(_this.options.allowOverlap || _this.getEvents(currentDate).length == 0) { _this._mouseDown = true; _this._rangeStart = _this._rangeEnd = currentDate; _this._refreshRange(); } } }); cells.mouseenter(function (e) { if (_this._mouseDown) { var currentDate = _this._getDate($(this)); if(!_this.options.allowOverlap) { var newDate = new Date(_this._rangeStart.getTime()); if(newDate < currentDate) { var nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() + 1); while(newDate < currentDate) { if(_this.getEvents(nextDate).length > 0) { break; } newDate.setDate(newDate.getDate() + 1); nextDate.setDate(nextDate.getDate() + 1); } } else { var nextDate = new Date(newDate.getFullYear(), newDate.getMonth(), newDate.getDate() - 1); while(newDate > currentDate) { if(_this.getEvents(nextDate).length > 0) { break; } newDate.setDate(newDate.getDate() - 1); nextDate.setDate(nextDate.getDate() - 1); } } currentDate = newDate; } var oldValue = _this._rangeEnd; _this._rangeEnd = currentDate; if (oldValue.getTime() != _this._rangeEnd.getTime()) { _this._refreshRange(); } } }); $(window).mouseup(function (e) { if (_this._mouseDown) { _this._mouseDown = false; _this._refreshRange(); var minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd; var maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart; _this._triggerEvent('selectRange', { startDate: minDate, endDate: maxDate, events: _this.getEventsOnRange(minDate, new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate() + 1)) }); } }); } /* Hover date */ cells.mouseenter(function(e) { if(!_this._mouseDown) { var date = _this._getDate($(this)); _this._triggerEvent('mouseOnDay', { element: $(this), date: date, events: _this.getEvents(date) }); } }); cells.mouseleave(function(e) { var date = _this._getDate($(this)); _this._triggerEvent('mouseOutDay', { element: $(this), date: date, events: _this.getEvents(date) }); }); /* Responsive management */ setInterval(function() { var calendarSize = $(_this.element).width(); var monthSize = $(_this.element).find('.month').first().width() + 10; var monthContainerClass = 'month-container'; if(monthSize * 6 < calendarSize) { monthContainerClass += ' col-xs-2'; } else if(monthSize * 4 < calendarSize) { monthContainerClass += ' col-xs-3'; } else if(monthSize * 3 < calendarSize) { monthContainerClass += ' col-xs-4'; } else if(monthSize * 2 < calendarSize) { monthContainerClass += ' col-xs-6'; } else { monthContainerClass += ' col-xs-12'; } $(_this.element).find('.month-container').attr('class', monthContainerClass); }, 300); }, _refreshRange: function () { var _this = this; this.element.find('td.day.range').removeClass('range') this.element.find('td.day.range-start').removeClass('range-start'); this.element.find('td.day.range-end').removeClass('range-end'); if (this._mouseDown) { var beforeRange = true; var afterRange = false; var minDate = _this._rangeStart < _this._rangeEnd ? _this._rangeStart : _this._rangeEnd; var maxDate = _this._rangeEnd > _this._rangeStart ? _this._rangeEnd : _this._rangeStart; this.element.find('.month-container').each(function () { var monthId = $(this).data('month-id'); if (minDate.getMonth() <= monthId && maxDate.getMonth() >= monthId) { $(this).find('td.day:not(.old, .new)').each(function () { var date = _this._getDate($(this)); if (date >= minDate && date <= maxDate) { $(this).addClass('range'); if (date.getTime() == minDate.getTime()) { $(this).addClass('range-start'); } if (date.getTime() == maxDate.getTime()) { $(this).addClass('range-end'); } } }); } }); } }, _openContextMenu: function(elt) { var contextMenu = $('.calendar-context-menu'); if(contextMenu.length > 0) { contextMenu.hide(); contextMenu.empty(); } else { contextMenu = $(document.createElement('div')); contextMenu.addClass('calendar-context-menu'); $('body').append(contextMenu); } var date = this._getDate(elt); var events = this.getEvents(date); for(var i = 0; i < events.length; i++) { var eventItem = $(document.createElement('div')); eventItem.addClass('item'); eventItem.css('border-left', '4px solid ' + events[i].color); var eventItemContent = $(document.createElement('div')); eventItemContent.addClass('content'); eventItemContent.text(events[i].name); eventItem.append(eventItemContent); var icon = $(document.createElement('span')); icon.addClass('glyphicon glyphicon-chevron-right'); eventItem.append(icon); this._renderContextMenuItems(eventItem, this.options.contextMenuItems, events[i]); contextMenu.append(eventItem); } if(contextMenu.children().length > 0) { contextMenu.css('left', elt.offset().left + 25 + 'px'); contextMenu.css('top', elt.offset().top + 25 + 'px'); contextMenu.show(); $(window).one('mouseup', function() { contextMenu.hide(); }); } }, _renderContextMenuItems: function(parent, items, evt) { var subMenu = $(document.createElement('div')); subMenu.addClass('submenu'); for(var i = 0; i < items.length; i++) { if(!items[i].visible || items[i].visible(evt)) { var menuItem = $(document.createElement('div')); menuItem.addClass('item'); var menuItemContent = $(document.createElement('div')); menuItemContent.addClass('content'); menuItemContent.text(items[i].text); menuItem.append(menuItemContent); if(items[i].click) { (function(index) { menuItem.click(function() { items[index].click(evt); }); })(i); } var icon = $(document.createElement('span')); icon.addClass('glyphicon glyphicon-chevron-right'); menuItem.append(icon); if(items[i].items && items[i].items.length > 0) { this._renderContextMenuItems(menuItem, items[i].items, evt); } subMenu.append(menuItem); } } if(subMenu.children().length > 0) { parent.append(subMenu); } }, _getColor: function(colorString) { var div = $('
'); div.css('color', colorString); }, _getDate: function(elt) { var day = elt.children('.day-content').text(); var month = elt.closest('.month-container').data('month-id'); var year = this.options.startYear; return new Date(year, month, day); }, _triggerEvent: function(eventName, parameters) { var event = $.Event(eventName); for(var i in parameters) { event[i] = parameters[i]; } this.element.trigger(event); return event; }, _isDisabled: function(date) { if((this.options.minDate != null && date < this.options.minDate) || (this.options.maxDate != null && date > this.options.maxDate)) { return true; } if(this.options.disabledWeekDays.length > 0) { for(var d = 0; d < this.options.disabledWeekDays.length; d++){ if(date.getDay() == this.options.disabledWeekDays[d]) { return true; } } } if(this.options.disabledDays.length > 0) { for(var d = 0; d < this.options.disabledDays.length; d++){ if(date.getTime() == this.options.disabledDays[d].getTime()) { return true; } } } return false; }, _isHidden: function(day) { if(this.options.hiddenWeekDays.length > 0) { for(var d = 0; d < this.options.hiddenWeekDays.length; d++) { if(day == this.options.hiddenWeekDays[d]) { return true; } } } return false; }, getWeekNumber: function(date) { var tempDate = new Date(date.getTime()); tempDate.setHours(0, 0, 0, 0); tempDate.setDate(tempDate.getDate() + 3 - (tempDate.getDay() + 6) % 7); var week1 = new Date(tempDate.getFullYear(), 0, 4); return 1 + Math.round(((tempDate.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7); }, getEvents: function(date) { return this.getEventsOnRange(date, new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1)); }, getEventsOnRange: function(startDate, endDate) { var events = []; if(this.options.dataSource && startDate && endDate) { for(var i = 0; i < this.options.dataSource.length; i++) { if(this.options.dataSource[i].startDate < endDate && this.options.dataSource[i].endDate >= startDate) { events.push(this.options.dataSource[i]); } } } return events; }, getYear: function() { return this.options.startYear; }, setYear: function(year) { var parsedYear = parseInt(year); if(!isNaN(parsedYear)) { this.options.startYear = parsedYear; this.element.empty(); if(this.options.displayHeader) { this._renderHeader(); } var eventResult = this._triggerEvent('yearChanged', { currentYear: this.options.startYear, preventRendering: false }); if(!eventResult.preventRendering) { this.render(); } } }, getMinDate: function() { return this.options.minDate; }, setMinDate: function(date, preventRendering) { if(date instanceof Date) { this.options.minDate = date; if(!preventRendering) { this.render(); } } }, getMaxDate: function() { return this.options.maxDate; }, setMaxDate: function(date, preventRendering) { if(date instanceof Date) { this.options.maxDate = date; if(!preventRendering) { this.render(); } } }, getStyle: function() { return this.options.style; }, setStyle: function(style, preventRendering) { this.options.style = style == 'background' || style == 'border' || style == 'custom' ? style : 'border'; if(!preventRendering) { this.render(); } }, getAllowOverlap: function() { return this.options.allowOverlap; }, setAllowOverlap: function(allowOverlap) { this.options.allowOverlap = allowOverlap; }, getDisplayWeekNumber: function() { return this.options.displayWeekNumber; }, setDisplayWeekNumber: function(displayWeekNumber, preventRendering) { this.options.displayWeekNumber = displayWeekNumber; if(!preventRendering) { this.render(); } }, getDisplayHeader: function() { return this.options.displayHeader; }, setDisplayHeader: function(displayHeader, preventRendering) { this.options.displayHeader = displayHeader; if(!preventRendering) { this.render(); } }, getDisplayDisabledDataSource: function() { return this.options.displayDisabledDataSource; }, setDisplayDisabledDataSource: function(displayDisabledDataSource, preventRendering) { this.options.displayDisabledDataSource = displayDisabledDataSource; if(!preventRendering) { this.render(); } }, getAlwaysHalfDay: function() { return this.options.alwaysHalfDay; }, setAlwaysHalfDay: function(alwaysHalfDay, preventRendering) { this.options.alwaysHalfDay = alwaysHalfDay; if(!preventRendering) { this.render(); } }, getEnableRangeSelection: function() { return this.options.enableRangeSelection; }, setEnableRangeSelection: function(enableRangeSelection, preventRendering) { this.options.enableRangeSelection = enableRangeSelection; if(!preventRendering) { this.render(); } }, getDisabledDays: function() { return this.options.disabledDays; }, setDisabledDays: function(disabledDays, preventRendering) { this.options.disabledDays = disabledDays instanceof Array ? disabledDays : []; if(!preventRendering) { this.render(); } }, getDisabledWeekDays: function() { return this.options.disabledWeekDays; }, setDisabledWeekDays: function(disabledWeekDays, preventRendering) { this.options.disabledWeekDays = disabledWeekDays instanceof Array ? disabledWeekDays : []; if(!preventRendering) { this.render(); } }, getHiddenWeekDays: function() { return this.options.hiddenWeekDays; }, setHiddenWeekDays: function(hiddenWeekDays, preventRendering) { this.options.hiddenWeekDays = hiddenWeekDays instanceof Array ? hiddenWeekDays : []; if(!preventRendering) { this.render(); } }, getRoundRangeLimits: function() { return this.options.roundRangeLimits; }, setRoundRangeLimits: function(roundRangeLimits, preventRendering) { this.options.roundRangeLimits = roundRangeLimits; if(!preventRendering) { this.render(); } }, getEnableContextMenu: function() { return this.options.enableContextMenu; }, setEnableContextMenu: function(enableContextMenu, preventRendering) { this.options.enableContextMenu = enableContextMenu; if(!preventRendering) { this.render(); } }, getContextMenuItems: function() { return this.options.contextMenuItems; }, setContextMenuItems: function(contextMenuItems, preventRendering) { this.options.contextMenuItems = contextMenuItems instanceof Array ? contextMenuItems : []; if(!preventRendering) { this.render(); } }, getCustomDayRenderer: function() { return this.options.customDayRenderer; }, setCustomDayRenderer: function(customDayRenderer, preventRendering) { this.options.customDayRenderer = $.isFunction(customDayRenderer) ? customDayRenderer : null; if(!preventRendering) { this.render(); } }, getCustomDataSourceRenderer: function() { return this.options.customDataSourceRenderer; }, setCustomDataSourceRenderer: function(customDataSourceRenderer, preventRendering) { this.options.customDataSourceRenderer = $.isFunction(customDataSourceRenderer) ? customDataSourceRenderer : null; if(!preventRendering) { this.render(); } }, getLanguage: function() { return this.options.language; }, setLanguage: function(language, preventRendering) { if(language != null && dates[language] != null) { this.options.language = language; if(!preventRendering) { this.render(); } } }, getDataSource: function() { return this.options.dataSource; }, setDataSource: function(dataSource, preventRendering) { this.options.dataSource = dataSource instanceof Array ? dataSource : []; this._initializeDatasourceColors(); if(!preventRendering) { this.render(); } }, getWeekStart: function() { return this.options.weekStart ? this.options.weekStart : dates[this.options.language].weekStart; }, setWeekStart: function(weekStart, preventRendering) { this.options.weekStart = !isNaN(parseInt(weekStart)) ? parseInt(weekStart) : null; if(!preventRendering) { this.render(); } }, addEvent: function(evt, preventRendering) { this.options.dataSource.push(evt); if(!preventRendering) { this.render(); } } } $.fn.calendar = function (options) { var calendar = new Calendar($(this) ,options); $(this).data('calendar', calendar); return calendar; } /* Events binding management */ $.fn.yearChanged = function(fct) { $(this).bind('yearChanged', fct); } $.fn.renderEnd = function(fct) { $(this).bind('renderEnd', fct); } $.fn.clickDay = function(fct) { $(this).bind('clickDay', fct); } $.fn.dayContextMenu = function(fct) { $(this).bind('dayContextMenu', fct); } $.fn.selectRange = function(fct) { $(this).bind('selectRange', fct); } $.fn.mouseOnDay = function(fct) { $(this).bind('mouseOnDay', fct); } $.fn.mouseOutDay = function(fct) { $(this).bind('mouseOutDay', fct); } var dates = $.fn.calendar.dates = { en: { days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], weekShort: 'W', weekStart:0 } }; var colors = $.fn.calendar.colors = ['#2C8FC9', '#9CB703', '#F5BB00', '#FF4A32', '#B56CE2', '#45A597']; $(function(){ $('[data-provide="calendar"]').each(function() { $(this).calendar(); }); }); }(window.jQuery));