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