PageSourceSearch

https://static.hyundailivart.co.kr/assets/js/custom_calendar.js

js hyundailivart.co.kr collected 2026-10-04 08:30:33 UTC 26,647 bytes, 774 lines download raw bytes

1/**
2 * Zabuto Calendar
3 *
4 * Dependencies
5 * - jQuery (2.0.3)
6 * - Twitter Bootstrap (3.0.2)
7 * customized by MyoungMinNam : 2020-05-29
8 * 1) YYYY년 MM월 수정
9 * 2) 접두어를 custom_ 로 변경
10 */
11
12if (typeof jQuery == 'undefined') {
13	throw new Error('jQuery is not loaded');
14}
15
16/**
17 * Create calendar
18 *
19 * @param options
20 * @returns {*}
21 */
22$.fn.custom_calendar = function (options) {
23	var opts = $.extend({}, $.fn.custom_calendar_defaults(), options);
24	var languageSettings = $.fn.custom_calendar_language(opts.language);
25	opts = $.extend({}, opts, languageSettings);
26
27	this.each(function () {
28		var $calendarElement = $(this);
29		// reload 처리를 위해 주석처리 : 20200623
30		// $calendarElement.attr('id', 'custom_calendar_' + Math.floor(Math.random() * 99999).toString(36));
31
32		$calendarElement.data('initYear', opts.year);
33		$calendarElement.data('initMonth', opts.month);
34		$calendarElement.data('monthLabels', opts.month_labels);
35		$calendarElement.data('weekStartsOn', opts.weekstartson);
36		$calendarElement.data('navIcons', opts.nav_icon);
37		$calendarElement.data('dowLabels', opts.dow_labels);
38		$calendarElement.data('showToday', opts.today);
39		$calendarElement.data('showDays', opts.show_days);
40		$calendarElement.data('showPrevious', opts.show_previous);
41		$calendarElement.data('showNext', opts.show_next);
42		$calendarElement.data('cellBorder', opts.cell_border);
43		$calendarElement.data('jsonData', opts.data);
44		$calendarElement.data('ajaxSettings', opts.ajax);
45		$calendarElement.data('legendList', opts.legend);
46		$calendarElement.data('actionFunction', opts.action);
47		$calendarElement.data('actionNavFunction', opts.action_nav);
48
49		drawCalendar();
50
51		function drawCalendar() {
52			var dateInitYear = parseInt($calendarElement.data('initYear'));
53			var dateInitMonth = parseInt($calendarElement.data('initMonth')) - 1;
54			var dateInitObj = new Date(dateInitYear, dateInitMonth, 1, 0, 0, 0, 0);
55			$calendarElement.data('initDate', dateInitObj);
56
57			var tableClassHtml = $calendarElement.data('cellBorder') === true ? ' table-bordered' : '';
58
59			var $tableObj = $('<table class="table' + tableClassHtml + '"></table>');
60			$tableObj = drawTable($calendarElement, $tableObj, dateInitObj.getFullYear(), dateInitObj.getMonth());
61
62			var $legendObj = drawLegend($calendarElement);
63
64			var $containerHtml = $('<div class="custom_calendar"></div>');
65			$containerHtml.append($tableObj);
66			$containerHtml.append($legendObj);
67
68			$calendarElement.append($containerHtml);
69
70			var jsonData = $calendarElement.data('jsonData');
71			if (false !== jsonData) {
72				checkEvents($calendarElement, dateInitObj.getFullYear(), dateInitObj.getMonth());
73			}
74		}
75
76		function drawTable($calendarElement, $tableObj, year, month) {
77			var dateCurrObj = new Date(year, month, 1, 0, 0, 0, 0);
78			$calendarElement.data('currDate', dateCurrObj);
79
80			$tableObj.empty();
81			$tableObj = appendMonthHeader($calendarElement, $tableObj, year, month);
82			$tableObj = appendDayOfWeekHeader($calendarElement, $tableObj);
83			$tableObj = appendDaysOfMonth($calendarElement, $tableObj, year, month);
84			checkEvents($calendarElement, year, month);
85			return $tableObj;
86		}
87
88		function drawLegend($calendarElement) {
89			var $legendObj = $('<div class="legend" id="' + $calendarElement.attr('id') + '_legend"></div>');
90			var legend = $calendarElement.data('legendList');
91			if (typeof legend == 'object' && legend.length > 0) {
92				$(legend).each(function (index, item) {
93					if (typeof item == 'object') {
94						if ('type' in item) {
95							var itemLabel = '';
96							if ('label' in item) {
97								itemLabel = item.label;
98							}
99
100							switch (item.type) {
101								case 'text':
102									if (itemLabel !== '') {
103										var itemBadge = '';
104										if ('badge' in item) {
105											if (typeof item.classname === 'undefined') {
106												var badgeClassName = 'badge-event';
107											} else {
108												var badgeClassName = item.classname;
109											}
110											itemBadge = '<span class="badge ' + badgeClassName + '">' + item.badge + '</span> ';
111										}
112										$legendObj.append('<span class="legend-' + item.type + '">' + itemBadge + itemLabel + '</span>');
113									}
114									break;
115								case 'block':
116									if (itemLabel !== '') {
117										itemLabel = '<span>' + itemLabel + '</span>';
118									}
119									if (typeof item.classname === 'undefined') {
120										var listClassName = 'event';
121									} else {
122										var listClassName = 'event-styled ' + item.classname;
123									}
124									$legendObj.append('<span class="legend-' + item.type + '"><ul class="legend"><li class="' + listClassName + '"></li></ul>' + itemLabel + '</span>');
125									break;
126								case 'list':
127									if ('list' in item && typeof item.list == 'object' && item.list.length > 0) {
128										var $legendUl = $('<ul class="legend"></ul>');
129										$(item.list).each(function (listIndex, listClassName) {
130											$legendUl.append('<li class="' + listClassName + '"></li>');
131										});
132										$legendObj.append($legendUl);
133									}
134									break;
135								case 'spacer':
136									$legendObj.append('<span class="legend-' + item.type + '"> </span>');
137									break;
138							}
139						}
140					}
141				});
142			}
143
144			return $legendObj;
145		}
146
147		function appendMonthHeader($calendarElement, $tableObj, year, month) {
148			var navIcons = $calendarElement.data('navIcons');
149			var $prevMonthNavIcon = $('<span><span class="glyphicon glyphicon-chevron-left"></span></span>');
150			var $nextMonthNavIcon = $('<span><span class="glyphicon glyphicon-chevron-right"></span></span>');
151			if (typeof navIcons === 'object') {
152				if ('prev' in navIcons) {
153					$prevMonthNavIcon.html(navIcons.prev);
154				}
155				if ('next' in navIcons) {
156					$nextMonthNavIcon.html(navIcons.next);
157				}
158			}
159
160			var prevIsValid = $calendarElement.data('showPrevious');
161			if (typeof prevIsValid === 'number' || prevIsValid === false) {
162				prevIsValid = checkMonthLimit($calendarElement.data('showPrevious'), true);
163			}
164
165			var $prevMonthNav = $('<div class="calendar-month-navigation"></div>');
166			$prevMonthNav.attr('id', $calendarElement.attr('id') + '_nav-prev');
167			$prevMonthNav.data('navigation', 'prev');
168			if (prevIsValid !== false) {
169				var prevMonth = month - 1;
170				var prevYear = year;
171				if (prevMonth == -1) {
172					prevYear = prevYear - 1;
173					prevMonth = 11;
174				}
175				$prevMonthNav.data('to', { year: prevYear, month: prevMonth + 1 });
176				$prevMonthNav.append($prevMonthNavIcon);
177				if (typeof $calendarElement.data('actionNavFunction') === 'function') {
178					$prevMonthNav.click($calendarElement.data('actionNavFunction'));
179				}
180				$prevMonthNav.click(function (e) {
181					drawTable($calendarElement, $tableObj, prevYear, prevMonth);
182				});
183			}
184
185			var nextIsValid = $calendarElement.data('showNext');
186			if (typeof nextIsValid === 'number' || nextIsValid === false) {
187				nextIsValid = checkMonthLimit($calendarElement.data('showNext'), false);
188			}
189
190			var $nextMonthNav = $('<div class="calendar-month-navigation"></div>');
191			$nextMonthNav.attr('id', $calendarElement.attr('id') + '_nav-next');
192			$nextMonthNav.data('navigation', 'next');
193			if (nextIsValid !== false) {
194				var nextMonth = month + 1;
195				var nextYear = year;
196				if (nextMonth == 12) {
197					nextYear = nextYear + 1;
198					nextMonth = 0;
199				}
200				$nextMonthNav.data('to', { year: nextYear, month: nextMonth + 1 });
201				$nextMonthNav.append($nextMonthNavIcon);
202				if (typeof $calendarElement.data('actionNavFunction') === 'function') {
203					$nextMonthNav.click($calendarElement.data('actionNavFunction'));
204				}
205				$nextMonthNav.click(function (e) {
206					drawTable($calendarElement, $tableObj, nextYear, nextMonth);
207				});
208			}
209
210			var monthLabels = $calendarElement.data('monthLabels');
211
212			var $prevMonthCell = $('<td></td>').append($prevMonthNav);
213			var $nextMonthCell = $('<td></td>').append($nextMonthNav);
214
215			var $currMonthLabel = $('<span>' + year + '년 ' + monthLabels[month] + '</span>');
216			$currMonthLabel.dblclick(function () {
217				var dateInitObj = $calendarElement.data('initDate');
218				drawTable($calendarElement, $tableObj, dateInitObj.getFullYear(), dateInitObj.getMonth());
219			});
220
221			var $currMonthCell = $('<td colspan="5"></td>');
222			$currMonthCell.append($currMonthLabel);
223
224			var $monthHeaderRow = $('<tr class="calendar-month-header"></tr>');
225			$monthHeaderRow.append($prevMonthCell, $currMonthCell, $nextMonthCell);
226
227			$tableObj.append($monthHeaderRow);
228			return $tableObj;
229		}
230
231		function appendDayOfWeekHeader($calendarElement, $tableObj) {
232			if ($calendarElement.data('showDays') === true) {
233				var weekStartsOn = $calendarElement.data('weekStartsOn');
234				var dowLabels = $calendarElement.data('dowLabels');
235				if (weekStartsOn === 0) {
236					var dowFull = $.extend([], dowLabels);
237					var sunArray = new Array(dowFull.pop());
238					dowLabels = sunArray.concat(dowFull);
239				}
240
241				var $dowHeaderRow = $('<tr class="calendar-dow-header"></tr>');
242				$(dowLabels).each(function (index, value) {
243					$dowHeaderRow.append('<th>' + value + '</th>');
244				});
245				$tableObj.append($dowHeaderRow);
246			}
247			return $tableObj;
248		}
249
250		function appendDaysOfMonth($calendarElement, $tableObj, year, month) {
251			var ajaxSettings = $calendarElement.data('ajaxSettings');
252			var weeksInMonth = calcWeeksInMonth(year, month);
253			var lastDayinMonth = calcLastDayInMonth(year, month);
254			var firstDow = calcDayOfWeek(year, month, 1);
255			var lastDow = calcDayOfWeek(year, month, lastDayinMonth);
256			var currDayOfMonth = 1;
257
258			var weekStartsOn = $calendarElement.data('weekStartsOn');
259			if (weekStartsOn === 0) {
260				if (lastDow == 6) {
261					weeksInMonth++;
262				}
263				if (firstDow == 6 && (lastDow == 0 || lastDow == 1 || lastDow == 5)) {
264					weeksInMonth--;
265				}
266				firstDow++;
267				if (firstDow == 7) {
268					firstDow = 0;
269				}
270			}
271
272			for (var wk = 0; wk < weeksInMonth; wk++) {
273				var $dowRow = $('<tr class="calendar-dow"></tr>');
274				for (var dow = 0; dow < 7; dow++) {
275					if (dow < firstDow || currDayOfMonth > lastDayinMonth) {
276						$dowRow.append('<td></td>');
277					} else {
278						var dateId = $calendarElement.attr('id') + '_' + dateAsString(year, month, currDayOfMonth);
279						var dayId = dateId + '_day';
280
281						var $dayElement = $('<div id="' + dayId + '" class="day" >' + currDayOfMonth + '</div>');
282						$dayElement.data('day', currDayOfMonth);
283
284						if (isToday(year, month, currDayOfMonth)) {
285							$dayElement.addClass('today');
286							if ($calendarElement.data('showToday') === true) {
287								$dayElement.html('<span class="badge badge-today">' + currDayOfMonth + '</span>');
288							}
289						}
290
291						var $dowElement = $('<td id="' + dateId + '"></td>');
292						$dowElement.append($dayElement);
293
294						$dowElement.data('date', dateAsString(year, month, currDayOfMonth));
295						$dowElement.data('hasEvent', false);
296
297						if (typeof $calendarElement.data('actionFunction') === 'function') {
298							$dowElement.addClass('dow-clickable');
299							$dowElement.click(function () {
300								$calendarElement.data('selectedDate', $(this).data('date'));
301							});
302							$dowElement.click($calendarElement.data('actionFunction'));
303						}
304
305						$dowRow.append($dowElement);
306
307						currDayOfMonth++;
308					}
309					if (dow == 6) {
310						firstDow = 0;
311					}
312				}
313
314				$tableObj.append($dowRow);
315			}
316			return $tableObj;
317		}
318
319		/* ----- Modal functions ----- */
320
321		function createModal(id, title, body, footer) {
322			var $modalHeaderButton = $('<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>');
323			var $modalHeaderTitle = $('<h4 class="modal-title" id="' + id + '_modal_title">' + title + '</h4>');
324
325			var $modalHeader = $('<div class="modal-header"></div>');
326			$modalHeader.append($modalHeaderButton);
327			$modalHeader.append($modalHeaderTitle);
328
329			var $modalBody = $('<div class="modal-body" id="' + id + '_modal_body">' + body + '</div>');
330
331			var $modalFooter = $('<div class="modal-footer" id="' + id + '_modal_footer"></div>');
332			if (typeof footer !== 'undefined') {
333				var $modalFooterAddOn = $('<div>' + footer + '</div>');
334				$modalFooter.append($modalFooterAddOn);
335			}
336
337			var $modalContent = $('<div class="modal-content"></div>');
338			$modalContent.append($modalHeader);
339			$modalContent.append($modalBody);
340			$modalContent.append($modalFooter);
341
342			var $modalDialog = $('<div class="modal-dialog"></div>');
343			$modalDialog.append($modalContent);
344
345			var $modalFade = $('<div class="modal fade" id="' + id + '_modal" tabindex="-1" role="dialog" aria-labelledby="' + id + '_modal_title" aria-hidden="true"></div>');
346			$modalFade.append($modalDialog);
347
348			$modalFade.data('dateId', id);
349			$modalFade.attr('dateId', id);
350
351			return $modalFade;
352		}
353
354		/* ----- Event functions ----- */
355
356		function checkEvents($calendarElement, year, month) {
357			var jsonData = $calendarElement.data('jsonData');
358			var ajaxSettings = $calendarElement.data('ajaxSettings');
359
360			$calendarElement.data('events', false);
361
362			if (false !== jsonData) {
363				return jsonEvents($calendarElement);
364			} else if (false !== ajaxSettings) {
365				return ajaxEvents($calendarElement, year, month);
366			}
367
368			return true;
369		}
370
371		function jsonEvents($calendarElement) {
372			var jsonData = $calendarElement.data('jsonData');
373			$calendarElement.data('events', jsonData);
374			drawEvents($calendarElement, 'json');
375			return true;
376		}
377
378		function ajaxEvents($calendarElement, year, month) {
379			var ajaxSettings = $calendarElement.data('ajaxSettings');
380
381			if (typeof ajaxSettings != 'object' || typeof ajaxSettings.url == 'undefined') {
382				alert('Invalid calendar event settings');
383				return false;
384			}
385
386			var data = { year: year, month: month + 1 };
387
388			$.ajax({
389				type: 'GET',
390				url: ajaxSettings.url,
391				data: data,
392				dataType: 'json',
393			}).done(function (response) {
394				var events = [];
395				$.each(response, function (k, v) {
396					events.push(response[k]);
397				});
398				$calendarElement.data('events', events);
399				drawEvents($calendarElement, 'ajax');
400			});
401
402			return true;
403		}
404
405		function drawEvents($calendarElement, type) {
406			var jsonData = $calendarElement.data('jsonData');
407			var ajaxSettings = $calendarElement.data('ajaxSettings');
408
409			var events = $calendarElement.data('events');
410			if (events !== false) {
411				$(events).each(function (index, value) {
412					var id = $calendarElement.attr('id') + '_' + value.date;
413					var $dowElement = $('#' + id);
414					var $dayElement = $('#' + id + '_day');
415
416					$dowElement.data('hasEvent', true);
417
418					if (typeof value.title !== 'undefined') {
419						$dowElement.attr('title', value.title);
420					}
421
422					if (typeof value.classname === 'undefined') {
423						$dowElement.addClass('event');
424					} else {
425						$dowElement.addClass('event-styled');
426						$dayElement.addClass(value.classname);
427					}
428
429					if (typeof value.badge !== 'undefined' && value.badge !== false) {
430						var badgeClass = value.badge === true ? '' : ' badge-' + value.badge;
431						var dayLabel = $dayElement.data('day');
432						$dayElement.html('<span class="badge badge-event' + badgeClass + '">' + dayLabel + '</span>');
433					}
434
435					if (typeof value.body !== 'undefined') {
436						var modalUse = false;
437						if (type === 'json' && typeof value.modal !== 'undefined' && value.modal === true) {
438							modalUse = true;
439						} else if (type === 'ajax' && 'modal' in ajaxSettings && ajaxSettings.modal === true) {
440							modalUse = true;
441						}
442
443						if (modalUse === true) {
444							$dowElement.addClass('event-clickable');
445
446							var $modalElement = createModal(id, value.title, value.body, value.footer);
447							$('body').append($modalElement);
448
449							$('#' + id).click(function () {
450								$('#' + id + '_modal').modal();
451							});
452						}
453					}
454				});
455			}
456		}
457
458		/* ----- Helper functions ----- */
459
460		function isToday(year, month, day) {
461			var todayObj = new Date();
462			var dateObj = new Date(year, month, day);
463			return dateObj.toDateString() == todayObj.toDateString();
464		}
465
466		function dateAsString(year, month, day) {
467			var m, d;
468			d = day < 10 ? '0' + day : day;
469			m = month + 1;
470			m = m < 10 ? '0' + m : m;
471			return year + '-' + m + '-' + d;
472		}
473
474		function calcDayOfWeek(year, month, day) {
475			var dateObj = new Date(year, month, day, 0, 0, 0, 0);
476			var dow = dateObj.getDay();
477			if (dow == 0) {
478				dow = 6;
479			} else {
480				dow--;
481			}
482			return dow;
483		}
484
485		function calcLastDayInMonth(year, month) {
486			var day = 28;
487			while (checkValidDate(year, month + 1, day + 1)) {
488				day++;
489			}
490			return day;
491		}
492
493		function calcWeeksInMonth(year, month) {
494			var daysInMonth = calcLastDayInMonth(year, month);
495			var firstDow = calcDayOfWeek(year, month, 1);
496			var lastDow = calcDayOfWeek(year, month, daysInMonth);
497			var days = daysInMonth;
498			var correct = firstDow - lastDow;
499			if (correct > 0) {
500				days += correct;
501			}
502			return Math.ceil(days / 7);
503		}
504
505		function checkValidDate(y, m, d) {
506			return m > 0 && m < 13 && y > 0 && y < 32768 && d > 0 && d <= new Date(y, m, 0).getDate();
507		}
508
509		function checkMonthLimit(count, invert) {
510			if (count === false) {
511				count = 0;
512			}
513			var d1 = $calendarElement.data('currDate');
514			var d2 = $calendarElement.data('initDate');
515
516			var months;
517			months = (d2.getFullYear() - d1.getFullYear()) * 12;
518			months -= d1.getMonth() + 1;
519			months += d2.getMonth();
520
521			if (invert === true) {
522				if (months < parseInt(count) - 1) {
523					return true;
524				}
525			} else {
526				if (months >= 0 - parseInt(count)) {
527					return true;
528				}
529			}
530			return false;
531		}
532	}); // each()
533
534	return this;
535};
536
537/**
538 * Default settings
539 *
540 * @returns object
541 *   language:          string,
542 *   year:              integer,
543 *   month:             integer,
544 *   show_previous:     boolean|integer,
545 *   show_next:         boolean|integer,
546 *   cell_border:       boolean,
547 *   today:             boolean,
548 *   show_days:         boolean,
549 *   weekstartson:      integer (0 = Sunday, 1 = Monday),
550 *   nav_icon:          object: prev: string, next: string
551 *   ajax:              object: url: string, modal: boolean,
552 *   legend:            object array, [{type: string, label: string, classname: string}]
553 *   action:            function
554 *   action_nav:        function
555 */
556$.fn.custom_calendar_defaults = function () {
557	var now = new Date();
558	var year = now.getFullYear();
559	var month = now.getMonth() + 1;
560	var settings = {
561		language: false,
562		year: year,
563		month: month,
564		show_previous: true,
565		show_next: true,
566		cell_border: false,
567		today: false,
568		show_days: true,
569		weekstartson: 1,
570		nav_icon: false,
571		data: false,
572		ajax: false,
573		legend: false,
574		action: false,
575		action_nav: false,
576	};
577	return settings;
578};
579
580/**
581 * Language settings
582 *
583 * @param lang
584 * @returns {{month_labels: Array, dow_labels: Array}}
585 */
586$.fn.custom_calendar_language = function (lang) {
587	if (typeof lang == 'undefined' || lang === false) {
588		lang = 'en';
589	}
590
591	switch (lang.toLowerCase()) {
592		case 'ar':
593			return {
594				month_labels: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],
595				dow_labels: ['أثنين', 'ثلاثاء', 'اربعاء', 'خميس', 'جمعه', 'سبت', 'أحد'],
596			};
597			break;
598
599		case 'az':
600			return {
601				month_labels: ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'],
602				dow_labels: ['B.e', 'Ç.A', 'Çərş', 'C.A', 'Cümə', 'Şən', 'Baz'],
603			};
604			break;
605
606		case 'ca':
607			return {
608				month_labels: ['Gener', 'Febrer', 'Març', 'Abril', 'Maig', 'Juny', 'Juliol', 'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre'],
609				dow_labels: ['Dl', 'Dt', 'Dc', 'Dj', 'Dv', 'Ds', 'Dg'],
610			};
611			break;
612
613		case 'cn':
614			return {
615				month_labels: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
616				dow_labels: ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'],
617			};
618			break;
619
620		case 'cs':
621			return {
622				month_labels: ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec'],
623				dow_labels: ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne'],
624			};
625			break;
626
627		case 'de':
628			return {
629				month_labels: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
630				dow_labels: ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'],
631			};
632			break;
633
634		case 'en':
635			return {
636				month_labels: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
637				dow_labels: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
638			};
639			break;
640
641		case 'he':
642			return {
643				month_labels: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],
644				dow_labels: ['ב', 'ג', 'ד', 'ה', 'ו', 'ש', 'א'],
645			};
646			break;
647
648		case 'es':
649			return {
650				month_labels: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', '
650Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],
651				dow_labels: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá', 'Do'],
652			};
653			break;
654
655		case 'fi':
656			return {
657				month_labels: ['Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', 'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu'],
658				dow_labels: ['Ma', 'Ti', 'Ke', 'To', 'Pe', 'La', 'Su'],
659			};
660			break;
661
662		case 'fr':
663			return {
664				month_labels: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
665				dow_labels: ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim'],
666			};
667			break;
668
669		case 'hu':
670			return {
671				month_labels: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
672				dow_labels: ['Hé', 'Ke', 'Sze', 'Cs', 'Pé', 'Szo', 'Va'],
673			};
674			break;
675
676		case 'id':
677			return {
678				month_labels: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],
679				dow_labels: ['Senin', 'Selasa', 'Rabu', 'Kamis', "Jum'at", 'Sabtu', 'Minggu'],
680			};
681			break;
682
683		case 'it':
684			return {
685				month_labels: ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
686				dow_labels: ['Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom'],
687			};
688			break;
689
690		case 'jp':
691			return {
692				month_labels: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
693				dow_labels: ['月', '火', '水', '木', '金', '土', '日'],
694			};
695			break;
696
697		case 'kr':
698			return {
699				month_labels: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
700				dow_labels: ['월', '화', '수', '목', '금', '토', '일'],
701			};
702			break;
703
704		case 'nl':
705			return {
706				month_labels: ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'],
707				dow_labels: ['Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za', 'Zo'],
708			};
709			break;
710
711		case 'no':
712			return {
713				month_labels: ['Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'],
714				dow_labels: ['Ma', 'Ti', 'On', 'To', 'Fr', 'L\u00f8', 'S\u00f8'],
715			};
716			break;
717
718		case 'pl':
719			return {
720				month_labels: ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'],
721				dow_labels: ['pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.', 'niedz.'],
722			};
723			break;
724
725		case 'pt':
726			return {
727				month_labels: ['Janeiro', 'Fevereiro', 'Marco', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
728				dow_labels: ['S', 'T', 'Q', 'Q', 'S', 'S', 'D'],
729			};
730			break;
731
732		case 'ru':
733			return {
734				month_labels: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
735				dow_labels: ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вск'],
736			};
737			break;
738
739		case 'se':
740			return {
741				month_labels: ['Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni', 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'],
742				dow_labels: ['Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör', 'Sön'],
743			};
744			break;
745
746		case 'sk':
747			return {
748				month_labels: ['Január', 'Február', 'Marec', 'Apríl', 'Máj', 'Jún', 'Júl', 'August', 'September', 'Október', 'November', 'December'],
749				dow_labels: ['Po', 'Ut', 'St', 'Å t', 'Pi', 'So', 'Ne'],
750			};
751			break;
752
753		case 'sr':
754			return {
755				month_labels: ['Јануар', 'Фебруар', 'Март', 'Април', 'Мај', 'Јун', 'Јул', 'Август', 'Септембар', 'Октобар', 'Новембар', 'Децембар'],
756				dow_labels: ['Пон', 'Уто', 'Сре', 'Чет', 'Пет', 'Суб', 'Нед'],
757			};
758			break;
759
760		case 'tr':
761			return {
762				month_labels: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],
763				dow_labels: ['Pts', 'Salı', 'Çar', 'Per', 'Cuma', 'Cts', 'Paz'],
764			};
765			break;
766
767		case 'ua':
768			return {
769				month_labels: ['Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'],
770				dow_labels: ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Нд'],
771			};
772			break;
773	}
774};

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.