PageSourceSearch

https://www.parliament.go.th/library/tivatimetable/assets/js/timetablemeeting.js?v=011026051938

js parliament.go.th collected 2026-10-01 10:20:22 UTC 38,222 bytes, 974 lines download raw bytes

1// ========== Language ===========
2// Day, Month
3var wordMonth = new Array("มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม");
4var wordDay_sun = "อา";
5var wordDay_mon = "จ";
6var wordDay_tue = "อ";
7var wordDay_wed = "พ";
8var wordDay_thu = "พฤ";
9var wordDay_fri = "ศ";
10var wordDay_sat = "ส";
11// ===============================
12
13// Global Variable
14var tiva_timetables = [];
15var tiva_current_date = new Date();
16var tiva_current_month = tiva_current_date.getMonth() + 1;
17var tiva_current_year = tiva_current_date.getFullYear();
18
19function sortByTime(a,b) {
20	if (a.start_time < b.start_time) {
21		return -1;
22	} else if (a.start_time > b.start_time) {
23		return 1;
24	} else {
25		return 0;
26	}
27}
28
29function sortByEndTime(a,b) {
30	if (a.end_time < b.end_time) {
31		return -1;
32	} else if (a.end_time > b.end_time) {
33		return 1;
34	} else {
35		return 0;
36	}
37}
38
39function getMinTime(timetables) {
40	for (var i = 0; i < timetables.length; i++) {
41		if (timetables[i].start_time) {
42			return parseInt(timetables[i].start_time, 10);
43		}
44	}
45}
46
47function getMaxTime(timetables) {
48	timetables.sort(sortByEndTime);
49	for (var i = timetables.length-1; i >= 0; i--) {
50		if (timetables[i].end_time) {
51			var time = timetables[i].end_time.split(':');
52			if (time[1] == '00') {
53				return time[0];
54			} else {
55				return parseInt(time[0], 10) + 1;
56			}
57		}
58	}
59}
60
61function calHour(time) {
62	var t = time.split(':');
63	return parseInt(t[0], 10) + (t[1] / 60);
64}
65
66function getPosition(axis, start_time) {
67	return parseInt((calHour(start_time) - axis) * 55, 10); // 1 cell top = 55px;
68}
69
70function getHeight(start_time, end_time) {
71	return parseInt((calHour(end_time) - calHour(start_time)) * 55, 10); // 1 cell = 55px;
72}
73
74function checkMulti(timetable, timetables) {
75	var count = 1;
76	
77	for (var i = 0; i < timetables.length; i++) {
78		if 	(timetable.id != timetables[i].id) {
79			if (((calHour(timetable.start_time) >= calHour(timetables[i].start_time)) && (calHour(timetable.start_time) < calHour(timetables[i].end_time)))
80				|| ((calHour(timetables[i].start_time) >= calHour(timetable.start_time)) && (calHour(timetables[i].start_time) < calHour(timetable.end_time)))) {
81				count++;
82			}
83		}
84	}
85	
86	return count;
87}
88
89function checkOrder(timetable, timetables) {
90	var order = 0;
91	
92	for (var i = 0; i < timetables.length; i++) {
93		if 	(timetable.id > timetables[i].id) {
94			if (((calHour(timetable.start_time) >= calHour(timetables[i].start_time)) && (calHour(timetable.start_time) < calHour(timetables[i].end_time)))
95				|| ((calHour(timetables[i].start_time) >= calHour(timetable.start_time)) && (calHour(timetables[i].start_time) < calHour(timetable.end_time)))) {
96				order++;
97			}
98		}
99	}
100	
101	return order;
102}
103
104function getDayBefore(day, num) {
105	var d = new Date();
106	return new Date(d.setTime(day.getTime() - (num * 24 * 60 * 60 * 1000)));
107}
108
109function getDayAfter(day, num) {
110	var d = new Date();
111	return new Date(d.setTime(day.getTime() + (num * 24 * 60 * 60 * 1000)));
112}
113
114function naviClick(id, btn, weekNum, monthNum, yearNum) {
115	createTimetable(jQuery('#' + id), btn, weekNum, monthNum, yearNum);
116}
117
118// Get timetables of day
119function getTimetables(tiva_timetables, day, month, year) {
120	var timetables = [];
121	for (var i = 0; i < tiva_timetables.length; i++) {
122		if ((tiva_timetables[i].date == day) && (tiva_timetables[i].month == month) && (tiva_timetables[i].year == year)) {
123			timetables.push(tiva_timetables[i]);
124		}
125	}
126	
127	return timetables;
128}
129
130// Get timetables of day
131function getTimetablesDay(tiva_timetables, day) {
132	var timetables = [];
133	for (var i = 0; i < tiva_timetables.length; i++) {
134		if (tiva_timetables[i].day == day) {
135			timetables.push(tiva_timetables[i]);
136		}
137	}
138	
139	return timetables;
140}
141
142// Get timetables of week
143function getTimetablesWeek(tiva_timetables, first_day, last_day) {
144	var date_check;
145	
146	var timetables = [];
147	for (var i = 0; i < tiva_timetables.length; i++) {
148		date_check = new Date(tiva_timetables[i].year, Number(tiva_timetables[i].month) - 1, tiva_timetables[i].date);
149		if ((first_day.getTime() <= date_check.getTime()) && (date_check.getTime() <= last_day.getTime())) {
150			timetables.push(tiva_timetables[i]);
151		}
152	}
153	
154	return timetables;
155}
156
157// Change month or year on calendar
158function createTimetable(el, btn, weekNum, monthNum, yearNum) {
159	// Variable
160	var firstDate;
161	var firstDay;
162	var lastDate;
163	var numbDays;
164	var firstDateWeek;
165	var todayDate = new Date();
166
167	if (btn == "prevyr") {
168		yearNum--;
169	} else if (btn == "nextyr") {
170		yearNum++;
171	} else if (btn == "prevmo") {
172		monthNum--;
173	} else if (btn == "nextmo") {
174		monthNum++;
175	} else if (btn == "prevwe") {
176		firstDateWeek = new Date(weekNum);
177		weekNum = getDayBefore(firstDateWeek, 7);
178	} else if (btn == "nextwe") {
179		firstDateWeek = new Date(weekNum);
180		weekNum = getDayAfter(firstDateWeek, 7);
181	}
182
183	if (monthNum == 0) {
184		monthNum = 12;
185		yearNum--;
186	} else if (monthNum == 13) {
187		monthNum = 1;
188		yearNum++
189	}
190	
191	// Get first day and number days of month
192	firstDate = new Date(yearNum, monthNum - 1, 1);
193	var date_start = (typeof el.attr('data-start') != "undefined") ? el.attr('data-start') : 'sunday';
194	if (date_start == 'sunday') {
195		firstDay = firstDate.getDay() + 1;
196	} else {
197		firstDay = (firstDate.getDay() == 0) ? 7 : firstDate.getDay();
198	}
199	
200	lastDate = new Date(yearNum, monthNum, 0);
201	numbDays = lastDate.getDate();
202	
203	// Create calendar
204	var view = (typeof el.attr('data-view') != 'undefined') ? el.attr('data-view') : 'month';
205	if (view == 'week') {
206		timetableWeek(el, tiva_timetables, weekNum);
207	} else if (view == 'list') {
208		timetableList(el, tiva_timetables, weekNum);
209	} else if (view == 'compact') {
210		timetableCompact(el, tiva_timetables, firstDay, numbDays, monthNum, yearNum);
211	} else {
212		timetableMonth(el, tiva_timetables, firstDay, numbDays, monthNum, yearNum);
213	}
214}
215
216// Create timetable week
217function timetableWeek(el, tiva_timetables, firstDayWeek) {
218	var firstWeek = new Date(firstDayWeek);
219	var firstWeekDate = firstWeek.getDate();
220	var firstWeekMonth = firstWeek.getMonth() + 1;
221	var firstWeekYear = firstWeek.getFullYear();
222	
223	var lastWeek = getDayAfter(firstWeek, 6);
224	var lastWeekDate = lastWeek.getDate();
225	var lastWeekMonth = lastWeek.getMonth() + 1;
226	var lastWeekYear = lastWeek.getFullYear();
227	
228	var dayArr;
229	var d;
230	var date;
231	var month;
232	var year;
233	
234	var first;
235	var last;
236	var header_time;
237		
238	// Set wordDay
239	var wordDay;
240	var date_start = (typeof el.attr('data-start') != "undefined") ? el.attr('data-start') : 'sunday';
241	var timetableString = "";
242	
243	if (date_start == 'sunday') {
244		wordDay = new Array(wordDay_sun, wordDay_mon, wordDay_tue, wordDay_wed, wordDay_thu, wordDay_fri, wordDay_sat);
245		dayArr = new Array("sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday");
246	} else { // Start with Monday
247		wordDay = new Array(wordDay_mon, wordDay_tue, wordDay_wed, wordDay_thu, wordDay_fri, wordDay_sat, wordDay_sun);
248		dayArr = new Array("monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday");
249	}
250	
251	var week_nav;
252	if ((firstWeekMonth != lastWeekMonth) && (firstWeekYear != lastWeekYear)) {
253		week_nav = firstWeekDate + ' ' + wordMonth[firstWeekMonth - 1]  + ' ' + (firstWeekYear+543) 
254		+ ' - ' + lastWeekDate + ' ' + wordMonth[lastWeekMonth - 1] + ' ' + (lastWeekYear+543);
255	} else if (firstWeekMonth != lastWeekMonth) {
256		week_nav = firstWeekDate + ' ' + wordMonth[firstWeekMonth - 1] +' - ' + lastWeekDate + ' ' + wordMonth[lastWeekMonth - 1] + ' ' + (firstWeekYear+543);
257	} else {
258		week_nav = firstWeekDate + ' - ' + lastWeekDate + ' ' + wordMonth[firstWeekMonth - 1] + ' ' + (firstWeekYear+543);
259	}
260	
261	if (!(el.attr('data-nav') == 'hide') && !(el.attr('data-mode') == 'day')) {
262		timetableString += 	'<div class="time-navigation">'
263								+ '<span class="navi-icon navi-prev" onClick="naviClick(\'' + el.attr('id') + '\', \'prevwe\', \'' + firstWeek + '\', ' + firstWeekMonth + ', ' + firstWeekYear + ')">&#10094;</span>'	
264								+ '<span class="navi-time">' + week_nav + '</span>'
265								+ '<span class="navi-icon navi-next" onClick="naviClick(\'' + el.attr('id') + '\', \'nextwe\', \'' + firstWeek + '\', ' + firstWeekMonth + ', ' + firstWeekYear + ')">&#10095;</span>'
266							+ '</div>';
267	}
268	
269	// Get timetables week
270	if (!(el.attr('data-mode') == 'day')) {
271		tiva_timetables = getTimetablesWeek(tiva_timetables, new Date(firstWeekYear, firstWeekMonth - 1, firstWeekDate), new Date(lastWeekYear, lastWeekMonth - 1, lastWeekDate));
272	}
273	
274	// Get min, max time
275	var min_time = getMinTime(tiva_timetables) ? getMinTime(tiva_timetables) : 0;
276	var max_time = getMaxTime(tiva_timetables) ? getMaxTime(tiva_timetables) : 24;
277	var show_time = (el.attr('data-header-time') == 'hide') ? '' : 'show-time'; 
278	
279	timetableString += '<div class="timetable-week ' + show_time + '">';
280		timetableString += '<div class="timetable-axis">';
281			for (var n = min_time; n <= max_time; n++) {
282				var hour = (n < 10) ? '0' + n : n;
283				timetableString += '<div class="axis-item">' + hour + ':00</div>';
284			}
285		timetableString += '</div>';
286	
287		timetableString += '<div class="timetable-columns">';
288			for (var m = 0; m < wordDay.length; m++) {
289				// Caculate date of week
290				d = getDayAfter(firstWeek, m);
291				date = d.getDate();
292				month = d.getMonth() + 1;
293				year = d.getFullYear();
294				header_time = (el.attr('data-header-time') == 'hide') ? '' : '<br><span>' + date + ' ' + wordMonth[month - 1] + ' ' + (year+543) + '</span>';
295				
296				first = (m == 0) ? 'first-column' : '';
297				last = (m == wordDay.length - 1) ? 'last-column' : '';
298				
299				timetableString += '<div class="timetable-column">';
300					// Header
301					if (screen.width > 768) {
302						timetableString += '<div class="timetable-column-header ' + last + '">' + wordDay[m] + header_time + '</div>';
303					} else {
304						timetableString += '<div class="timetable-column-header ' + last + '">' + wordDay[m] + header_time + '</div>';
305					}
306				
307					// Content
308					timetableString += '<div class="timetable-column-content">';					
309						// Get timetables of day
310						if (el.attr('data-mode') == 'day') {
311							var timetables = getTimetablesDay(tiva_timetables, dayArr[m]);
312						} else {
313							var timetables = getTimetables(tiva_timetables, date, month, year);
314						}
315						for (var t = 0; t < timetables.length; t++) {
316							if (timetables[t].start_time && timetables[t].end_time) {
317								// Image
318								if (timetables[t].image) {
319									var timetable_image = '<div class="timetable-image"><img src="timetable/images/' + timetables[t].image + '" alt="' + timetables[t].name + '" /></div>';
320								} else {
321									var timetable_image = '';
322								}
323								
324								// End time
325								if (timetables[t].end_time) {
326									var timetable_end_time = ' - ' + timetables[t].end_time;
327								} else {
328									var timetable_end_time = '';
329								}
330
331								if (timetables[t].filename) {
332								//var fileatt = timetables[t].filename;
333								//var filetype = fileatt.split(".");
334								//var fileattatch = '<p> FileName : <a href="/assets/portals/740/event/'+ timetables[t].eid +'/'+timetables[t].fileid+'.'+filetype[1]+'" target="_blank">' + timetables[t].filename + '</a></p>';
335								//var fileattatchdes =  '<div class="timetable-desc">' + timetables[t].filedescription + '</div><br />';
336								var fileattatch = '<p> ไฟล์แนบ : <a href="'+ timetables[t].filename +'" target="_blank">Download</a></p>';
337								var fileatt = '';
338								var filetype = '';
339								var fileattatchdes = ''; 
340								}else{
341								var fileatt = '';
342								var filetype = '';
343								var fileattatch = '';
344								var fileattatchdes = ''; 
345								
346								}							
347								// Position
348								var position = getPosition(min_time, timetables[t].start_time);
349								var height = getHeight(timetables[t].start_time, timetables[t].end_time);
350								
351								// Width of timetable
352								var item_width = (checkMulti(timetables[t], timetables) > 1) ? 'width:' + (100 / checkMulti(timetables[t], timetables)) + '%;' : '';
353								var item_left = (checkOrder(timetables[t], timetables) > 0) ? 'left:' + (checkOrder(timetables[t], timetables) * (100 / checkMulti(timetables[t], timetables))) + '%' : '';
354								
355								timetableString += 	'<div class="timetable-item">'
356														+ '<a class="timetable-title color-' + timetables[t].color + '" style="background-color:' + timetables[t].color_code + ';
356top:' + position + 'px; height:' + height + 'px; ' + item_width + item_left + '" href="#' + el.attr('id') + '-popup-' + timetables[t].id + '" class="open-popup-link">'
357															+ '<div class="timetable-title-wrap">'
358																+ '<div class="timetable-name">' + timetables[t].name + '</div>'
359																+ '<div class="timetable-time">' + timetables[t].start_time + ' - ' + timetables[t].end_time + '</div>'
360															+ '</div>'
361														+ '</a>'
362														+ '<div id="' + el.attr('id') + '-popup-' + timetables[t].id + '" class="timetable-popup zoom-anim-dialog mfp-hide">'
363															+ '<div class="popup-header color-' + timetables[t].color + '">'
364																+ timetables[t].name
365															+ '</div>'
366															+ '<div class="popup-body">'
367																+ timetable_image
368																+ '<div class="timetable-time color-' + timetables[t].color + '">' + timetables[t].start_time + timetable_end_time + '</div>'
369																+ '<div class="timetable-desc">' + timetables[t].description + '</div>'
370																+ fileattatch
371																+ fileattatchdes
372															+ '</div>'
373														+ '</div>'
374													+ '</div>';
375							}
376						}
377					timetableString += '</div>';
378					
379					// Grid
380					timetableString += '<div class="timetable-column-grid">';
381						for (var n = min_time; n < max_time; n++) {
382							timetableString += '<div class="grid-item ' + first + '"></div>';
383						}
384					timetableString += '</div>';
385				timetableString += '</div>';
386			}
387		timetableString += '</div>';
388		
389	timetableString += '</div>';
390
391	el.html(timetableString);
392	
393	// Popup
394	el.find('.timetable-title').magnificPopup({
395		type: 'inline',
396		removalDelay: 800,
397		mainClass: 'my-mfp-zoom-in'
398	});
399}
400
401// Create timetable week
402function timetableList(el, tiva_timetables, firstDayWeek) {
403	var firstWeek = new Date(firstDayWeek);
404	var firstWeekDate = firstWeek.getDate();
405	var firstWeekMonth = firstWeek.getMonth() + 1;
406	var firstWeekYear = firstWeek.getFullYear();
407	
408	var lastWeek = getDayAfter(firstWeek, 6);
409	var lastWeekDate = lastWeek.getDate();
410	var lastWeekMonth = lastWeek.getMonth() + 1;
411	var lastWeekYear = lastWeek.getFullYear();
412	
413	var dayArr;
414	var d;
415	var date;
416	var month;
417	var year;
418	
419	var first;
420	var last;
421	var header_time;
422		
423	// Set wordDay
424	var wordDay;
425	var date_start = (typeof el.attr('data-start') != "undefined") ? el.attr('data-start') : 'sunday';
426	var timetableString = "";
427	
428	if (date_start == 'sunday') {
429		wordDay = new Array(wordDay_sun, wordDay_mon, wordDay_tue, wordDay_wed, wordDay_thu, wordDay_fri, wordDay_sat);
430		dayArr = new Array("sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday");
431	} else { // Start with Monday
432		wordDay = new Array(wordDay_mon, wordDay_tue, wordDay_wed, wordDay_thu, wordDay_fri, wordDay_sat, wordDay_sun);
433		dayArr = new Array("monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday");
434	}
435	
436	var week_nav;
437	if ((firstWeekMonth != lastWeekMonth) && (firstWeekYear != lastWeekYear)) {
438		week_nav = firstWeekDate + ' ' + wordMonth[firstWeekMonth - 1] + ' ' + (firstWeekYear+543) 
439		+ ' - ' + lastWeekDate + ' ' + wordMonth[lastWeekMonth - 1] + ' ' + (lastWeekYear+543);
440	} else if (firstWeekMonth != lastWeekMonth) {
441		week_nav = firstWeekDate + ' ' + wordMonth[firstWeekMonth - 1] + ' - ' + lastWeekDate + ' ' + wordMonth[lastWeekMonth - 1] + ' ' + (firstWeekYear+543);
442	} else {
443		week_nav = firstWeekDate + ' - ' + lastWeekDate + ' ' + wordMonth[firstWeekMonth - 1] + ' ' + (firstWeekYear+543);
444	}
445	
446	if (!(el.attr('data-nav') == 'hide') && !(el.attr('data-mode') == 'day')) {
447		timetableString += 	'<div class="time-navigation">'
448								+ '<span class="navi-icon navi-prev" onClick="naviClick(\'' + el.attr('id') + '\', \'prevwe\', \'' + firstWeek + '\', ' + firstWeekMonth + ', ' + firstWeekYear + ')">&#10094;</span>'	
449								+ '<span class="navi-time">' + week_nav + '</span>'
450								+ '<span class="navi-icon navi-next" onClick="naviClick(\'' + el.attr('id') + '\', \'nextwe\', \'' + firstWeek + '\', ' + firstWeekMonth + ', ' + firstWeekYear + ')">&#10095;</span>'
451							+ '</div>';
452	}
453	
454	var timetables;
455	timetableString += '<div class="timetable-list">';
456		for (var m = 0; m < wordDay.length; m++) {
457			// Caculate date of week
458			d = getDayAfter(firstWeek, m);
459			date = d.getDate();
460			month = d.getMonth() + 1;
461			year = d.getFullYear();
462			
463			// Get timetables of day
464			if (el.attr('data-mode') == 'day') {
465				timetables = getTimetablesDay(tiva_timetables, dayArr[m]);
466			} else {
467				timetables = getTimetables(tiva_timetables, date, month, year);
468			}
469
470					
471			if (timetables.length > 0) {
472				timetableString += '<div class="timetable-day">';
473					// Header
474					header_time = (el.attr('data-header-time') == 'hide') ? '' : '<span>' + date + ' ' + wordMonth[month - 1] + ' ' + (year+543) + '</span>';
475					timetableString += '<div class="timetable-header">' + wordDay[m] + header_time + '</div>';
476					
477					// Get timetables of day
478					timetableString += '<div class="timetable-content">';
479						for (var t = 0; t < timetables.length; t++) {
480							if (timetables[t].start_time && timetables[t].end_time) {
481								// Image
482								if (timetables[t].image) {
483									var timetable_image = '<div class="timetable-image"><img src="timetable/images/' + timetables[t].image + '" alt="' + timetables[t].name + '" /></div>';
484								} else {
485									var timetable_image = '';
486								}
487								
488								// End time
489								if (timetables[t].end_time) {
490									var timetable_end_time = ' - ' + timetables[t].end_time;
491								} else {
492									var timetable_end_time = '';
493								}
494if (timetables[t].filename) {
495//var fileatt = timetables[t].filename;
496//var filetype = fileatt.split(".");
497//var fileattatch = '<p> FileName : <a href="/assets/portals/740/event/'+ timetables[t].eid +'/'+timetables[t].fileid+'.'+filetype[1]+'" target="_blank">' + timetables[t].filename + '</a></p>';
498//var fileattatchdes =  '<div class="timetable-desc">' + timetables[t].filedescription + '</div><br />';
499var fileattatch = '<p> ไฟล์แนบ : <a href="'+ timetables[t].filename +'" target="_blank">Download</a></p>';
500var fileatt = '';
501var filetype = '';
502var fileattatchdes = ''; 
503}else{
504 var fileatt = '';
505 var filetype = '';
506 var fileattatch = '';
507 var fileattatchdes = ''; 
508 
509}				//xxx											
510								timetableString += 	'<div class="timetable-item">'
511														+ '<div style="border:solid black 1px;width:20px;height:20px;float:left;margin-right:5px;margin-left:-5px;background-color:' + timetables[t].color_code + '"></div>'
512														+ '<a class="timetable-title" href="#' + el.attr('id') + '-popup-' + timetables[t].id + '" class="open-popup-link">'
513															+ '<span class="timetable-time">' + timetables[t].start_time + timetable_end_time + '</span>'
514															+ '<span class="timetable-name">' + timetables[t].name + '</span>'
515														+ '</a>'
516														+ '<div id="' + el.attr('id') + '-popup-' + timetables[t].id + '" class="timetable-popup zoom-anim-dialog mfp-hide">'
517															+ '<div class="popup-header color-' + timetables[t].color + '">'
518																+ timetables[t].name
519															+ '</div>'
520															+ '<div class="popup-body">'
521																+ timetable_image
522																+ '<div class="timetable-time color-' + timetables[t].color + '">' + timetables[t].start_time + timetable_end_time + '</div>'
523																+ '<div class="timetable-desc">' + timetables[t].description + '</div>'
524																+ fileattatch
525																+ fileattatchdes
526															+ '</div>'
527														+ '</div>'
528													+ '</div>';
529							}
530						}
531					timetableString += '</div>';	
532				timetableString += '</div>';
533			}
534		}	
535	timetableString += '</div>';
536
537	el.html(timetableString);
538	
539	// Popup
540	el.find('.timetable-title').magnificPopup({
541		type: 'inline',
542		removalDelay: 800,
543		mainClass: 'my-mfp-zoom-in'
544	});
545}
546
547// Create timetable month
548function timetableMonth(el, tiva_timetables, firstDay, numbDays, monthNum, yearNum) {
549
550	// Set wordDay
551	var todaysDate = tiva_current_date.getDate();
552	var wordDay;
553	var date_start = (typeof el.attr('data-start') != "undefined") ? el.attr('data-start') : 'sunday';
554	var timetableString = "";
555	var daycounter = 0;
556	
557	if (date_start == 'sunday') {
558		wordDay = new Array(wordDay_sun, wordDay_mon, wordDay_tue, wordDay_wed, wordDay_thu, wordDay_fri, wordDay_sat);
559	} else { // Start with Monday
560		wordDay = new Array(wordDay_mon, wordDay_tue, wordDay_wed, wordDay_thu, wordDay_fri, wordDay_sat, wordDay_sun);
561	}
562	
563	if (!(el.attr('data-nav') == 'hide')) {
564		timetableString += 	'<div class="time-navigation">'
565								+ '<span class="navi-icon navi-prev" onClick="naviClick(\'' + el.attr('id') + '\', \'prevmo\', \'\', ' + monthNum + ', ' + yearNum + ')">&#10094;
565</span>'	
566								+ '<span class="navi-time">' + wordMonth[monthNum - 1] + '&nbsp;&nbsp;' + (yearNum+543) + '</span>'
567								+ '<span class="navi-icon navi-next" onClick="naviClick(\'' + el.attr('id') + '\', \'nextmo\', \'\', ' + monthNum + ', ' + yearNum + ')">&#10095;</span>'
568							+ '</div>';
569	}
570	
571	timetableString += '<table class="timetable-month">';
572	timetableString += '<tbody>';
573	
574	timetableString += '<tr>';
575	for (var m = 0; m < wordDay.length; m++) {
576		if (screen.width > 768) {
577			timetableString += '<th class="timetable-header">' + wordDay[m] + '</th>';
578		} else {
579			timetableString += '<th class="timetable-header">' + wordDay[m] + '</th>';
580		}
581	}
582	timetableString += '</tr>';
583
584	var thisDate = 1;
585	var class_today;
586	
587	for (var i = 1; i <= 6; i++) {
588		var k = (i - 1) * 7 + 1;
589		if (k < (firstDay + numbDays)) {
590			timetableString += '<tr>';
591			for (var x = 1; x <= 7; x++) {
592				daycounter = (thisDate - firstDay) + 1;
593				thisDate++;
594				
595				class_today = ((todaysDate == daycounter) && (tiva_current_month == monthNum) && (tiva_current_year == yearNum)) ? 'today' : '';
596				timetableString += '<td class="calendar-day ' + class_today + '">';
597					if ((daycounter <= numbDays) && (daycounter >= 1)) {
598						timetableString += '<div class="calendar-daycounter">' + daycounter + '</div>';
599					}
600					
601					// Get timetables of day
602					var timetables = getTimetables(tiva_timetables, daycounter, monthNum, yearNum);
603					for (var t = 0; t < timetables.length; t++) {
604						// Image
605						if (timetables[t].image) {
606							var timetable_image = '<div class="timetable-image"><img src="timetable/images/' + timetables[t].image + '" alt="' + timetables[t].name + '" /></div>';
607						} else {
608							var timetable_image = '';
609						}
610						
611						if(timetables[t].start_time=="00:00"){
612							var datetimeevent = "ตลอดวัน";
613							var showtime      = "";
614						}else if(timetables[t].end_time=="" && timetables[t].end_time==""){
615							var datetimeevent = "";
616							var showtime      = ' style="display:none;"';
617						}else{
618							if (timetables[t].end_time) {
619								var timetable_end_time = ' - ' + timetables[t].end_time;
620							} else {
621								var timetable_end_time = '';
622							}
623							var datetimeevent = timetables[t].start_time + timetable_end_time;
624							var showtime      = "";
625						}
626						if(timetables[t].start_time=="00:00"){
627							var startshow = '';
628						}else{
629							var startshow = timetables[t].start_time;
630						}
631
632if (timetables[t].filename) {
633/*var fileatt = timetables[t].filename;
634var filetype = fileatt.split(".");
635var fileattatch = '<p> FileName : <a href="/assets/portals/740/event/'+ timetables[t].eid +'/'+timetables[t].fileid+'.'+filetype[1]+'" target="_blank">' + timetables[t].filename + '</a></p>';
636var fileattatchdes =  '<div class="timetable-desc">' + timetables[t].filedescription + '</div><br />';
637*/
638var fileattatch = '<p> ไฟล์แนบ : <a href="'+ timetables[t].filename +'" target="_blank">Download</a></p>';
639var fileatt = '';
640var filetype = '';
641var fileattatchdes = ''; 
642}else{
643 var fileatt = '';
644 var filetype = '';
645 var fileattatch = '';
646 var fileattatchdes = ''; 
647 
648}
649
650var widthtable = $(".tiva-timetable").width()/7;
651var daywidth = (widthtable*timetables[t].duration-50);
652var colwidth = '';
653if(timetables[t].duration > 1){
654	// daywidth = '20';
655	colwidth = daywidth+'px;margin-left:-10px;';
656}else{
657	colwidth = '20px;';
658}
659//alert(filetype[1]);
660						timetableString += 	'<div class="timetable-item">'
661												+ '<div style="border:solid black 1px;width:'+colwidth+'height:20px;float:left;margin-right:5px;margin-left:-5px;background-color:' + timetables[t].color_code + '"></div>'
662												+ '<a class="timetable-title" href="#' + el.attr('id') + '-popup-' + timetables[t].id + '" class="open-popup-link">'
663													+ '<span class="timetable-time">' + startshow + '</span>'
664													+ '<span class="timetable-name">' + timetables[t].name + '</span>'
665												+ '</a>'
666												+ '<div id="' + el.attr('id') + '-popup-' + timetables[t].id + '" class="timetable-popup zoom-anim-dialog mfp-hide">'
667													+ '<div class="popup-header color-' + timetables[t].color + '">'
668														+ timetables[t].datethai
669														+ timetables[t].name
670													+ '</div>'
671													+ '<div class="popup-body">'
672														+ timetable_image
673														+ '<div class="timetable-time color-' + timetables[t].color + '"'+showtime+'>' + datetimeevent + '</div>'
674														+ '<div class="timetable-desc">' + timetables[t].description + '</div><br />'
675														+ fileattatch
676														+ fileattatchdes
677														
678													+ '</div>'
679												+ '</div>'
680											+ '</div>';
681					}
682				timetableString += '</td>';
683			}
684			timetableString += '</tr>';
685		}
686	}
687	timetableString += '</tbody>';
688	timetableString += '</table>';
689	
690	el.html(timetableString);
691	
692	// Popup
693	el.find('.timetable-title').magnificPopup({
694		type: 'inline',
695		removalDelay: 800,
696		mainClass: 'my-mfp-zoom-in'
697	});
698	
699	thisDate = 1;
700}
701
702// Create timetable month
703function timetableCompact(el, tiva_timetables, firstDay, numbDays, monthNum, yearNum) {
704
705	// Set wordDay
706	var todaysDate = tiva_current_date.getDate();
707	var wordDay;
708	var date_start = (typeof el.attr('data-start') != "undefined") ? el.attr('data-start') : 'sunday';
709	var timetableString = "";
710	var daycounter = 0;
711	
712	if (date_start == 'sunday') {
713		wordDay = new Array(wordDay_sun, wordDay_mon, wordDay_tue, wordDay_wed, wordDay_thu, wordDay_fri, wordDay_sat);
714	} else { // Start with Monday
715		wordDay = new Array(wordDay_mon, wordDay_tue, wordDay_wed, wordDay_thu, wordDay_fri, wordDay_sat, wordDay_sun);
716	}
717	
718	if (!(el.attr('data-nav') == 'hide')) {
719		timetableString += 	'<div class="time-navigation">'
720								+ '<span class="navi-icon navi-prev" onClick="naviClick(\'' + el.attr('id') + '\', \'prevmo\', \'\', ' + monthNum + ', ' + yearNum + ')">&#10094;
720</span>'	
721								+ '<span class="navi-time">' + wordMonth[monthNum - 1] + '&nbsp;&nbsp;' + (yearNum+543) + '</span>'
722								+ '<span class="navi-icon navi-next" onClick="naviClick(\'' + el.attr('id') + '\', \'nextmo\', \'\', ' + monthNum + ', ' + yearNum + ')">&#10095;</span>'
723							+ '</div>';
724	}
725	
726	timetableString += '<table class="timetable-month" id="timetable-compace">';
727	timetableString += '<tbody>';
728	
729	timetableString += '<tr>';
730	for (var m = 0; m < wordDay.length; m++) {
731		if (screen.width > 768) {
732			timetableString += '<th class="timetable-header">' + wordDay[m] + '</th>';
733		} else {
734			timetableString += '<th class="timetable-header">' + wordDay[m] + '</th>';
735		}
736	}
737	timetableString += '</tr>';
738
739	var thisDate = 1;
740	var class_today;
741	
742	for (var i = 1; i <= 6; i++) {
743		var k = (i - 1) * 7 + 1;
744		if (k < (firstDay + numbDays)) {
745			timetableString += '<tr>';
746			for (var x = 1; x <= 7; x++) {
747				daycounter = (thisDate - firstDay) + 1;
748				thisDate++;
749				
750				class_today = ((todaysDate == daycounter) && (tiva_current_month == monthNum) && (tiva_current_year == yearNum)) ? 'today' : '';
751				timetableString += '<td class="calendar-day ' + class_today + '">';
752					if ((daycounter <= numbDays) && (daycounter >= 1)) {
753						timetableString += '<div class="calendar-daycounter">' + daycounter + '</div>';
754					}
755					
756					// Get timetables of day
757					var timetables = getTimetables(tiva_timetables, daycounter, monthNum, yearNum);
758					for (var t = 0; t < timetables.length; t++) {
759						// Image
760						if (timetables[t].image) {
761							var timetable_image = '<div class="timetable-image"><img src="timetable/images/' + timetables[t].image + '" alt="' + timetables[t].name + '" /></div>';
762						} else {
763							var timetable_image = '';
764						}
765						if(timetables[t].description==""){
766							var showbody = ' style="display:none;"';
767						}else{
768							var showbody      = "";
769						}
770						if(timetables[t].start_time=="00:00" && timetables[t].end_time=="23:59"){
771							var datetimeevent = "ตลอดวัน";
772							var showtime      = "";
773						}else if(timetables[t].end_time=="" && timetables[t].end_time==""){
774							var datetimeevent = "";
775							var showtime      = ' style="display:none;"';
776						}else{
777							if (timetables[t].end_time) {
778								var timetable_end_time = ' - ' + timetables[t].end_time;
779							} else {
780								var timetable_end_time = '';
781							}
782							var datetimeevent = timetables[t].start_time + timetable_end_time;
783							var showtime      = "";
784						}
785						// End time
786						
787if (timetables[t].filename) {
788//var fileatt = timetables[t].filename;
789//var filetype = fileatt.split(".");
790var fileatt = '';
791var filetype = '';
792//var fileattatch = '<p> FileName : <a href="/assets/portals/740/event/'+ timetables[t].eid +'/'+timetables[t].fileid+'.'+filetype[1]+'" target="_blank">' + timetables[t].filename + '</a></p>';
793//var fileattatchdes =  '<div class="timetable-desc">' + timetables[t].filedescription + '</div><br />';
794var fileattatch = '<p> ไฟล์แนบ : <a href="'+ timetables[t].filename +'" target="_blank">Download</a></p>';
795var fileattatchdes = ''; 
796}else{
797 var fileatt = '';
798 var filetype = '';
799 var fileattatch = '';
800 var fileattatchdes = ''; 
801 
802}
803//alert(filetype[1]);
804
805var widthtable = $(".tiva-timetable").width()/7;
806var daywidth = (widthtable*timetables[t].duration-50);
807var colwidth = '';
808if(daywidth < 0){
809	daywidth = '20';
810	colwidth = daywidth+'px;margin-left:-10px;';
811}else{
812	colwidth = daywidth+'px;';
813}
814//console.log(widthtable);
815
816// console.log(timetables[t]);
817// เช็คลิงก์ไฟล์
818var filelink = timetables[t].filelink;
819var anchor_filelink = '';
820if (filelink && filelink !== '#') {
821	anchor_filelink = '<a class="btn" style="color: white; border-radius: 10px; background-color: ' + timetables[t].color_code + ';" href="' + timetables[t].filelink + '" target="_blank">ดูรายละเอียด</a>'
822} else {
823	anchor_filelink = '';
824}
825
826						timetableString += 	'<div class="timetable-item" style="background-color:' + timetables[t].color_code + '">'
827												+ '<a class="timetable-title open-popup-link" href="#' + el.attr('id') + '-popup-' + timetables[t].id + '" role="button" aria-controls="' + el.attr('id') + '-popup-' + timetables[t].id + '" aria-expanded="false" aria-label="ปฏิทินการประชุม">'
828												+ '<div style="width:'+colwidth+'height:10px;float:left;margin-bottom:2px;background-color:' + timetables[t].color_code + '"></div>'
829												+ '</a>'
830												+ '<div id="' + el.attr('id') + '-popup-' + timetables[t].id + '" class="timetable-popup zoom-anim-dialog mfp-hide">'
831													+ '<div class="popup-header" style="background-color:' + timetables[t].color_code + '">'
832														+ timetables[t].datethai
833														+ timetables[t].name
834													+ '</div>'
835													+ '<div class="popup-body"'+showbody+'>'
836														+ timetable_image 
837														+ '<div class="timetable-time color-' + timetables[t].color + '"'+showtime+'>' + datetimeevent + '</div>'
838														+ '<div class="timetable-desc">' + timetables[t].description + '</div><br />'
839														+ '<div class="timetable-btnlink">'
840														+ anchor_filelink
841														+ '</div>'
842														+ fileattatch
843														+ fileattatchdes
844														
845													+ '</div>'
846												+ '</div>'
847											+ '</div>';
848
849											
850					}
851				timetableString += '</td>';
852			}
853			timetableString += '</tr>';
854		}
855	}
856	timetableString += '</tbody>';
857	timetableString += '</table>';
858	
859	el.html(timetableString);
860
861	// Popup
862	el.find('.timetable-title').magnificPopup({
863		type: 'inline',
864		removalDelay: 800,
865		mainClass: 'my-mfp-zoom-in'
866	});
867	
868	thisDate = 1;
869}
870
871jQuery(document).ready(function(){
872	jQuery('.tiva-timetable').each(function(index) {
873		// Set id for timetable
874		jQuery(this).attr('id', 'timetable-' + (index + 1));
875		var cururl = $(location).attr('href');
876		var portalid = cururl.split("/",6);
877		// console.log(portalid);
878		
879		//alert(resstr[4]);
880		// Get timetables from json file or ajax php
881		var source = (typeof jQuery(this).attr('data-source') != 'undefined') ? jQuery(this).attr('data-source') : 'json';
882		var view = (typeof jQuery(this).attr('data-view') != 'undefined') ? jQuery(this).attr('data-view') : 'month';
883		if ((jQuery(this).attr('data-mode') == 'day') && ((view == 'week') || (view == 'list'))) {
884			var mode = 'day';
885		} else {
886			var mode = 'date';
887		}
888		
889		var timetable_contain = jQuery(this);
890		
891		if (source == 'json') { // Get timetables from json file
892			if (mode == 'day') {
893				var timetable_json = '/library/tivatimetable/timetable/timetables_day.json';
894			} else {
895				var timetable_json = '/library/tivatimetable/timetable/timetables_date.json';
896			}
897			
898			jQuery.getJSON(timetable_json, function(data) {
899				// Init timetables variable
900				tiva_timetables = [];
901				
902				for (var i = 0; i < data.items.length; i++) {
903					tiva_timetables.push(data.items[i]);
904				}
905				
906				// Sort timetables by date
907				tiva_timetables.sort(sortByTime);
908				
909				for (var j = 0; j < tiva_timetables.length; j++) {
910					tiva_timetables[j].id = j;
911				}
912				
913				// Create timetable
914				var todayDate = new Date();
915				var date_start = (typeof timetable_contain.attr('data-start') != "undefined") ? timetable_contain.attr('data-start') : 'sunday';
916				if (date_start == 'sunday') {
917					var tiva_current_week = new Date(todayDate.setDate(tiva_current_date.getDate() - todayDate.getDay()));
918				} else {
919					var today_date = (todayDate.getDay() == 0) ? 7 : todayDate.getDay();
920					var tiva_current_week = new Date(todayDate.setDate(tiva_current_date.getDate() - today_date + 1));
921				}
922				createTimetable(timetable_contain, 'current', tiva_current_week, tiva_current_month, tiva_current_year);
923			});
924		}
924 else { // Get timetables from php file via ajax : timetables/timetables.php
925			var timetableElement = document.querySelector('.tiva-timetable');
926			var phpModuleid = timetableElement.getAttribute('data-moduleid');
927			var phpLangid = timetableElement.getAttribute('data-langid');
928			// console.log('moduleid '+ phpModuleid); // Use the PHP variable in your JS code
929			// console.log('langid '+ phpLangid);
930			var urlgetData = '/calendar_meeting_module/displayEventTivaTimeTable/'+phpModuleid+'/'+phpLangid+'/?p='+portalid[4];
931			console.log('urlgetData '+ urlgetData);
932			jQuery.ajax({
933				url: urlgetData,//get from url spit limit 5 value in array4 
934				dataType: 'json',
935				data: '',
936				beforeSend : function(){
937					timetable_contain.html('<div class="loading"><img src="/assets/images/loading.gif" /></div>');
938				},
939				success: function(data) {
940					// Init timetables variable
941					tiva_timetables = [];
942				
943					for (var i = 0; i < data.length; i++) {
944						tiva_timetables.push(data[i]);
945					}
946					
947					// Sort timetables by date
948					tiva_timetables.sort(sortByTime);
949				
950					for (var j = 0; j < tiva_timetables.length; j++) {
951						tiva_timetables[j].id = j;
952					}
953					
954					// Create timetable
955					var todayDate = new Date();
956					var date_start = (typeof timetable_contain.attr('data-start') != "undefined") ? timetable_contain.attr('data-start') : 'sunday';
957					if (date_start == 'sunday') {
958						var tiva_current_week = new Date(todayDate.setDate(tiva_current_date.getDate() - todayDate.getDay()));
959					} else {
960						var today_date = (todayDate.getDay() == 0) ? 7 : todayDate.getDay();
961						var tiva_current_week = new Date(todayDate.setDate(tiva_current_date.getDate() - today_date + 1));
962					}
963					createTimetable(timetable_contain, 'current', tiva_current_week, tiva_current_month, tiva_current_year);
964				},
965				error: function (xhr, ajaxOptions, thrownError) {
966					alert(xhr.status);
967					alert(thrownError);
968					// console.log(xhr.status);
969					// console.log(thrownError);
970				  }
971			});	
972		}
973	});
974});

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.