PageSourceSearch

https://www.eastlakecommons.org/plugins/evo-calendar/evo-calendar.js

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

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.