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><span class="glyphicon glyphicon-chevron-left"></span></span>'); 147 var $nextMonthNavIcon = $('<span><span class="glyphicon glyphicon-chevron-right"></span></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 /* ----- Modal functions ----- */ 316 317 function createModal(id, title, body, footer) { 318 var $modalHeaderButton = $('<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>'); 319 var $modalHeaderTitle = $('<h4 class="modal-title" id="' + id + '_modal_title">' + title + '</h4>'); 320 321 var $modalHeader = $('<div class="modal-header"></div>'); 322 $modalHeader.append($modalHeaderButton); 323 $modalHeader.append($modalHeaderTitle); 324 325 var $modalBody = $('<div class="modal-body" id="' + id + '_modal_body">' + body + '</div>'); 326 327 var $modalFooter = $('<div class="modal-footer" id="' + id + '_modal_footer"></div>'); 328 if (typeof(footer) !== 'undefined') { 329 var $modalFooterAddOn = $('<div>' + footer + '</div>'); 330 $modalFooter.append($modalFooterAddOn); 331 } 332 333 var $modalContent = $('<div class="modal-content"></div>'); 334 $modalContent.append($modalHeader); 335 $modalContent.append($modalBody); 336 $modalContent.append($modalFooter); 337 338 var $modalDialog = $('<div class="modal-dialog"></div>'); 339 $modalDialog.append($modalContent); 340 341 var $modalFade = $('<div class="modal fade" id="' + id + '_modal" tabindex="-1" role="dialog" aria-labelledby="' + id + '_modal_title" aria-hidden="true"></div>'); 342 $modalFade.append($modalDialog); 343 344 $modalFade.data('dateId', id); 345 $modalFade.attr("dateId", id); 346 347 return $modalFade; 348 } 349 350 /* ----- Event functions ----- */ 351 352 function checkEvents($calendarElement, year, month) { 353 var jsonData = $calendarElement.data('jsonData'); 354 var ajaxSettings = $calendarElement.data('ajaxSettings'); 355 356 $calendarElement.data('events', false); 357 358 if (false !== jsonData) { 359 return jsonEvents($calendarElement); 360 } else if (false !== ajaxSettings) { 361 return ajaxEvents($calendarElement, year, month); 362 } 363 364 return true; 365 } 366 367 function jsonEvents($calendarElement) { 368 var jsonData = $calendarElement.data('jsonData'); 369 $calendarElement.data('events', jsonData); 370 drawEvents($calendarElement, 'json'); 371 return true; 372 } 373 374 function ajaxEvents($calendarElement, year, month) { 375 var ajaxSettings = $calendarElement.data('ajaxSettings'); 376 377 if (typeof(ajaxSettings) != 'object' || typeof(ajaxSettings.url) == 'undefined') { 378 alert('Invalid calendar event settings'); 379 return false; 380 } 381 382 var data = {year: year, month: (month + 1)}; 383 384 $.ajax({ 385 type: 'GET', 386 url: ajaxSettings.url, 387 data: data, 388 dataType: 'json', 389 cache: false 390 }).done(function (response) { 391 var events = []; 392 $.each(response, function (k, v) { 393 events.push(response[k]); 394 }); 395 $calendarElement.data('events', events); 396 drawEvents($calendarElement, 'ajax'); 397 }); 398 399 return true; 400 } 401 402 function drawEvents($calendarElement, type) { 403 var jsonData = $calendarElement.data('jsonData'); 404 var ajaxSettings = $calendarElement.data('ajaxSettings'); 405 406 var events = $calendarElement.data('events'); 407 if (events !== false) { 408 $(events).each(function (index, value) { 409 var id = $calendarElement.attr('id') + '_' + value.date; 410 var $dowElement = $('#' + id); 411 var $dayElement = $('#' + id + '_day'); 412 413 $dowElement.data('hasEvent', true); 414 415 if (typeof(value.title) !== 'undefined') { 416 $dowElement.attr('title', value.title); 417 } 418
419 // CUSTOM MODIFICATION - JV :) 420 if (typeof (value.url) !== 'undefined') 421 { 422 $dayElement.css("cursor", "pointer"); 423 $dayElement.click(function () 424 { 425 window.location = value.url; 426 }); 427 428 if (typeof (value.title) !== 'undefined') 429 { 430 $dayElement.append('<a href="' + value.url + '" class="hidden">' + value.title + '</a>'); 431 } 432 } 433 434 if (typeof(value.classname) === 'undefined') { 435 $dowElement.addClass('event'); 436 } else { 437 $dowElement.addClass('event-styled'); 438 $dayElement.addClass(value.classname); 439 } 440 441 if (typeof(value.badge) !== 'undefined' && value.badge !== false) { 442 var badgeClass = (value.badge === true) ? '' : ' badge-' + value.badge; 443 var dayLabel = $dayElement.data('day'); 444 $dayElement.html('<span class="badge badge-event' + badgeClass + '">' + dayLabel + '</span>'); 445 } 446 447 if (typeof(value.body) !== 'undefined') { 448 var modalUse = false; 449 if (type === 'json' && typeof(value.modal) !== 'undefined' && value.modal === true) { 450 modalUse = true; 451 } else if (type === 'ajax' && 'modal' in ajaxSettings && ajaxSettings.modal === true) { 452 modalUse = true; 453 } 454 455 if (modalUse === true) { 456 $dowElement.addClass('event-clickable'); 457 458 var $modalElement = createModal(id, value.title, value.body, value.footer); 459 $('body').append($modalElement); 460 461 $('#' + id).click(function () { 462 $('#' + id + '_modal').modal(); 463 }); 464 } 465 } 466 }); 467 } 468 } 469 470 /* ----- Helper functions ----- */ 471 472 function isToday(year, month, day) { 473 var todayObj = new Date(); 474 var dateObj = new Date(year, month, day); 475 return (dateObj.toDateString() == todayObj.toDateString()); 476 } 477 478 function dateAsString(year, month, day) { 479 d = (day < 10) ? '0' + day : day; 480 m = month + 1; 481 m = (m < 10) ? '0' + m : m; 482 return year + '-' + m + '-' + d; 483 } 484 485 function calcDayOfWeek(year, month, day) { 486 var dateObj = new Date(year, month, day, 0, 0, 0, 0); 487 var dow = dateObj.getDay(); 488 if (dow == 0) { 489 dow = 6; 490 } else { 491 dow--; 492 } 493 return dow; 494 } 495 496 function calcLastDayInMonth(year, month) { 497 var day = 28; 498 while (checkValidDate(year, month + 1, day + 1)) { 499 day++; 500 } 501 return day; 502 } 503 504 function calcWeeksInMonth(year, month) { 505 var daysInMonth = calcLastDayInMonth(year, month); 506 var firstDow = calcDayOfWeek(year, month, 1); 507 var lastDow = calcDayOfWeek(year, month, daysInMonth); 508 var days = daysInMonth; 509 var correct = (firstDow - lastDow); 510 if (correct > 0) { 511 days += correct; 512 } 513 return Math.ceil(days / 7); 514 } 515 516 function checkValidDate(y, m, d) { 517 return m > 0 && m < 13 && y > 0 && y < 32768 && d > 0 && d <= (new Date(y, m, 0)).getDate(); 518 } 519 520 function checkMonthLimit(count, invert) { 521 if (count === false) { 522 count = 0; 523 } 524 var d1 = $calendarElement.data('currDate'); 525 var d2 = $calendarElement.data('initDate'); 526 527 var months; 528 months = (d2.getFullYear() - d1.getFullYear()) * 12; 529 months -= d1.getMonth() + 1; 530 months += d2.getMonth(); 531 532 if (invert === true) { 533 if (months < (parseInt(count) - 1)) { 534 return true; 535 } 536 } else { 537 if (months >= (0 - parseInt(count))) { 538 return true; 539 } 540 } 541 return false;
542 } 543 }); // each() 544 545 return this; 546}; 547 548/** 549 * Default settings 550 * 551 * @returns object 552 * language: string, 553 * year: integer, 554 * month: integer, 555 * show_previous: boolean|integer, 556 * show_next: boolean|integer, 557 * cell_border: boolean, 558 * today: boolean, 559 * show_days: boolean, 560 * weekstartson: integer (0 = Sunday, 1 = Monday), 561 * nav_icon: object: prev: string, next: string 562 * ajax: object: url: string, modal: boolean, 563 * legend: object array, [{type: string, label: string, classname: string}] 564 * action: function 565 * action_nav: function 566 */ 567$.fn.zabuto_calendar_defaults = function () { 568 var now = new Date(); 569 var year = now.getFullYear(); 570 var month = now.getMonth() + 1; 571 var settings = { 572 language: false, 573 year: year, 574 month: month, 575 show_previous: true, 576 show_next: true, 577 cell_border: false, 578 today: false, 579 show_days: true, 580 weekstartson: 1, 581 nav_icon: false, 582 data: false, 583 ajax: false, 584 legend: false, 585 action: false, 586 action_nav: false 587 }; 588 return settings; 589}; 590 591/** 592 * Language settings 593 * 594 * @param lang 595 * @returns {{month_labels: Array, dow_labels: Array}} 596 */ 597$.fn.zabuto_calendar_language = function (lang) { 598 if (typeof(lang) == 'undefined' || lang === false) { 599 lang = 'en'; 600 } 601 602 switch (lang.toLowerCase()) { 603 case 'de': 604 return { 605 month_labels: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], 606 dow_labels: ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] 607 }; 608 break; 609 610 case 'en': 611 return { 612 month_labels: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
612November", "December"], 613 dow_labels: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] 614 }; 615 break; 616 617 case 'ar': 618 return { 619 month_labels: ["ÙÙØ§Ùر", "ÙØ¨Ø±Ø§Ùر", "٠ارس", "أبرÙÙ", "٠اÙÙ", "ÙÙÙÙÙ", "ÙÙÙÙÙ", "أغسطس", "سبت٠بر", "Ø£ÙØªÙبر", "ÙÙÙ٠بر", "Ø¯ÙØ³Ù بر"], 620 dow_labels: ["أثÙÙÙ", "Ø«ÙØ§Ø«Ø§Ø¡", "اربعاء", "Ø®Ù ÙØ³", "ج٠عÙ", "سبت", "Ø£ØØ¯"] 621 }; 622 break; 623 624 case 'es': 625 return { 626 month_labels: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"], 627 dow_labels: ["Lu", "Ma", "Mi", "Ju", "Vi", "Sá", "Do"] 628 }; 629 break; 630 631 case 'fr': 632 return { 633 month_labels: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"], 634 dow_labels: ["Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"] 635 }; 636 break; 637 638 case 'it': 639 return { 640 month_labels: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"], 641 dow_labels: ["Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"] 642 }; 643 break; 644 645 case 'nl': 646 return { 647 month_labels: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"], 648 dow_labels: ["Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"] 649 }; 650 break; 651 652 case 'pl': 653 return { 654 month_labels: ["StyczeÅ", "Luty", "Marzec", "KwiecieÅ", "Maj", "Czerwiec", "Lipiec", "SierpieÅ", "WrzesieÅ", "Październik", "Listopad", "GrudzieÅ"], 655 dow_labels: ["pon.", "wt.", "År.", "czw.", "pt.", "sob.", "niedz."] 656 }; 657 break; 658 659 case 'pt': 660 return { 661 month_labels: ["Janeiro", "Fevereiro", "Marco", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], 662 dow_labels: ["S", "T", "Q", "Q", "S", "S", "D"] 663 }; 664 break; 665 666 case 'ru': 667 return { 668 month_labels: ["ЯнваÑÑ", "ФевÑалÑ", "ÐаÑÑ", "ÐпÑелÑ", "Ðай", "ÐÑнÑ", "ÐÑлÑ", "ÐвгÑÑÑ", "СенÑÑбÑÑ", "ÐкÑÑбÑÑ", "ÐоÑбÑÑ", "ÐекабÑÑ"], 669 dow_labels: ["Ðн", "ÐÑ", "СÑ", "ЧÑ", "ÐÑ", "Сб", "ÐÑк"] 670 }; 671 break; 672 673 case 'se': 674 return { 675 month_labels: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"], 676 dow_labels: ["MÃ¥n", "Tis", "Ons", "Tor", "Fre", "Lör", "Sön"] 677 }; 678 break; 679 680 case 'tr': 681 return { 682 month_labels: ["Ocak", "Åubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "AÄustos", "Eylül", "Ekim", "Kasım", "Aralık"], 683 dow_labels: ["Pts", "Salı", "Ãar", "Per", "Cuma", "Cts", "Paz"] 684 }; 685 break; 686 687 case 'fi': 688 return { 689 month_labels: ["Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"], 690 dow_labels: ["Ma", "Ti", "Ke", "To", "Pe", "La", "Su"] 691 }; 692 break; 693 } 694 695};
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.