PageSourceSearch

https://ama-med.org.ar/assets/front/js/vendor/zabuto_calendar.js

js ama-med.org.ar collected 2026-10-02 06:47:04 UTC 27,774 bytes, 671 lines download raw bytes

1/**
2 * Zabuto Calendar
3 *
4 * Dependencies
5 * - jQuery (2.0.3)
6 * - Twitter Bootstrap (3.0.2)
7 */
8
9if (typeof jQuery == 'undefined') {
10    throw new Error('jQuery is not loaded');
11}
12
13/**
14 * Create calendar
15 *
16 * @param options
17 * @returns {*}
18 */
19$.fn.zabuto_calendar = function (options) {
20    var opts = $.extend({}, $.fn.zabuto_calendar_defaults(), options);
21    var languageSettings = $.fn.zabuto_calendar_language(opts.language);
22    opts = $.extend({}, opts, languageSettings);
23
24    this.each(function () {
25        var $calendarElement = $(this);
26        $calendarElement.attr('id', "zabuto_calendar_" + Math.floor(Math.random() * 99999).toString(36));
27
28        $calendarElement.data('initYear', opts.year);
29        $calendarElement.data('initMonth', opts.month);
30        $calendarElement.data('monthLabels', opts.month_labels);
31        $calendarElement.data('weekStartsOn', opts.weekstartson);
32        $calendarElement.data('navIcons', opts.nav_icon);
33        $calendarElement.data('dowLabels', opts.dow_labels);
34        $calendarElement.data('showToday', opts.today);
35        $calendarElement.data('showDays', opts.show_days);
36        $calendarElement.data('showPrevious', opts.show_previous);
37        $calendarElement.data('showNext', opts.show_next);
38        $calendarElement.data('cellBorder', opts.cell_border);
39        $calendarElement.data('jsonData', opts.data);
40        $calendarElement.data('ajaxSettings', opts.ajax);
41        $calendarElement.data('legendList', opts.legend);
42        $calendarElement.data('actionFunction', opts.action);
43        $calendarElement.data('actionNavFunction', opts.action_nav);
44
45        drawCalendar();
46
47        function drawCalendar() {
48            var dateInitYear = parseInt($calendarElement.data('initYear'));
49            var dateInitMonth = parseInt($calendarElement.data('initMonth')) - 1;
50            var dateInitObj = new Date(dateInitYear, dateInitMonth, 1, 0, 0, 0, 0);
51            $calendarElement.data('initDate', dateInitObj);
52
53            var tableClassHtml = ($calendarElement.data('cellBorder') === true) ? ' table-bordered' : '';
54
55            $tableObj = $('<table class="table' + tableClassHtml + '"></table>');
56            $tableObj = drawTable($calendarElement, $tableObj, dateInitObj.getFullYear(), dateInitObj.getMonth());
57
58            $legendObj = drawLegend($calendarElement);
59
60            var $containerHtml = $('<div class="zabuto_calendar" id="' + $calendarElement.attr('id') + '"></div>');
61            $containerHtml.append($tableObj);
62            $containerHtml.append($legendObj);
63
64            $calendarElement.append($containerHtml);
65
66            var jsonData = $calendarElement.data('jsonData');
67            if (false !== jsonData) {
68                checkEvents($calendarElement, dateInitObj.getFullYear(), dateInitObj.getMonth());
69            }
70        }
71
72        function drawTable($calendarElement, $tableObj, year, month) {
73            var dateCurrObj = new Date(year, month, 1, 0, 0, 0, 0);
74            $calendarElement.data('currDate', dateCurrObj);
75
76            $tableObj.empty();
77            $tableObj = appendMonthHeader($calendarElement, $tableObj, year, month);
78            $tableObj = appendDayOfWeekHeader($calendarElement, $tableObj);
79            $tableObj = appendDaysOfMonth($calendarElement, $tableObj, year, month);
80            checkEvents($calendarElement, year, month);
81            return $tableObj;
82        }
83
84        function drawLegend($calendarElement) {
85            var $legendObj = $('<div class="legend" id="' + $calendarElement.attr('id') + '_legend"></div>');
86            var legend = $calendarElement.data('legendList');
87            if (typeof(legend) == 'object' && legend.length > 0) {
88                $(legend).each(function (index, item) {
89                    if (typeof(item) == 'object') {
90                        if ('type' in item) {
91                            var itemLabel = '';
92                            if ('label' in item) {
93                                itemLabel = item.label;
94                            }
95
96                            switch (item.type) {
97                                case 'text':
98                                    if (itemLabel !== '') {
99                                        var itemBadge = '';
100                                        if ('badge' in item) {
101                                            if (typeof(item.classname) === 'undefined') {
102                                                var badgeClassName = 'badge-event';
103                                            } else {
104                                                var badgeClassName = item.classname;
105                                            }
106                                            itemBadge = '<span class="badge ' + badgeClassName + '">' + item.badge + '</span> ';
107                                        }
108                                        $legendObj.append('<span class="legend-' + item.type + '">' + itemBadge + itemLabel + '</span>');
109                                    }
110                                    break;
111                                case 'block':
112                                    if (itemLabel !== '') {
113                                        itemLabel = '<span>' + itemLabel + '</span>';
114                                    }
115                                    if (typeof(item.classname) === 'undefined') {
116                                        var listClassName = 'event';
117                                    } else {
118                                        var listClassName = 'event-styled ' + item.classname;
119                                    }
120                                    $legendObj.append('<span class="legend-' + item.type + '"><ul class="legend"><li class="' + listClassName + '"></li></u>' + itemLabel + '</span>');
121                                    break;
122                                case 'list':
123                                    if ('list' in item && typeof(item.list) == 'object' && item.list.length > 0) {
124                                        var $legendUl = $('<ul class="legend"></u>');
125                                        $(item.list).each(function (listIndex, listClassName) {
126                                            $legendUl.append('<li class="' + listClassName + '"></li>');
127                                        });
128                                        $legendObj.append($legendUl);
129                                    }
130                                    break;
131                                case 'spacer':
132                                    $legendObj.append('<span class="legend-' + item.type + '"> </span>');
133                                    break;
134
135                            }
136                        }
137                    }
138                });
139            }
140
141            return $legendObj;
142        }
143
144        function appendMonthHeader($calendarElement, $tableObj, year, month) {
145            var navIcons = $calendarElement.data('navIcons');
146            var $prevMonthNavIcon = $('<span><i class="fa fa-angle-left"></i></span>');
147            var $nextMonthNavIcon = $('<span><i class="fa fa-angle-right"></i></span>');
148            if (typeof(navIcons) === 'object') {
149                if ('prev' in navIcons) {
150                    $prevMonthNavIcon.html(navIcons.prev);
151                }
152                if ('next' in navIcons) {
153                    $nextMonthNavIcon.html(navIcons.next);
154                }
155            }
156
157            var prevIsValid = $calendarElement.data('showPrevious');
158            if (typeof(prevIsValid) === 'number' || prevIsValid === false) {
159                prevIsValid = checkMonthLimit($calendarElement.data('showPrevious'), true);
160            }
161
162            var $prevMonthNav = $('<div class="calendar-month-navigation"></div>');
163            $prevMonthNav.attr('id', $calendarElement.attr('id') + '_nav-prev');
164            $prevMonthNav.data('navigation', 'prev');
165            if (prevIsValid !== false) {
166                prevMonth = (month - 1);
167                prevYear = year;
168                if (prevMonth == -1) {
169                    prevYear = (prevYear - 1);
170                    prevMonth = 11;
171                }
172                $prevMonthNav.data('to', {year: prevYear, month: (prevMonth + 1)});
173                $prevMonthNav.append($prevMonthNavIcon);
174                if (typeof($calendarElement.data('actionNavFunction')) === 'function') {
175                    $prevMonthNav.click($calendarElement.data('actionNavFunction'));
176                }
177                $prevMonthNav.click(function (e) {
178                    drawTable($calendarElement, $tableObj, prevYear, prevMonth);
179                });
180            }
181
182            var nextIsValid = $calendarElement.data('showNext');
183            if (typeof(nextIsValid) === 'number' || nextIsValid === false) {
184                nextIsValid = checkMonthLimit($calendarElement.data('showNext'), false);
185            }
186
187            var $nextMonthNav = $('<div class="calendar-month-navigation"></div>');
188            $nextMonthNav.attr('id', $calendarElement.attr('id') + '_nav-next');
189            $nextMonthNav.data('navigation', 'next');
190            if (nextIsValid !== false) {
191                nextMonth = (month + 1);
192                nextYear = year;
193                if (nextMonth == 12) {
194                    nextYear = (nextYear + 1);
195                    nextMonth = 0;
196                }
197                $nextMonthNav.data('to', {year: nextYear, month: (nextMonth + 1)});
198                $nextMonthNav.append($nextMonthNavIcon);
199                if (typeof($calendarElement.data('actionNavFunction')) === 'function') {
200                    $nextMonthNav.click($calendarElement.data('actionNavFunction'));
201                }
202                $nextMonthNav.click(function (e) {
203                    drawTable($calendarElement, $tableObj, nextYear, nextMonth);
204                });
205            }
206
207            var monthLabels = $calendarElement.data('monthLabels');
208
209            var $prevMonthCell = $('<th></th>').append($prevMonthNav);
210            var $nextMonthCell = $('<th></th>').append($nextMonthNav);
211
212            var $currMonthLabel = $('<span>' + monthLabels[month] + ' ' + year + '</span>');
213            $currMonthLabel.dblclick(function () {
214                var dateInitObj = $calendarElement.data('initDate');
215                drawTable($calendarElement, $tableObj, dateInitObj.getFullYear(), dateInitObj.getMonth());
216            });
217
218            var $currMonthCell = $('<th colspan="5"></th>');
219            $currMonthCell.append($currMonthLabel);
220
221            var $monthHeaderRow = $('<tr class="calendar-month-header"></tr>');
222            $monthHeaderRow.append($prevMonthCell, $currMonthCell, $nextMonthCell);
223
224            $tableObj.append($monthHeaderRow);
225            return $tableObj;
226        }
227
228        function appendDayOfWeekHeader($calendarElement, $tableObj) {
229            if ($calendarElement.data('showDays') === true) {
230                var weekStartsOn = $calendarElement.data('weekStartsOn');
231                var dowLabels = $calendarElement.data('dowLabels');
232                if (weekStartsOn === 0) {
233                    var dowFull = $.extend([], dowLabels);
234                    var sunArray = new Array(dowFull.pop());
235                    dowLabels = sunArray.concat(dowFull);
236                }
237
238                var $dowHeaderRow = $('<tr class="calendar-dow-header"></tr>');
239                $(dowLabels).each(function (index, value) {
240                    $dowHeaderRow.append('<th>' + value + '</th>');
241                });
242                $tableObj.append($dowHeaderRow);
243            }
244            return $tableObj;
245        }
246
247        function appendDaysOfMonth($calendarElement, $tableObj, year, month) {
248            var ajaxSettings = $calendarElement.data('ajaxSettings');
249            var weeksInMonth = calcWeeksInMonth(year, month);
250            var lastDayinMonth = calcLastDayInMonth(year, month);
251            var firstDow = calcDayOfWeek(year, month, 1);
252            var lastDow = calcDayOfWeek(year, month, lastDayinMonth);
253            var currDayOfMonth = 1;
254
255            var weekStartsOn = $calendarElement.data('weekStartsOn');
256            if (weekStartsOn === 0) {
257                if (lastDow == 6) {
258                    weeksInMonth++;
259                }
260                if (firstDow == 6 && (lastDow == 0 || lastDow == 1 || lastDow == 5)) {
261                    weeksInMonth--;
262                }
263                firstDow++;
264                if (firstDow == 7) {
265                    firstDow = 0;
266                }
267            }
268
269            for (var wk = 0; wk < weeksInMonth; wk++) {
270                var $dowRow = $('<tr class="calendar-dow"></tr>');
271                for (var dow = 0; dow < 7; dow++) {
272                    if (dow < firstDow || currDayOfMonth > lastDayinMonth) {
273                        $dowRow.append('<td></td>');
274                    } else {
275                        var dateId = $calendarElement.attr('id') + '_' + dateAsString(year, month, currDayOfMonth);
276                        var dayId = dateId + '_day';
277
278                        var $dayElement = $('<div id="' + dayId + '" class="day" >' + currDayOfMonth + '</div>');
279                        $dayElement.data('day', currDayOfMonth);
280
281                        if ($calendarElement.data('showToday') === true) {
282                            if (isToday(year, month, currDayOfMonth)) {
283                                $dayElement.html('<span class="badge badge-today">' + currDayOfMonth + '</span>');
284                            }
285                        }
286
287                        var $dowElement = $('<td id="' + dateId + '"></td>');
288                        $dowElement.append($dayElement);
289
290                        $dowElement.data('date', dateAsString(year, month, currDayOfMonth));
291                        $dowElement.data('hasEvent', false);
292
293                        if (typeof($calendarElement.data('actionFunction')) === 'function') {
294                            $dowElement.addClass('dow-clickable');
295                            $dowElement.click(function () {
296                                $calendarElement.data('selectedDate', $(this).data('date'));
297                            });
298                            $dowElement.click($calendarElement.data('actionFunction'));
299                        }
300
301                        $dowRow.append($dowElement);
302
303                        currDayOfMonth++;
304                    }
305                    if (dow == 6) {
306                        firstDow = 0;
307                    }
308                }
309
310                $tableObj.append($dowRow);
311            }
312            return $tableObj;
313        }
314
315     
316        /* ----- Event functions ----- */
317
318        function checkEvents($calendarElement, year, month) {
319            var jsonData = $calendarElement.data('jsonData');
320            var ajaxSettings = $calendarElement.data('ajaxSettings');
321
322            $calendarElement.data('events', false);
323
324            if (false !== jsonData) {
325                return jsonEvents($calendarElement);
326            } else if (false !== ajaxSettings) {
327                return ajaxEvents($calendarElement, year, month);
328            }
329
330            return true;
331        }
332
333        function jsonEvents($calendarElement) {
334            var jsonData = $calendarElement.data('jsonData');
335            $calendarElement.data('events', jsonData);
336            drawEvents($calendarElement, 'json');
337            return true;
338        }
339
340        function ajaxEvents($calendarElement, year, month) {
341            var ajaxSettings = $calendarElement.data('ajaxSettings');
342
343            if (typeof(ajaxSettings) != 'object' || typeof(ajaxSettings.url) == 'undefined') {
344                alert('Invalid calendar event settings');
345                return false;
346            }
347
348            var data = {year: year, month: (month + 1)};
349
350            $.ajax({
351                type: 'GET',
352                url: ajaxSettings.url,
353                data: data,
354                dataType: 'json'
355            }).done(function (response) {
356                var events = [];
357                $.each(response, function (k, v) {
358                    events.push(response[k]);
359                });
360                $calendarElement.data('events', events);
361                drawEvents($calendarElement, 'ajax');
362            });
363
364            return true;
365        }
366
367        function drawEvents($calendarElement, type) {
368            var jsonData = $calendarElement.data('jsonData');
369            var ajaxSettings = $calendarElement.data('ajaxSettings');
370
371            var events = $calendarElement.data('events');
372            if (events !== false) {
373                $(events).each(function (index, value) {
374                    var id = $calendarElement.attr('id') + '_' + value.date;
375                    var $dowElement = $('#' + id);
376                    var $dayElement = $('#' + id + '_day');
377
378                    $dowElement.data('hasEvent', true);
379
380                    if (typeof(value.title) !== 'undefined') {
381                        $dowElement.attr('title', value.title);
382                    }
383                    if (typeof(value.url) !== 'undefined') {
384                        $dowElement.attr('url', value.url);
385                    }
386                    if (typeof(value.location) !== 'undefined') {
387                        $dowElement.attr('location', value.location);
388                    }
389                    
390
391                    if (typeof(value.classname) === 'undefined') {
392                        $dowElement.addClass('event');
393                    } else {
394                        $dowElement.addClass('event-styled');
395                        $dayElement.addClass(value.classname);
396                    }
397
398                    if (typeof(value.badge) !== 'undefined' && value.badge !== false) {
399                        var badgeClass = (value.badge === true) ? '' : ' badge-' + value.badge;
400                        var dayLabel = $dayElement.data('day');
401                        $dayElement.html('<span class="badge badge-event' + badgeClass + '">' + dayLabel + '</span>');
402                    }
403
404                    if (typeof(value.body) !== 'undefined') {
405                        var modalUse = false;
406                        if (type === 'json' && typeof(value.modal) !== 'undefined' && value.modal === true) {
407                            modalUse = true;
408                        } else if (type === 'ajax' && 'modal' in ajaxSettings && ajaxSettings.modal === true) {
409                            modalUse = true;
410                        }
411
412                        if (modalUse === true) {
413                            $dowElement.addClass('event-clickable');
414
415                            var $modalElement = createModal(id, value.title, value.body, value.footer);
416                            $('body').append($modalElement);
417
418                            $('#' + id).click(function () {
419                                $('#' + id + '_modal').modal();
420                            });
421                        }
422                    }
423                });
424            }
425        }
426
427        /* ----- Helper functions ----- */
428
429        function isToday(year, month, day) {
430            var todayObj = new Date();
431            var dateObj = new Date(year, month, day);
432            return (dateObj.toDateString() == todayObj.toDateString());
433        }
434
435        function dateAsString(year, month, day) {
436            d = (day < 10) ? '0' + day : day;
437            m = month + 1;
438            m = (m < 10) ? '0' + m : m;
439            return year + '-' + m + '-' + d;
440        }
441
442        function calcDayOfWeek(year, month, day) {
443            var dateObj = new Date(year, month, day, 0, 0, 0, 0);
444            var dow = dateObj.getDay();
445            if (dow == 0) {
446                dow = 6;
447            } else {
448                dow--;
449            }
450            return dow;
451        }
452
453        function calcLastDayInMonth(year, month) {
454            var day = 28;
455            while (checkValidDate(year, month + 1, day + 1)) {
456                day++;
457            }
458            return day;
459        }
460
461        function calcWeeksInMonth(year, month) {
462            var daysInMonth = calcLastDayInMonth(year, month);
463            var firstDow = calcDayOfWeek(year, month, 1);
464            var lastDow = calcDayOfWeek(year, month, daysInMonth);
465            var days = daysInMonth;
466            var correct = (firstDow - lastDow);
467            if (correct > 0) {
468                days += correct;
469            }
470            return Math.ceil(days / 7);
471        }
472
473        function checkValidDate(y, m, d) {
474            return m > 0 && m < 13 && y > 0 && y < 32768 && d > 0 && d <= (new Date(y, m, 0)).getDate();
475        }
476
477        function checkMonthLimit(count, invert) {
478            if (count === false) {
479                count = 0;
480            }
481            var d1 = $calendarElement.data('currDate');
482            var d2 = $calendarElement.data('initDate');
483
484            var months;
485            months = (d2.getFullYear() - d1.getFullYear()) * 12;
486            months -= d1.getMonth() + 1;
487            months += d2.getMonth();
488
489            if (invert === true) {
490                if (months < (parseInt(count) - 1)) {
491                    return true;
492                }
493            } else {
494                if (months >= (0 - parseInt(count))) {
495                    return true;
496                }
497            }
498            return false;
499        }
500    }); // each()
501
502    return this;
503};
504
505/**
506 * Default settings
507 *
508 * @returns object
509 *   language:          string,
510 *   year:              integer,
511 *   month:             integer,
512 *   show_previous:     boolean|integer,
513 *   show_next:         boolean|integer,
514 *   cell_border:       boolean,
515 *   today:             boolean,
516 *   show_days:         boolean,
517 *   weekstartson:      integer (0 = Sunday, 1 = Monday),
518 *   nav_icon:          object: prev: string, next: string
519 *   ajax:              object: url: string, modal: boolean,
520 *   legend:            object array, [{type: string, label: string, classname: string}]
521 *   action:            function
522 *   action_nav:        function
523 */
524$.fn.zabuto_calendar_defaults = function () {
525    var now = new Date();
526    var year = now.getFullYear();
527    var month = now.getMonth() + 1;
528    var settings = {
529        language: 'es',
530        year: year,
531        month: month,
532        show_previous: true,
533        show_next: true,
534        cell_border: false,
535        today: true,
536        show_days: true,
537        weekstartson: 1,
538        nav_icon: false,
539        data: [
540                {
541                    'date': '2022-01-11',
542                    'badge': true,
543                    'title': 'Meeting with John'
544                },
545                {
546                    'date': '2022-01-13',
547                    'badge': false,
548                    'title': 'Go to market'
549                }
550            ],
551        ajax: true,
552        legend: true,
553        action: function () {
554                //get the selected date
555                var date = $('#' + this.id).data('date');
556                //alert the date
557                alert('You clicked date: ' + date);
558            },
559        action_nav: true
560    };
561    return settings;
562};
563
564
565//$("#my-calendar").zabuto_calendar( { action: function() { myDateFunction(this.id); } } );
566
567/**
568 * Language settings
569 *
570 * @param lang
571 * @returns {{month_labels: Array, dow_labels: Array}}
572 */
573$.fn.zabuto_calendar_language = function (lang) {
574    if (typeof(lang) == 'undefined' || lang === false) {
575        lang = 'en';
576    }
577
578    switch (lang.toLowerCase()) {
579        case 'de':
580            return {
581                month_labels: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
582                dow_labels: ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
583            };
584            break;
585
586        case 'en':
587            return {
588                month_labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
588November", "December"],
589                dow_labels: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
590            };
591            break;
592
593        case 'ar':
594            return {
595                month_labels: ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"],
596                dow_labels: ["أثنين", "ثلاثاء", "اربعاء", "خميس", "جمعه", "سبت", "أحد"]
597            };
598            break;
599            
600        case 'es':
601            return {
602                month_labels: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
603                dow_labels: ["Lu", "Ma", "Mi", "Ju", "Vi", "Sá", "Do"]
604            };
605            break;
606
607        case 'fr':
608            return {
609                month_labels: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"],
610                dow_labels: ["Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"]
611            };
612            break;
613
614        case 'it':
615            return {
616                month_labels: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
617                dow_labels: ["Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"]
618            };
619            break;
620
621        case 'nl':
622            return {
623                month_labels: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"],
624                dow_labels: ["Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"]
625            };
626            break;
627
628        case 'pl':
629            return {
630                month_labels: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"],
631                dow_labels: ["pon.", "wt.", "śr.", "czw.", "pt.", "sob.", "niedz."]
632            };
633            break;
634
635        case 'pt':
636            return {
637                month_labels: ["Janeiro", "Fevereiro", "Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
638                dow_labels: ["S", "T", "Q", "Q", "S", "S", "D"]
639            };
640            break;
641
642        case 'ru':
643            return {
644                month_labels: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
645                dow_labels: ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вск"]
646            };
647            break;
648
649        case 'se':
650            return {
651                month_labels: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"],
652                dow_labels: ["Mån", "Tis", "Ons", "Tor", "Fre", "Lör", "Sön"]
653            };
654            break;
655
656        case 'tr':
657            return {
658                month_labels: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
659                dow_labels: ["Pts", "Salı", "Çar", "Per", "Cuma", "Cts", "Paz"]
660            };
661            break;
662
663        case 'fi':
664            return {
665                month_labels: ["Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"],
666                dow_labels: ["Ma", "Ti", "Ke", "To", "Pe", "La", "Su"]
667            };
668            break;
669    }
670
671};

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.