1(function ($) { 2 'use strict'; 3 4 // Events source 5 var source_json = 'https://jsc.lt/events-json/'; 6 var source_php = 'https://jsc.lt/events-json/'; 7 8 // Global events variables 9 var quick_events = []; 10 11 // Global time variables 12 var today = new Date(); 13 var today_date_g = today.getDate(); 14 var today_month_g = today.getMonth() + 1; 15 var today_year_g = today.getFullYear(); 16 17 // Global variables 18 var date_start; 19 var order_num = 0; 20 var word_day; 21 var word_month; 22 23 // Short title 24 function shortTitle(text, num) { 25 if(text) { 26 // Get num of word 27 var text_array = text.split(' '); 28 if (text_array.length > num) { 29 return text_array.slice(0, num).join(' ') + ' ...'; 30 } 31 return text; 32 } 33 return ''; 34 } 35 36 // Sort events by date order 37 function sortEventsByDate(a,b) { 38 if (a.date < b.date) { 39 return -1; 40 } else if (a.date > b.date) { 41 return 1; 42 } else { 43 return 0; 44 } 45 } 46 47 // Sort events by upcoming order 48 function sortEventsByUpcoming(a,b) { 49 var today_date = new Date(today_year_g, today_month_g - 1, today_date_g); 50 if (Math.abs(a.date - today_date.getTime()) < Math.abs(b.date - today_date.getTime())) { 51 return -1; 52 } else if (Math.abs(a.date - today_date.getTime()) > Math.abs(b.date - today_date.getTime())) { 53 return 1; 54 } else { 55 return 0; 56 } 57 } 58 59 // Get events of day (by time order) 60 function getDayEventsByTime(type) { 61 var events = []; 62 var today_date = new Date(today_year_g, today_month_g - 1, today_date_g); 63 for (var i = 0; i < quick_events.length; i++) { 64 if (type == 'upcoming') { 65 if (quick_events[i].date >= today_date.getTime()) { 66 events.push(quick_events[i]); 67 } 68 } else { 69 if (quick_events[i].date < today_date.getTime()) { 70 events.push(quick_events[i]); 71 } 72 } 73 } 74 return events; 75 } 76 77 // Check day has events or not 78 function dayHasEvent(day, month, year) { 79 var num_events = 0; 80 var date_check = new Date(year, Number(month) - 1, day); 81 for (var i = 0; i < quick_events.length; i++) { 82 var start_date = new Date(quick_events[i].year, Number(quick_events[i].month) - 1, quick_events[i].day); 83 var end_date = new Date(quick_events[i].year, Number(quick_events[i].month) - 1, Number(quick_events[i].day) + Number(quick_events[i].duration) - 1); 84 if ((start_date.getTime() <= date_check.getTime()) && (date_check.getTime() <= end_date.getTime())) { 85 num_events++; 86 } 87 } 88 89 if (num_events == 0) { 90 return false; 91 } else { 92 return true; 93 } 94 } 95 96 // Get order number of event on day 97 function getEventOrderNumber(id, day, month, year) { 98 var date_check = new Date(year, Number(month) - 1, day); 99 var events = []; 100 for (var i = 0; i < quick_events.length; i++) { 101 var start_date = new Date(quick_events[i].year, Number(quick_events[i].month) - 1, quick_events[i].day); 102 var end_date = new Date(quick_events[i].year, Number(quick_events[i].month) - 1, Number(quick_events[i].day) + Number(quick_events[i].duration) - 1); 103 if ((start_date.getTime() <= date_check.getTime()) && (date_check.getTime() <= end_date.getTime())) { 104 var first_day = (start_date.getTime() == date_check.getTime()) ? true : false; 105 var event = {id:quick_events[i].id, title:quick_events[i].title, day:quick_events[i].day, month:quick_events[i].month, year:quick_events[i].year, first_day:first_day}; 106 events.push(event); 107 } 108 } 109 110 if (events.length) { 111 if (events[0].id == id) { 112 var num = order_num; 113 order_num = 0; 114 return num; 115 } else { 116 order_num++; 117 for (var j = 0; j < events.length; j++) { 118 if (events[j].id == id) { 119 return getEventOrderNumber(events[j-1].id, events[j-1].day, events[j-1].month, events[j-1].year); 120 } 121 } 122 123 } 124 } 125 126 return 0; 127 } 128 129 // Get events of day 130 function getDayEvents(day, month, year) { 131 var n = 0; 132 var date_check = new Date(year, Number(month) - 1, day); 133 var events = []; 134 for (var i = 0; i < quick_events.length; i++) { 135 var start_date = new Date(quick_events[i].year, Number(quick_events[i].month) - 1, quick_events[i].day); 136 var end_date = new Date(quick_events[i].year, Number(quick_events[i].month) - 1, Number(quick_events[i].day) + Number(quick_events[i].duration) - 1); 137 if ((start_date.getTime() <= date_check.getTime()) && (date_check.getTime() <= end_date.getTime())) { 138 var first_day = (start_date.getTime() == date_check.getTime()) ? true : false;
139 var last_day = (end_date.getTime() == date_check.getTime()) ? true : false; 140 var event = {id:quick_events[i].id, title:quick_events[i].title, image:quick_events[i].image, day:quick_events[i].day, month:quick_events[i].month, year:quick_events[i].year, time:quick_events[i].time, duration:quick_events[i].duration, color:quick_events[i].color, location:quick_events[i].location, description:quick_events[i].description, first_day:first_day, last_day:last_day}; 141 142 if (!first_day) { 143 n = getEventOrderNumber(quick_events[i].id, quick_events[i].day, quick_events[i].month, quick_events[i].year); 144 } 145 146 events[n] = event; 147 n++; 148 } 149 } 150 151 return events; 152 } 153 154 // Show events calendar 155 function showEventsCalendar(el, month_num, year_num, nav_time) { 156 var layout = (typeof el.attr('data-layout') != 'undefined') ? el.attr('data-layout') : 'full'; 157 158 // Automatic switch to compact layout on small sreen 159 layout = (screen.width < 768) ? 'compact' : layout; 160 161 if (nav_time == 'prev-year') { 162 year_num--; 163 } else if (nav_time == 'next-year') { 164 year_num++; 165 } else if (nav_time == 'prev-month') { 166 month_num--; 167 } else if (nav_time == 'next-month') { 168 month_num++; 169 } else if (nav_time == 'current') { 170 month_num = today_month_g; 171 year_num = today_year_g; 172 } 173 174 if (month_num == 0) { 175 month_num = 12; 176 year_num--; 177 } else if (month_num == 13) { 178 month_num = 1; 179 year_num++; 180 } 181 182 // Get first day and number days of month 183 var first_date_g = new Date(year_num, month_num - 1, 1); 184 if (date_start == 'sunday') { 185 var first_day_g = first_date_g.getDay() + 1; 186 } else { 187 var first_day_g = (first_date_g.getDay() == 0) ? 7 : first_date_g.getDay(); 188 } 189 190 var last_date_g = new Date(year_num, month_num, 0); 191 var num_days = last_date_g.getDate(); 192 193 // Create calendar 194 var calendar_string = ''; 195 var day_counter = 0; 196 197 calendar_string += '<div class="events-calendar ' + layout + '">'; 198 calendar_string += '<div class="calendar-header">'; 199 200 if (layout == 'full') { 201 calendar_string += '<h3 class="current-date">' + word_month[month_num - 1] + ' <span>' + year_num + '</span></h3>'; 202 calendar_string += '<div class="nav-time">'; 203 calendar_string += '<span id="prev-year" class="btn-change-date">«</span>'; 204 calendar_string += '<span id="prev-month" class="btn-change-date">â¹</span>'; 205 calendar_string += '<span id="current" class="btn-change-date">Today</span>'; 206 calendar_string += '<span id="next-month" class="btn-change-date">âº</span>'; 207 calendar_string += '<span id="next-year" class="btn-change-date">»</span>'; 208 calendar_string += '</div>'; 209 } else { 210 calendar_string += '<div class="nav-time left">'; 211 calendar_string += '<span id="prev-year" class="btn-change-date">«</span>'; 212 calendar_string += '<span id="prev-month" class="btn-change-date">â¹</span>'; 213 calendar_string += '</div>'; 214 calendar_string += '<h3 class="current-date">' + word_month[month_num - 1] + ' <span>' + year_num + '</span></h3>'; 215 calendar_string += '<div class="nav-time right">'; 216 calendar_string += '<span id="next-month" class="btn-change-date">âº</span>'; 217 calendar_string += '<span id="next-year" class="btn-change-date">»</span>'; 218 calendar_string += '</div>'; 219 } 220 221 calendar_string += '</div>'; 222 223 calendar_string += '<table class="calendar-table">'; 224 calendar_string += '<tbody>'; 225 226 calendar_string += '<tr>'; 227 for (var m = 0; m < word_day.length; m++) { 228 calendar_string += '<th>' + word_day[m].substring(0, 3) + '</th>'; 229 } 230 calendar_string += '</tr>'; 231 232 var this_date = 1; 233 234 for (var i = 1; i <= 6; i++) { 235 var k = (i - 1) * 7 + 1; 236 if (k < (first_day_g + num_days)) { 237 calendar_string += '<tr>'; 238 for (var x = 1; x <= 7; x++) { 239 day_counter = (this_date - first_day_g) + 1; 240 this_date++; 241 if ((day_counter > num_days) || (day_counter < 1)) { 242 calendar_string += '<td class="calendar-day blank"></td>'; 243 } else { 244 // Weekend 245 var weekend_class = ''; 246 if (date_start == 'sunday') { 247 if ((x == 1) || (x == 7)) { 248 weekend_class = ' weekend'; 249 } 250 } else { 251 if ((x == 6) || (x == 7)) { 252 weekend_class = ' weekend'; 253 } 254 } 255 256 // Today 257 var today_class = ''; 258 if ((today_date_g == day_counter) && (today_month_g == month_num) && (today_year_g == year_num)) { 259 today_class = ' today'; 260 } 261 262 // Has events 263 var has_events_class = ''; 264 if (dayHasEvent(day_counter, month_num, year_num)) { 265 has_events_class = ' has-events'; 266 } 267 268 calendar_string += '<td class="calendar-day' + weekend_class + today_class + has_events_class + '">'; 269 calendar_string += '<span class="day-num">' + day_counter + '</span>'; 270 271 if (dayHasEvent(day_counter, month_num, year_num)) { 272 // Get events of day 273 if (layout == 'full') { // Full layout 274 var events = getDayEvents(day_counter, month_num, year_num); 275 for (var t = 0; t < events.length; t++) { 276 if (typeof events[t] != "undefined") { 277 var color = events[t].color ? events[t].color : 1; 278 var event_class = ''; 279 if (events[t].first_day && !events[t].last_day) { 280 event_class = 'first-day'; 281 } else if (events[t].last_day && !events[t].first_day) { 282 event_class = 'last-day'; 283 } else if (!events[t].first_day && !events[t].last_day) { 284 event_class = 'middle-day'; 285 } 286 287 calendar_string += '<div class="event-title ' + event_class + ' color-' + color + '" href="#' + el.attr('id') + '-popup-' + events[t].id + '"><span>' + shortTitle(events[t].title, 2) + '</span></div>'; 288 289 // ==== Event detail popup ==== 290 calendar_string += '<div id="' + el.attr('id') + '-popup-' + events[t].id + '" class="event-popup zoom-anim-dialog mfp-hide">' 291 + '<div class="popup-body">' 292 + showEventDetail(events[t]) 293 + '</div>' 294 + '</div>'; 295 } else { 296 var event_deputize; 297 if (typeof events[t+1] != "undefined") { 298 if (typeof quick_events[events[t+1].id - 1] != "undefined") { 299 event_deputize = shortTitle(quick_events[events[t+1].id - 1].title, 2); 300 } else { 301 event_deputize = 'hidden'; 302 } 303 } else { 304 event_deputize = 'hidden'; 305 } 306 calendar_string += '<div class="event-title hidden-title">' + event_deputize + '</div>'; 307 } 308 } 309 } else { // Compact layout 310 var events = getDayEvents(day_counter, month_num, year_num); 311 for (var t = 0; t < events.length; t++) { 312 if (typeof events[t] != "undefined") { 313 var color = events[t].color ? events[t].color : 1; 314 315 calendar_string += '<div class="event-mark color-' + color + '" href="#' + el.attr('id') + '-popup-' + events[t].id + '"></div>'; 316 317 // ==== Event detail popup ==== 318 calendar_string += '<div id="' + el.attr('id') + '-popup-' + events[t].id + '" class="event-popup zoom-anim-dialog mfp-hide">' 319 + '<div class="popup-body">' 320 + showEventDetail(events[t]) 321 + '</div>' 322 + '</div>'; 323 } 324 } 325 } 326 } 327 328 calendar_string += '</td>'; 329 } 330 } 331 calendar_string += '</tr>'; 332 } 333 } 334 calendar_string += '</tbody>'; 335 calendar_string += '</table>'; 336 calendar_string += '<div id="month-num" style="display:none">
336' + month_num + '</div>'; 337 calendar_string += '<div id="year-num" style="display:none">' + year_num + '</div>'; 338 calendar_string += '</div>'; 339 340 // Create calendar 341 el.html(calendar_string); 342 343 // Popup 344 el.find('.event-title').magnificPopup({ 345 type: 'inline', 346 removalDelay: 800, 347 mainClass: 'my-mfp-zoom-in' 348 }); 349 el.find('.event-mark').magnificPopup({ 350 type: 'inline', 351 removalDelay: 800, 352 mainClass: 'my-mfp-zoom-in' 353 }); 354 } 355 356 // Show events list 357 function showEventsList(el, view, layout, max_events) { 358 // Sort event via upcoming 359 var upcoming_events = getDayEventsByTime('upcoming'); 360 upcoming_events.sort(sortEventsByUpcoming); 361 var past_events = getDayEventsByTime('past'); 362 past_events.sort(sortEventsByUpcoming); 363 var quick_list_events = upcoming_events.concat(past_events); 364 quick_list_events = quick_list_events.slice(0, max_events); 365 366 // Create events list 367 var events_list = ''; 368 369 events_list += '<div class="events-list ' + layout + ' ' + view + '">'; 370 371 for (var i = 0; i < quick_list_events.length; i++) { 372 // Start date 373 var day = new Date(quick_list_events[i].year, Number(quick_list_events[i].month) - 1, quick_list_events[i].day); 374 if (date_start == 'sunday') { 375 var event_day = word_day[day.getDay()]; 376 } else { 377 if (day.getDay() > 0) { 378 var event_day = word_day[day.getDay() - 1]; 379 } else { 380 var event_day = word_day[6]; 381 } 382 } 383 var event_date = quick_list_events[i].day + ' ' + word_month[Number(quick_list_events[i].month) - 1] + ', ' + quick_list_events[i].year; 384 385 // End date 386 var event_end_time = ''; 387 if (quick_list_events[i].duration > 1) { 388 var end_date = new Date(quick_list_events[i].year, Number(quick_list_events[i].month) - 1, Number(quick_list_events[i].day) + Number(quick_list_events[i].duration) - 1); 389 390 if (date_start == 'sunday') { 391 var event_end_day = word_day[end_date.getDay()]; 392 } else { 393 if (end_date.getDay() > 0) { 394 var event_end_day = word_day[end_date.getDay() - 1]; 395 } else { 396 var event_end_day = word_day[6]; 397 } 398 } 399 var event_end_date = ('0' + end_date.getDate()).slice(-2) + ' ' + word_month[Number(end_date.getMonth())] + ', ' + end_date.getFullYear(); 400 event_end_time = ' - ' + event_end_day + ', ' + event_end_date; 401 } 402 403 var event_image = (quick_list_events[i].image) ? '<img src="' + quick_list_events[i].image + '" alt="' + quick_list_events[i].title.substring(0,20) + ''+ quick_list_events[i].time +'" />' : ''; 404 var event_time = (quick_list_events[i].time) ? '<i class="icon-clock"></i>' + quick_list_events[i].time : ''; 405 var event_location = (quick_list_events[i].location) ? '<i class="icon-location-pin"></i>' + quick_list_events[i].location : ''; 406 var event_description = ((layout == 'compact') || (view == 'grid')) ? shortTitle(quick_list_events[i].description, 10) : shortTitle(quick_list_events[i].description, 25); 407 408 events_list += '<div class="event-item-wrap">' 409 + '<div class="event-item">' 410 + '<div class="event-image" href="#' + el.attr('id') + '-popup-' + quick_list_events[i].id + '">' + event_image + '</div>' 411 + '<div class="event-info">' 412 + '<div class="event-title" href="#' + el.attr('id') + '-popup-' + quick_list_events[i].id + '">' + quick_list_events[i].title + '</div>' 413 + '<div class="event-meta">' 414 + '<div class="event-date"><i class="icon-calendar"></i>' + event_day + ', ' + event_date + '</div>' 415 + '<div class="event-time">' + event_time + '</div>' 416 + '<div class="event-location">' + event_location + '</div>' 417 + '</div>' 418 + '<div class="event-intro">' + event_description + '</div>' 419 + '</div>' 420 + '</div>' 421 + '</div>'; 422 423 // ==== Event detail popup ==== 424 events_list += '<div id="' + el.attr('id') + '-popup-' + quick_list_events[i].id + '" class="event-popup zoom-anim-dialog mfp-hide">' 425 + '<div class="popup-body">' 426 + showEventDetail(quick_list_events[i]) 427 + '</div>' 428 + '</div>'; 429 } 430 431 events_list += '</div>'; 432 433 // Create list 434 el.html(events_list); 435 436 // Popup 437 el.find('.event-image').magnificPopup({ 438 type: 'inline', 439 removalDelay: 800, 440 mainClass: 'my-mfp-zoom-in' 441 }); 442 el.find('.event-title').magnificPopup({ 443 type: 'inline', 444 removalDelay: 800, 445 mainClass: 'my-mfp-zoom-in' 446 }); 447 } 448 449 // Show event detail 450 function showEventDetail(event) { 451 var event_string = ''; 452 453 // Start date 454 var day = new Date(event.year, Number(event.month) - 1, event.day); 455 if (date_start == 'sunday') { 456 var event_day = word_day[day.getDay()]; 457 } else { 458 if (day.getDay() > 0) { 459 var event_day = word_day[day.getDay() - 1]; 460 } else { 461 var event_day = word_day[6]; 462 } 463 } 464 var event_date = event.day + ' ' + word_month[Number(event.month) - 1] + ', ' + event.year; 465 466 // End date 467 var event_end_time = ''; 468 if (event.duration > 1) { 469 var end_date = new Date(event.year, Number(event.month) - 1, Number(event.day) + Number(event.duration) - 1); 470 471 if (date_start == 'sunday') { 472 var event_end_day = word_day[end_date.getDay()]; 473 } else { 474 if (end_date.getDay() > 0) { 475 var event_end_day = word_day[end_date.getDay() - 1]; 476 } else { 477 var event_end_day = word_day[6]; 478 } 479 } 480 var event_end_date = ('0' + end_date.getDate()).slice(-2) + ' ' + word_month[Number(end_date.getMonth())] + ', ' + end_date.getFullYear(); 481 event_end_time = ' - ' + event_end_day + ', ' + event_end_date; 482 } 483 var event_image = (event.image) ? '<img src="' + event.image + '" alt="' + event.title.substring(0,20) + ''+ event.time +'" />' : ''; 484 var event_time = (event.time) ? '<i class="icon-clock"></i>' + event.time : ''; 485 var event_location = (event.location) ? '<i class="icon-location-pin"></i>' + event.location : ''; 486 487 event_string += '<div class="event-item">' 488 + '<div class="event-image">' + event_image + '</div>' 489 + '<div class="event-info">' 490 + '<div class="event-title">' + event.title + '</div>' 491 + '<div class="event-meta">' 492 + '<div class="event-date"><i class="icon-calendar"></i>' + event_day + ', ' + event_date + event_end_time + '</div>' 493 + '<div class="event-time">' + event_time + '</div>' 494 + '<div class="event-location">' + event_location + '</div>' 495 + '</div>' 496 + '<div class="event-intro">' + event.description + '</div>' 497 + '</div>' 498 + '</div>'; 499 return event_string; 500 } 501
502 $(document).ready(function(){ 503 $('.quick-events').each(function(index) { 504 // Set id for quick events 505 $(this).attr('id', 'quick-events-' + (index + 1)); 506 507 var events_calendar_contain = $(this); 508 509 // Get variables 510 var source = (typeof $(this).attr('data-source') != 'undefined') ? $(this).attr('data-source') : 'json'; 511 var view = (typeof $(this).attr('data-view') != 'undefined') ? $(this).attr('data-view') : 'calendar'; 512 var layout = (typeof $(this).attr('data-layout') != 'undefined') ? $(this).attr('data-layout') : 'full'; 513 var items = (typeof $(this).attr('data-items') != 'undefined') ? $(this).attr('data-items') : '1000'; 514 515 date_start = (typeof $(this).attr('data-start') != 'undefined') ? $(this).attr('data-start') : 'monday'; 516 if (date_start == 'sunday') { // Start with sunday 517 word_day = new Array(word_day_sun, word_day_mon, word_day_tue, word_day_wed, word_day_thu, word_day_fri, word_day_sat); 518 } else { // Start with monday 519 word_day = new Array(word_day_mon, word_day_tue, word_day_wed, word_day_thu, word_day_fri, word_day_sat, word_day_sun); 520 } 521 word_month = new Array(word_month_1, word_month_2, word_month_3, word_month_4, word_month_5, word_month_6, word_month_7, word_month_8, word_month_9, word_month_10, word_month_11, word_month_12); 522 523 if (source == 'php') { // Get events from php file via ajax 524 $.ajax({ 525 url: source_php, 526 dataType: 'json', 527 data: '', 528 success: function(data) { 529 quick_events = []; 530 for (var i = 0; i < data.length; i++) { 531 var event_date = new Date(data[i].year, Number(data[i].month) - 1, data[i].day); 532 data[i].date = event_date.getTime(); 533 quick_events.push(data[i]); 534 } 535 536 // Sort events by date 537 quick_events.sort(sortEventsByDate); 538 539 for (var j = 0; j < quick_events.length; j++) { 540 quick_events[j].id = j; 541 if (!quick_events[j].duration) { 542 quick_events[j].duration = 1; 543 } 544 } 545 546 if ((view == 'list') || (view == 'grid')) { // Events List 547 showEventsList(events_calendar_contain, view, layout, items); 548 } else { // Events Calendar 549 showEventsCalendar(events_calendar_contain, today_month_g, today_year_g, 'current'); 550 } 551 } 552 }); 553 } else { // Get events from json file : events/events.json 554 $.getJSON(source_json, function(data) { 555 quick_events = []; 556 for (var i = 0; i < data.items.length; i++) { 557 var event_date = new Date(data.items[i].year, Number(data.items[i].month) - 1, data.items[i].day); 558 data.items[i].date = event_date.getTime(); 559 quick_events.push(data.items[i]); 560 } 561 562 // Sort events by date 563 quick_events.sort(sortEventsByDate); 564 565 for (var j = 0; j < quick_events.length; j++) { 566 quick_events[j].id = j; 567 if (!quick_events[j].duration) { 568 quick_events[j].duration = 1; 569 } 570 } 571 572 if ((view == 'list') || (view == 'grid')) { // Events List 573 showEventsList(events_calendar_contain, view, layout, items); 574 } else { // Events Calendar 575 showEventsCalendar(events_calendar_contain, today_month_g, today_year_g, 'current'); 576 } 577 }); 578 } 579 }); 580 581 // Click navigation 582 $('.quick-events').on('click', '.btn-change-date', function() { 583 var events_calendar_contain = $(this).closest('.quick-events'); 584 var month_num = events_calendar_contain.find('#month-num').text(); 585 var year_num = events_calendar_contain.find('#year-num').text(); 586 var nav_time = $(this).attr('id'); 587 showEventsCalendar(events_calendar_contain, month_num, year_num, nav_time); 588 }); 589 }); 590})(jQuery);
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.