PageSourceSearch

https://jsc.lt/js/quick-events.js?v=1.3

js jsc.lt collected 2026-09-25 09:58:41 UTC 22,220 bytes, 590 lines download raw bytes

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.