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> <p>'+new_year+' </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.