123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110 |
- /* =========================================================
- * 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 />');
- 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));
|