PageSourceSearch

https://cangas.gal/themes/gavias_tico/templates/page/evo-calendar.js

js cangas.gal collected 2026-10-02 12:11:22 UTC 22,864 bytes, 591 lines download raw bytes

1/*
2
3    Author: Edlyn Villegas
4
5*/
6
7(function(factory) {
8    'use strict';
9    if (typeof define === 'function' && define.amd) {
10        define(['jquery'], factory);
11    } else if (typeof exports !== 'undefined') {
12        module.exports = factory(require('jquery'));
13    } else {
14        factory(jQuery);
15    }
16
17}(function($) {
18    'use strict';
19    var EvoCalendar = window.EvoCalendar || {};
20
21    EvoCalendar = (function() {
22
23        var instanceUid = 0;
24
25
26        function UTCDate(){
27            return new Date(Date.UTC.apply(Date, arguments));
28        }
29        function getDateToday() {
30            return new Date();
31        }
32        function EvoCalendar(element, settings) {
33            var language = drupalSettings.path.currentLanguage;
34            var _ = this, dataSettings;
35            _.defaults = {
36                format: 'mm/dd/yyyy',
37                titleFormat: 'MM yyyy',
38                eventHeaderFormat: 'MM d, yyyy',
39                language: 'en',
40                todayHighlight: false,
41                sidebarToggler: true,
42                eventListToggler: true,
43                calendarEvents: null,
44                canAddEvent: true,
45
46                onSelectDate: null,
47                onAddEvent: null
48            };
49
50            _.initials = {
51                validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g,
52                dates: {
53                    en: {
54                        days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
55                        daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
56                        daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
57                        months: ['Xaneiro', 'Febreiro', 'Marzo', 'Abril','Maio', 'Xuño', 'Xullo', 'Agosto', 'Setembro','Outubro', 'Novembro', 'Decembro'],
58                        monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
59                    }
60                }
61            }
62
63            _.options = $.extend({}, _.defaults, settings);
64
65            if(_.options.calendarEvents != null) {
66                for(var i=0; i < _.options.calendarEvents.length; i++) {
67                    if(_.isValidDate(_.options.calendarEvents[i].date)) {
68                        _.options.calendarEvents[i].date = _.formatDate(new Date(_.options.calendarEvents[i].date), _.options.format, 'en')
69                    }
70                }
71            }
72            console.log(_.options)
73
74            if (language == "es") {
75
76            _.$cal_days_labels = ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab'];
77
78        } else {
79_.$cal_days_labels = ['Dom', 'Lun', 'Mar', 'Mer', 'Xov', 'Ven', 'Sab'];
80
81        }
82
83            // these are human-readable month name labels, in order
84            _.$cal_months_labels = ['January', 'February', 'March', 'April',
85                                 'May', 'June', 'July', 'August', 'September',
86                                 'October', 'November', 'December'];
87
88
89
90            if (language == "es") {
91
92              _.$cal_months_labels_2 = ['Enero', 'Febrero', 'Marzo', 'Abril',
93                                   'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre',
94                                   'Octubre', 'Noviembre', 'Diciembre'];
95            } else {
96                _.$cal_months_labels_2 = ['Xaneiro', 'Febreiro', 'Marzo', 'Abril','Maio', 'Xuño', 'Xullo', 'Agosto', 'Setembro','Outubro', 'Novembro', 'Decembro'];
97            }
98
99
100            // these are the days of the week for each month, in order
101            _.$cal_days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
102
103            // this is the current date
104            _.$cal_current_date = new Date();
105
106            _.$month = (isNaN(_.$month) || _.$month == null) ? _.$cal_current_date.getMonth() : _.$month; // 0
107            _.$year  = (isNaN(_.$year) || _.$year == null) ? _.$cal_current_date.getFullYear() : _.$year; // 2020
108            _.$mainHTML = '';
109            _.$sidebarHTML = '';
110            _.$calendarHTML = '';
111            _.$eventHTML = '';
112
113            _.$active_day_el = null;
114            _.$active_date = _.formatDate(new Date(), _.options.format, 'en');
115            _.$active_month_el = null;
116            _.$active_month = _.$month;
117            _.$active_year_el = null;
118            _.$active_year = _.$year;
119
120            _.$calendar = $(element);
121            _.$calendar_sidebar = '';
122            _.$calendar_inner = '';
123            _.$calendar_events = '';
124
125
126            _.selectDate = $.proxy(_.selectDate, _);
127            _.selectMonth = $.proxy(_.selectMonth, _);
128            _.selectYear = $.proxy(_.selectYear, _);
129            _.toggleSidebar = $.proxy(_.toggleSidebar, _);
130            _.toggleEventList = $.proxy(_.toggleEventList, _);
131
132            _.parseFormat = $.proxy(_.parseFormat, _);
133            _.formatDate = $.proxy(_.formatDate, _);
134
135
136
137
138            _.init(true);
139        }
140
141        return EvoCalendar;
142
143    }());
144
145
146    EvoCalendar.prototype.init = function(creation) {
147
148        var _ = this;
149
150
151        if (!$(_.$calendar).hasClass('calendar-initialized')) {
152
153            $(_.$calendar).addClass('evo-calendar calendar-initialized');
154
155            _.buildCalendar('all');
156        }
157    };
158
159    EvoCalendar.prototype.buildCalendar = function(val, new_month, new_year) {
160        var _ = this;
161
162        // get first day of month
163        new_month = (isNaN(new_month) || new_month == null) ? _.$active_month : new_month;
164        new_year = (isNaN(new_year) || new_year == null) ? _.$active_year : new_year;
165        var firstDay = new Date(new_year, new_month);
166        var startingDay = firstDay.getDay();
167
168        // find number of days in month
169        var monthLength = _.$cal_days_in_month[new_month];
170
171        // compensate for leap year
172        if (new_month == 1) { // February only!
173            if((new_year % 4 == 0 && new_year % 100 != 0) || new_year % 400 == 0){
174                monthLength = 29;
175            }
176        }
177        // do the header
178
179
180        var monthName =  new_month + 1 ;
181        // var monthName =  _.$cal_months_labels[new_month];
182
183
184        var monthNameCalendar =  _.$cal_months_labels_2[new_month];
185
186
187        var mainHTML = '';
188        var sidebarHTML = '';
189        var calendarHTML = '';
190
191
192
193        function buildMainHTML() {
194            var mainHTML = '<div class="calendar-sidebar"></div><div class="calendar-inner"></div><div class="calendar-events"></div>';
195            if(_.options.canAddEvent) {
196                mainHTML += '<span id="eventAddButton" title="Add event">ADD EVENT</span>';
197            }
198            if(_.options.eventListToggler) {
199                mainHTML += '<span id="eventListToggler" title="Close event list"><button class="icon-button"><span class="chevron-arrow-right"></span></button></span>';
200            }
201            _.$mainHTML = mainHTML;
202        }
203
204        function buildSidebarHTML() {
205            sidebarHTML = '<div class="calendar-year"><button class="icon-button" year-val="prev" title="Previous year"><span class="chevron-arrow-left"></span></button>&nbsp;<p>'+new_year+'&nbsp;</p><button class="icon-button" year-val="next" title="Next year"><span class="chevron-arrow-right"></span></button></div>';
206            sidebarHTML += '<ul class="calendar-months">';
207            for(var i = 0; i < _.$cal_months_labels.length; i++) {
208                sidebarHTML += '<li class="month';
209                sidebarHTML += (parseInt(_.$active_month) === i) ? ' active-month' : ''
210                sidebarHTML += '" month-val="'+i+'">'+_.$cal_months_labels[i]+'</li>';
211            }
212            sidebarHTML += '</ul>';
213            if(_.options.sidebarToggler) {
214                sidebarHTML += '<span id="sidebarToggler" title="Close sidebar"><button class="icon-button"><span class="bars"></span></button></span>';
215            }
216            _.$sidebarHTML = sidebarHTML;
217        }
218
219        function buildCalendarHTML() {
220            calendarHTML = '<table class="calendar-table">';
221            calendarHTML += '<tr><th colspan="7">';
222            calendarHTML +=  monthNameCalendar;
223            calendarHTML += '</th></tr>';
224            calendarHTML += '<tr class="calendar-header">';
225            for(var i = 0; i <= 6; i++ ){
226                calendarHTML += '<td class="calendar-header-day">';
227                calendarHTML += _.$cal_days_labels[i];
228                calendarHTML += '</td>';
229            }
230            calendarHTML += '</tr><tr class="calendar-body">';
231            // fill in the days
232            var day = 1;
233            // this loop is for is weeks (rows)
234            for (var i = 0; i < 9; i++) {
235                // this loop is for weekdays (cells)
236                for (var j = 0; j <= 6; j++) {
237                    calendarHTML += '<td class="calendar-day">';
238                    if (day <= monthLength && (i > 0 || j >= startingDay)) {
239                        var thisDay = _.formatDate(new Date(monthName +'/'+ day +'/'+ new_year) , _.options.format, 'en');
240
241                        calendarHTML += '<div class="day'
242                        calendarHTML += ((_.$active_date === thisDay) ? ' calendar-active' : '') + '" date-val="'+thisDay+'">'+day+'</div>';
243                        day++;
244                    }
245                    calendarHTML += '</td>';
246                }
247                // stop making rows if we've run out of days
248                if (day > monthLength) {
249                  break;
250                } else {
251                  calendarHTML += '</tr><tr class="calendar-body">';
252                }
253            }
254            calendarHTML += '</tr></table>';
255            _.$calendarHTML = calendarHTML;
256        }
257
258        function buildEventListHTML() {
259            console.log('buildEventListHTML()')
260            if(_.options.calendarEvents != null) {
261                var eventHTML = '<div class="event-header"><p>'+_.formatDate(new Date(_.$active_date), _.options.eventHeaderFormat, 'en')+'</p></div>';
262                var hasEventToday = false;
263                eventHTML += '<div>';
264                for (var i = 0; i < _.options.calendarEvents.length; i++) {
265                    if(_.$active_date === _.options.calendarEvents[i].date) {
266                        hasEventToday = true;
267                        eventHTML += '<a class="event-container" href="'+_.options.calendarEvents[i].link+'">';
268                        eventHTML += '<div class="event-icon"><div class="event-bullet-'+_.options.calendarEvents[i].type+'"></div></div>';
269                        eventHTML += '<div class="event-info"><p>'+_.options.calendarEvents[i].name+'</p></div>';
270                        eventHTML += '</a>';
271                    } else if (_.options.calendarEvents[i].everyYear) {
272                        var d = _.formatDate(new Date(_.$active_date), 'mm/dd', 'en');
273                        var dd = _.formatDate(new Date(_.options.calendarEvents[i].date), 'mm/dd', 'en');
274                        if(d==dd) {
275                            hasEventToday = true;
276                            eventHTML += '<a class="event-container" href="'+_.options.calendarEvents[i].link+'">';
277                            eventHTML += '<div class="event-icon"><div class="event-bullet-'+_.options.calendarEvents[i].type+'"></div></div>';
278                            eventHTML += '<div class="event-info"><p>'+_.options.calendarEvents[i].name+'</p></div>';
279                            eventHTML += '</a>';
280                        }
281                    }
282                };
283                if(!hasEventToday) {
284
285                  var language = drupalSettings.path.currentLanguage;
286
287                  if (language == "es") {
288                    eventHTML += '<p>No hay eventos para el día seleccionado.</p>';
289
290                  } else {
291                    eventHTML += '<p>Non hai eventos o día seleccionado.</p>';
292
293                  }
294
295                }
296                eventHTML += '</div>';
297                _.$eventHTML = eventHTML;
298            }
299        }
300
301        if(val == 'all') {
302            buildMainHTML();
303            buildSidebarHTML();
304            buildCalendarHTML();
305            buildEventListHTML();
306        } else if (val == 'sidebar') {
307            buildSidebarHTML();
308        } else if (val == 'inner') {
309            console.log('buildCalendar---inner', _.options.calendarEvents);
310            buildCalendarHTML();
311        } else if (val == 'events') {
312            buildEventListHTML();
313        }
314
315        _.setHTML(val);
316    };
317
318    // Set the HTML to element
319    EvoCalendar.prototype.setHTML = function(val) {
320        var _ = this;
321
322        if(val == 'all') {
323            _.$calendar.html(_.$mainHTML);
324            _.$calendar_sidebar = $('.calendar-sidebar');
325            _.$calendar_inner = $('.calendar-inner');
326            _.$calendar_events = $('.calendar-events');
327
328            _.$calendar_sidebar.html(_.$sidebarHTML);
329            _.$calendar_inner.html(_.$calendarHTML);
330            _.$calendar_events.html(_.$eventHTML);
331        } else if (val == 'sidebar') {
332            _.$calendar_sidebar = $('.calendar-sidebar');
333            _.$calendar_sidebar.html(_.$sidebarHTML);
334        } else if (val == 'inner') {
335            _.$calendar_inner = $('.calendar-inner');
336            _.$calendar_inner.html(_.$calendarHTML);
337        } else if (val == 'events') {
338            _.$calendar_events = $('.calendar-events');
339            _.$calendar_events.html(_.$eventHTML);
340        }
341
342        if(_.options.calendarEvents != null) {
343            _.initCalendarEvents();
344        }
345
346        if(_.options.todayHighlight) {
347            $('.day[date-val="'+_.formatDate((_.$month + 1) +'/'+ _.$cal_current_date.getDate() +'/'+ _.$year, _.options.format, 'en')+'"]').addClass('calendar-today');
348        }
349
350        _.initEventListener();
351    };
352
353    // Add calendar events
354    EvoCalendar.prototype.initCalendarEvents = function() {
355        var _ = this;
356        // prevent duplication
357        $('.event-indicator').empty();
358        // find number of days in month
359        var monthLength = _.$cal_days_in_month[_.$active_month];
360
361        // compensate for leap year
362        if (_.$active_month == 1) { // February only!
363            if((_.$active_year % 4 == 0 && _.$active_year % 100 != 0) || _.$active_year % 400 == 0){
364                monthLength = 29;
365            }
366        }
367
368        for (var i = 0; i < _.options.calendarEvents.length; i++) {
369            for (var x = 0; x < monthLength; x++) {
370                var active_date = _.formatDate(new Date((_.$active_month+1) +'/'+ (x + 1) +'/'+ _.$active_year), _.options.format, 'en');
371                // console.log(active_date, _.formatDate(new Date(_.options.calendarEvents[i].date), _.options.format, 'en'))
372
373                var thisDate = $('[date-val="'+active_date+'"]');
374                if(active_date==_.options.calendarEvents[i].date) {
375                    thisDate.addClass('calendar-'+ _.options.calendarEvents[i].type);
376
377                    if($('[date-val="'+active_date+'"] span.event-indicator').length == 0) {
378                        thisDate.append('<span class="event-indicator"></span>');
379                    }
380
381                    if($('[date-val="'+active_date+'"] span.event-indicator > .type-bullet > .type-'+_.options.calendarEvents[i].type).length == 0) {
382                        var htmlToAppend = '<div class="type-bullet"><div class="type-'+_.options.calendarEvents[i].type+'"></div></div>';
383                        thisDate.find('.event-indicator').append(htmlToAppend);
384                    }
385                } else if (_.options.calendarEvents[i].everyYear) {
386                    var d = _.formatDate(new Date(active_date), 'mm/dd', 'en');
387                    var dd = _.formatDate(new Date(_.options.calendarEvents[i].date), 'mm/dd', 'en');
388                    if(d==dd) {
389                        thisDate.addClass('calendar-'+ _.options.calendarEvents[i].type);
390
391                        if($('[date-val="'+active_date+'"] span.event-indicator').length == 0) {
392                            thisDate.append('<span class="event-indicator"></span>');
393                        }
394
395                        if($('[date-val="'+active_date+'"] span.event-indicator > .type-bullet > .type-'+_.options.calendarEvents[i].type).length == 0) {
396                            var htmlToAppend = '<div class="type-bullet"><div class="type-'+_.options.calendarEvents[i].type+'"></div></div>';
397                            thisDate.find('.event-indicator').append(htmlToAppend);
398                        }
399                    }
400                }
401            }
402        };
403    };
404
405    // Add listeners
406    EvoCalendar.prototype.initEventListener = function() {
407        var _ = this;
408
409        if(_.options.sidebarToggler) {
410            $('#sidebarToggler')
411               .off('click.evocalendar')
412               .on('click.evocalendar', _.toggleSidebar);
413        }
414        if(_.options.eventListToggler) {
415            $('#eventListToggler')
416               .off('click.evocalendar')
417               .on('click.evocalendar', _.toggleEventList);
418        }
419        if(_.options.canAddEvent) {
420            $('#eventAddButton')
421               .off('click.evocalendar')
422               .on('click.evocalendar', _.options.onAddEvent);
423        }
424
425
426        $('[date-val]')
427           .off('click.evocalendar')
428           .on('click.evocalendar', _.selectDate)
429           .on('click.evocalendar', _.options.onSelectDate);
430
431        // set event listener for each month
432        $('[month-val]')
433           .off('click.evocalendar')
434           .on('click.evocalendar', _.selectMonth);
435
436        // set event listener for year
437        $('[year-val]')
438           .off('click.evocalendar')
439           .on('click.evocalendar', _.selectYear);
440
441    };
442
443    // select year
444    EvoCalendar.prototype.selectYear = function(event) {
445        var _ = this;
446
447        _.$active_year_el = $(event.currentTarget);
448
449        if($(event.currentTarget).attr("year-val") == "prev") {
450            --_.$active_year;
451        } else if ($(event.currentTarget).attr("year-val") == "next") {
452            ++_.$active_year;
453        } else {
454
455        }
456
457        $('[year-val]').removeClass('active-year');
458        $(_.$active_year_el).addClass('active-year');
459
460        $('.calendar-year p').text(_.$active_year);
461         _.buildCalendar('inner', null, _.$active_year);
462    };
463
464    // select month
465    EvoCalendar.prototype.selectMonth = function(event) {
466        var _ = this;
467
468        _.$active_month = $(event.currentTarget).attr("month-val");
469        _.$active_month_el = $("li[month-val="+_.$active_month+"]");
470        $(_.$active_month_el).addClass('active-month');
471
472        $('[month-val]').removeClass('active-month');
473        $('[month-val='+_.$active_month+']').addClass('active-month');
474         _.buildCalendar('inner', _.$active_month);
475    };
476
477    // select specific date
478    EvoCalendar.prototype.selectDate = function(event) {
479        var _ = this;
480
481        _.$active_day_el = $(event.currentTarget);
482        _.$active_date = _.$active_day_el.attr("date-val");
483        $('.day').removeClass('calendar-active');
484        $(_.$active_day_el).addClass('calendar-active');
485         _.buildCalendar('events');
486    };
487
488    // toggle sidebar
489    EvoCalendar.prototype.toggleSidebar = function(event) {
490        var _ = this;
491
492        if($(_.$calendar).hasClass('sidebar-hide')) {
493            $(_.$calendar).removeClass('sidebar-hide');
494        } else {
495            $(_.$calendar).addClass('sidebar-hide');
496        }
497    };
498
499    // toggle event list
500    EvoCalendar.prototype.toggleEventList = function(event) {
501        var _ = this;
502
503        if($(_.$calendar).hasClass('event-hide')) {
504            $(_.$calendar).removeClass('event-hide');
505        } else {
506            $(_.$calendar).addClass('event-hide');
507        }
508    };
509
510    // toggle event list
511    EvoCalendar.prototype.addCalendarEvent = function(new_data) {
512        var _ = this;
513        var data = new_data;
514        for(var i=0; i < data.length; i++) {
515            if(_.isValidDate(data[i].date)) {
516                data[i].date = _.formatDate(new Date(data[i].date), _.options.format, 'en');
517                _.options.calendarEvents.push(data[i]);
518            }
519        }
520         _.buildCalendar('inner');
521         _.buildCalendar('events');
522    };
523
524    EvoCalendar.prototype.parseFormat = function(format) {
525        var _ = this;
526
527        if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function')
528            return format;
529        // IE treats \0 as a string end in inputs (truncating the value),
530        // so it's a bad format delimiter, anyway
531        var separators = format.replace(_.initials.validParts, '\0').split('\0'),
532            parts = format.match(_.initials.validParts);
533        if (!separators || !separators.length || !parts || parts.length === 0){
534            throw new Error("Invalid date format.");
535        }
536        return {separators: separators, parts: parts};
537    };
538
539    EvoCalendar.prototype.isValidDate = function(d){
540        return new Date(d) && !isNaN(new Date(d).getTime());
541    }
542    EvoCalendar.prototype.formatDate = function(date, format, language){
543        var _ = this;
544        if (!date)
545            return '';
546        if (typeof format === 'string')
547            format = _.parseFormat(format);
548        if (format.toDisplay)
549            return format.toDisplay(date, format, language);
550        var val = {
551            d: new Date(date).getDate(),
552            D: _.initials.dates[language].daysShort[new Date(date).getDay()],
553            DD: _.initials.dates[language].days[new Date(date).getDay()],
554            m: new Date(date).getMonth() + 1,
555            M: _.initials.dates[language].monthsShort[new Date(date).getMonth()],
556            MM: _.initials.dates[language].months[new Date(date).getMonth()],
557            yy: new Date(date).getFullYear().toString().substring(2),
558            yyyy: new Date(date).getFullYear()
559        };
560        val.dd = (val.d < 10 ? '0' : '') + val.d;
561        val.mm = (val.m < 10 ? '0' : '') + val.m;
562        date = [];
563        var seps = $.extend([], format.separators);
564        for (var i=0, cnt = format.parts.length; i <= cnt; i++){
565            if (seps.length)
566                date.push(seps.shift());
567            date.push(val[format.parts[i]]);
568        }
569        return date.join('');
570    };
571
572
573
574    $.fn.evoCalendar = function() {
575        var _ = this,
576            opt = arguments[0],
577            args = Array.prototype.slice.call(arguments, 1),
578            l = _.length,
579            i,
580            ret;
581        for (i = 0; i < l; i++) {
582            if (typeof opt == 'object' || typeof opt == 'undefined')
583                _[i].evoCalendar = new EvoCalendar(_[i], opt);
584            else
585                ret = _[i].evoCalendar[opt].apply(_[i].evoCalendar, args);
586            if (typeof ret != 'undefined') return ret;
587        }
588        return _;
589    };
590
591}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.