1;(function ($) { 2 var $window = $(window); 3 var options = {}; 4 var zindexvalues = []; 5 var lastclicked = []; 6 var scrollbarwidth; 7 var bodymarginright = null; 8 var opensuffix = '_open'; 9 var closesuffix = '_close'; 10 var visiblePopupsArray = []; 11 var transitionsupport = null; 12 var opentimer; 13 var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); 14 var focusableElementsString = "a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]"; 15 16 var methods = { 17 18 _init: function (el) { 19 var $el = $(el); 20 var options = $el.data('popupoptions'); 21 lastclicked[el.id] = false; 22 zindexvalues[el.id] = 0; 23 24 if (!$el.data('popup-initialized')) { 25 $el.attr('data-popup-initialized', 'true'); 26 methods._initonce(el); 27 } 28 29 if (options.autoopen) { 30 setTimeout(function() { 31 methods.show(el, 0); 32 }, 0); 33 } 34 }, 35 36 _initonce: function (el) { 37 var $el = $(el); 38 var $body = $('body'); 39 var $wrapper; 40 var options = $el.data('popupoptions'); 41 var css; 42 43 bodymarginright = parseInt($body.css('margin-right'), 10); 44 transitionsupport = document.body.style.webkitTransition !== undefined || 45 document.body.style.MozTransition !== undefined || 46 document.body.style.msTransition !== undefined || 47 document.body.style.OTransition !== undefined || 48 document.body.style.transition !== undefined; 49 50 if (options.type == 'tooltip') { 51 options.background = false; 52 options.scrolllock = false; 53 } 54 55 if (options.backgroundactive) { 56 options.background = false; 57 options.blur = false; 58 options.scrolllock = false; 59 } 60 61 if (options.scrolllock) { 62 // Calculate the browser's scrollbar width dynamically 63 var parent; 64 var child; 65 if (typeof scrollbarwidth === 'undefined') { 66 parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body'); 67 child = parent.children(); 68 scrollbarwidth = child.innerWidth() - child.height(99).innerWidth(); 69 parent.remove(); 70 } 71 } 72 73 if (!$el.attr('id')) { 74 $el.attr('id', 'j-popup-' + parseInt((Math.random() * 100000000), 10)); 75 } 76 77 $el.addClass('popup_content'); 78 79 $body.prepend(el); 80 81 $el.wrap('<div id="' + el.id + '_wrapper" class="popup_wrapper" />'); 82 83 $wrapper = $('#' + el.id + '_wrapper'); 84 85 $wrapper.css({ 86 opacity: 0, 87 visibility: 'hidden', 88 position: 'absolute' 89 }); 90 91 // Make div clickable in iOS 92 if (iOS) { 93 $wrapper.css('cursor', 'pointer'); 94 } 95 96 if (options.type == 'overlay') { 97 $wrapper.css('overflow','auto'); 98 } 99 100 $el.css({ 101 opacity: 0, 102 visibility: 'hidden', 103 display: 'inline-block' 104 }); 105 106 if (options.setzindex && !options.autozindex) { 107 $wrapper.css('z-index', '100001'); 108 } 109 110 if (!options.outline) { 111 $el.css('outline', 'none'); 112 } 113 114 if (options.transition) { 115 $el.css('transition', options.transition); 116 $wrapper.css('transition', options.transition); 117 } 118 119 // Hide popup content from screen readers initially 120 $el.attr('aria-hidden', true); 121 122 if ((options.background) && (!$('#' + el.id + '_background').length)) { 123 124 $body.prepend('<div id="' + el.id + '_background" class="popup_background"></div>'); 125 126 var $background = $('#' + el.id + '_background'); 127 128 $background.css({ 129 opacity: 0, 130 visibility: 'hidden', 131 backgroundColor: options.color, 132 position: 'fixed', 133 top: 0, 134 right: 0, 135 bottom: 0, 136 left: 0 137 }); 138 139 if (options.setzindex && !options.autozindex) { 140 $background.css('z-index', '100000'); 141 } 142 143 if (options.transition) { 144 $background.css('transition', options.transition); 145 } 146 } 147 148 if (options.type == 'overlay') { 149 $el.css({ 150 textAlign: 'left', 151 position: 'relative', 152 verticalAlign: 'middle' 153 }); 154 155 css = { 156 position: 'fixed', 157 width: '100%', 158 height: '100%', 159 top: 0, 160 left: 0, 161 textAlign: 'center' 162 }; 163 164 if(options.backgroundactive){ 165 css.position = 'relative'; 166 css.height = '0'; 167 css.overflow = 'visible'; 168 } 169 170 $wrapper.css(css); 171 172 // CSS vertical align helper 173 $wrapper.append('<div class="popup_align" />'); 174 175 $('.popup_align').css({ 176 display: 'inline-block', 177 verticalAlign: 'middle', 178 height: '100%' 179 }); 180 } 181 182 // Add WAI ARIA role to announce dialog to screen readers 183 $el.attr('role', 'dialog'); 184 185 var openelement = (options.openelement) ? options.openelement : ('.' + el.id + opensuffix); 186 187 $(openelement).each(function (i, item) { 188 $(item).attr('data-popup-ordinal', i); 189 190 if (!item.id) { 191 $(item).attr('id', 'open_' + parseInt((Math.random() * 100000000), 10)); 192 } 193 }); 194 195 // Set aria-labelledby (if aria-label or aria-labelledby is not set in html) 196 if (!($el.attr('aria-labelledby') || $el.attr('aria-label'))) { 197 $el.attr('aria-labelledby', $(openelement).attr('id')); 198 } 199 200 // Show and hide tooltips on hover 201 if(options.action == 'hover'){ 202 options.keepfocus = false; 203 204 // Handler: mouseenter, focusin 205 $(openelement).on('mouseenter', function (event) { 206 methods.show(el, $(this).data('popup-ordinal')); 207 }); 208 209 // Handler: mouseleave, focusout 210 $(openelement).on('mouseleave', function (event) { 211 methods.hide(el); 212 }); 213 214 } else { 215 216 // Handler: Show popup when clicked on 'open' element 217 $(document).on('click', openelement, function (event) { 218 event.preventDefault(); 219 220 var ord = $(this).data('popup-ordinal'); 221 setTimeout(function() { // setTimeout is to allow 'close' method to finish (for issues with multiple tooltips) 222 methods.show(el, ord); 223 }, 0); 224 }); 225 } 226 227 if (options.closebutton) { 228 methods.addclosebutton(el); 229 } 230 231 if (options.detach) { 232 $el.hide().detach(); 233 } else { 234 $wrapper.hide(); 235 } 236 }, 237 238 /** 239 * Show method 240 * 241 * @param {object} el - popup instance DOM node 242 * @param {number} ordinal - order number of an 'open' element 243 */ 244 show: function (el, ordinal) { 245 var $el = $(el); 246 247 if ($el.data('popup-visible')) return; 248 249 // Initialize if not initialized. Required for: $('#popup').popup('show') 250 if (!$el.data('popup-initialized')) { 251 methods._init(el); 252 } 253 $el.attr('data-popup-initialized', 'true'); 254 255 var $body = $('body'); 256 var options = $el.data('popupoptions'); 257 var $wrapper = $('#' + el.id + '_wrapper'); 258 var $background = $('#' + el.id + '_background'); 259 260 // 'beforeopen' callback event 261 callback(el, ordinal, options.beforeopen); 262 263 // Remember last clicked place 264 lastclicked[el.id] = ordinal; 265 266 // Add popup id to visiblePopupsArray 267 setTimeout(function() {
268 visiblePopupsArray.push(el.id); 269 }, 0); 270 271 // Calculating maximum z-index 272 if (options.autozindex) { 273 274 var elements = document.getElementsByTagName('*'); 275 var len = elements.length; 276 var maxzindex = 0; 277 278 for(var i=0; i<len; i++){ 279 280 var elementzindex = $(elements[i]).css('z-index'); 281 282 if(elementzindex !== 'auto'){ 283 284 elementzindex = parseInt(elementzindex, 10); 285 286 if(maxzindex < elementzindex){ 287 maxzindex = elementzindex; 288 } 289 } 290 } 291 292 zindexvalues[el.id] = maxzindex; 293 294 // Add z-index to the background 295 if (options.background) { 296 if (zindexvalues[el.id] > 0) { 297 $('#' + el.id + '_background').css({ 298 zIndex: (zindexvalues[el.id] + 1) 299 }); 300 } 301 } 302 303 // Add z-index to the wrapper 304 if (zindexvalues[el.id] > 0) { 305 $wrapper.css({ 306 zIndex: (zindexvalues[el.id] + 2) 307 }); 308 } 309 } 310 311 if (options.detach) { 312 $wrapper.prepend(el); 313 $el.show(); 314 } else { 315 $wrapper.show(); 316 } 317 318 opentimer = setTimeout(function() { 319 $wrapper.css({ 320 visibility: 'visible', 321 opacity: 1 322 }); 323 324 $('html').addClass('popup_visible').addClass('popup_visible_' + el.id); 325 $wrapper.addClass('popup_wrapper_visible'); 326 }, 20); // 20ms required for opening animation to occur in FF 327 328 // Disable background layer scrolling when popup is opened 329 if (options.scrolllock) { 330 $body.css('overflow', 'hidden'); 331 if ($body.height() > $window.height()) { 332 $body.css('margin-right', bodymarginright + scrollbarwidth); 333 } 334 } 335 336 if(options.backgroundactive){ 337 //calculates the vertical align 338 $el.css({ 339 top:( 340 $window.height() - ( 341 $el.get(0).offsetHeight + 342 parseInt($el.css('margin-top'), 10) + 343 parseInt($el.css('margin-bottom'), 10) 344 ) 345 )/2 +'px' 346 }); 347 } 348 349 $el.css({ 350 'visibility': 'visible', 351 'opacity': 1 352 }); 353 354 // Show background 355 if (options.background) { 356 $background.css({ 357 'visibility': 'visible', 358 'opacity': options.opacity 359 }); 360 361 // Fix IE8 issue with background not appearing 362 setTimeout(function() { 363 $background.css({ 364 'opacity': options.opacity 365 }); 366 }, 0); 367 } 368 369 $el.data('popup-visible', true); 370 371 // Position popup 372 methods.reposition(el, ordinal); 373 374 // Remember which element had focus before opening a popup 375 $el.data('focusedelementbeforepopup', document.activeElement); 376 377 // Handler: Keep focus inside dialog box 378 if (options.keepfocus) { 379 // Make holder div focusable 380 $el.attr('tabindex', -1); 381 382 // Focus popup or user specified element. 383 // Initial timeout of 50ms is set to give some time to popup to show after clicking on 384 // 'open' element, and after animation is complete to prevent background scrolling. 385 setTimeout(function() { 386 if (options.focuselement === 'closebutton') { 387 $('#' + el.id + ' .' + el.id + closesuffix + ':first').focus(); 388 } else if (options.focuselement) { 389 $(options.focuselement).focus(); 390 } else { 391 $el.focus(); 392 } 393 }, options.focusdelay); 394 395 } 396 397 // Hide main content from screen readers 398 $(options.pagecontainer).attr('aria-hidden', true); 399 400 // Reveal popup content to screen readers 401 $el.attr('aria-hidden', false); 402 403 callback(el, ordinal, options.onopen); 404 405 if (transitionsupport) { 406 $wrapper.one('transitionend', function() { 407 callback(el, ordinal, options.opentransitionend); 408 }); 409 } else { 410 callback(el, ordinal, options.opentransitionend); 411 } 412 }, 413 414 /** 415 * Hide method 416 * 417 * @param object el - popup instance DOM node 418 * @param boolean outerClick - click on the outer content below popup 419 */ 420 hide: function (el, outerClick) { 421 // Get index of popup ID inside of visiblePopupsArray 422 var popupIdIndex = $.inArray(el.id, visiblePopupsArray);
423 424 // If popup is not opened, ignore the rest of the function 425 if (popupIdIndex === -1) { 426 return; 427 } 428 429 if(opentimer) clearTimeout(opentimer); 430 431 var $body = $('body'); 432 var $el = $(el); 433 var options = $el.data('popupoptions'); 434 var $wrapper = $('#' + el.id + '_wrapper'); 435 var $background = $('#' + el.id + '_background'); 436 437 $el.data('popup-visible', false); 438 439 if (visiblePopupsArray.length === 1) { 440 $('html').removeClass('popup_visible').removeClass('popup_visible_' + el.id); 441 } else { 442 if($('html').hasClass('popup_visible_' + el.id)) { 443 $('html').removeClass('popup_visible_' + el.id); 444 } 445 } 446 447 // Remove popup from the visiblePopupsArray 448 visiblePopupsArray.splice(popupIdIndex, 1); 449 450 if($wrapper.hasClass('popup_wrapper_visible')) { 451 $wrapper.removeClass('popup_wrapper_visible'); 452 } 453 454 // Focus back on saved element 455 if (options.keepfocus && !outerClick) { 456 setTimeout(function() { 457 if ($($el.data('focusedelementbeforepopup')).is(':visible')) { 458 $el.data('focusedelementbeforepopup').focus(); 459 } 460 }, 0); 461 } 462 463 // Hide popup 464 $wrapper.css({ 465 'visibility': 'hidden', 466 'opacity': 0 467 }); 468 $el.css({ 469 'visibility': 'hidden', 470 'opacity': 0 471 }); 472 473 // Hide background 474 if (options.background) { 475 $background.css({ 476 'visibility': 'hidden', 477 'opacity': 0 478 }); 479 } 480 481 // Reveal main content to screen readers 482 $(options.pagecontainer).attr('aria-hidden', false); 483 484 // Hide popup content from screen readers 485 $el.attr('aria-hidden', true); 486 487 // 'onclose' callback event 488 callback(el, lastclicked[el.id], options.onclose); 489 490 if (transitionsupport && $el.css('transition-duration') !== '0s') { 491 $el.one('transitionend', function(e) { 492 493 if (!($el.data('popup-visible'))) { 494 if (options.detach) { 495 $el.hide().detach(); 496 } else { 497 $wrapper.hide(); 498 } 499 } 500 501 // Re-enable scrolling of background layer 502 if (options.scrolllock) { 503 setTimeout(function() { 504 $body.css({ 505 overflow: 'visible', 506 'margin-right': bodymarginright 507 }); 508 }, 10); // 10ms added for CSS transition in Firefox which doesn't like overflow:auto 509 } 510 511 callback(el, lastclicked[el.id], options.closetransitionend); 512 }); 513 } else { 514 if (options.detach) { 515 $el.hide().detach(); 516 } else { 517 $wrapper.hide(); 518 } 519 520 // Re-enable scrolling of background layer 521 if (options.scrolllock) { 522 setTimeout(function() { 523 $body.css({ 524 overflow: 'visible', 525 'margin-right': bodymarginright 526 }); 527 }, 10); // 10ms added for CSS transition in Firefox which doesn't like overflow:auto 528 } 529 530 callback(el, lastclicked[el.id], options.closetransitionend); 531 } 532 533 }, 534 535 /** 536 * Toggle method 537 * 538 * @param {object} el - popup instance DOM node 539 * @param {number} ordinal - order number of an 'open' element 540 */ 541 toggle: function (el, ordinal) { 542 if ($(el).data('popup-visible')) { 543 methods.hide(el); 544 } else { 545 setTimeout(function() { 546 methods.show(el, ordinal); 547 }, 0); 548 } 549 }, 550 551 /** 552 * Reposition method 553 * 554 * @param {object} el - popup instance DOM node 555 * @param {number} ordinal - order number of an 'open' element 556 */ 557 reposition: function (el, ordinal) { 558 var $el = $(el); 559 var options = $el.data('popupoptions'); 560 var $wrapper = $('#' + el.id + '_wrapper'); 561 var $background = $('#' + el.id + '_background'); 562 563 ordinal = ordinal || 0; 564 565 // Tooltip type 566 if (options.type == 'tooltip') { 567 $wrapper.css({ 568 'position': 'absolute' 569 }); 570 571 var $tooltipanchor; 572 if (options.tooltipanchor) { 573 $tooltipanchor = $(options.tooltipanchor); 574 } else if (options.openelement) { 575 $tooltipanchor = $(options.openelement).filter('[data-popup-ordinal="' + ordinal + '"]'); 576 } else { 577 $tooltipanchor = $('.' + el.id + opensuffix + '[data-popup-ordinal="' + ordinal + '"]'); 578 } 579 580 var linkOffset = $tooltipanchor.offset(); 581 582 // Horizontal position for tooltip 583 if (options.horizontal == 'right') { 584 $wrapper.css('left', linkOffset.left + $tooltipanchor.outerWidth() + options.offsetleft); 585 } else if (options.horizontal == 'leftedge') { 586 $wrapper.css('left', linkOffset.left + $tooltipanchor.outerWidth() - $tooltipanchor.outerWidth() + options.offsetleft); 587 } else if (options.horizontal == 'left') { 588 $wrapper.css('right', $window.width() - linkOffset.left - options.offsetleft); 589 } else if (options.horizontal == 'rightedge') { 590 $wrapper.css('right', $window.width() - linkOffset.left - $tooltipanchor.outerWidth() - options.offsetleft); 591 } else { 592 $wrapper.css('left', linkOffset.left + ($tooltipanchor.outerWidth() / 2) - ($el.outerWidth() / 2) - parseFloat($el.css('marginLeft')) + options.offsetleft); 593 } 594 595 // Vertical position for tooltip 596 if (options.vertical == 'bottom') { 597 $wrapper.css('top', linkOffset.top + $tooltipanchor.outerHeight() + options.offsettop); 598 } else if (options.vertical == 'bottomedge') { 599 $wrapper.css('top', linkOffset.top + $tooltipanchor.outerHeight() - $el.outerHeight() + options.offsettop); 600 }
600 else if (options.vertical == 'top') { 601 $wrapper.css('bottom', $window.height() - linkOffset.top - options.offsettop); 602 } else if (options.vertical == 'topedge') { 603 $wrapper.css('bottom', $window.height() - linkOffset.top - $el.outerHeight() - options.offsettop); 604 } else { 605 $wrapper.css('top', linkOffset.top + ($tooltipanchor.outerHeight() / 2) - ($el.outerHeight() / 2) - parseFloat($el.css('marginTop')) + options.offsettop); 606 } 607 608 // Overlay type 609 } else if (options.type == 'overlay') { 610 611 // Horizontal position for overlay 612 if (options.horizontal) { 613 $wrapper.css('text-align', options.horizontal); 614 } else { 615 $wrapper.css('text-align', 'center'); 616 } 617 618 // Vertical position for overlay 619 if (options.vertical) { 620 $el.css('vertical-align', options.vertical); 621 } else { 622 $el.css('vertical-align', 'middle'); 623 } 624 } 625 }, 626 627 /** 628 * Add-close-button method 629 * 630 * @param {object} el - popup instance DOM node 631 */ 632 addclosebutton: function (el) { 633 var genericCloseButton; 634 635 if ($(el).data('popupoptions').closebuttonmarkup) { 636 genericCloseButton = $(options.closebuttonmarkup).addClass(el.id + '_close'); 637 } else { 638 genericCloseButton = '<button class="popup_close ' + el.id + '_close" title="Close" aria-label="Close"><span aria-hidden="true">Ã</span></button>'; 639 } 640 641 if ($el.data('popup-initialized')){ 642 $el.append(genericCloseButton); 643 } 644 645 } 646 647 }; 648 649 /** 650 * Callback event calls 651 * 652 * @param {object} el - popup instance DOM node 653 * @param {number} ordinal - order number of an 'open' element 654 * @param {function} func - callback function 655 */ 656 var callback = function (el, ordinal, func) { 657 var options = $(el).data('popupoptions'); 658 var openelement = (options.openelement) ? options.openelement : ('.' + el.id + opensuffix); 659 var elementclicked = $(openelement + '[data-popup-ordinal="' + ordinal + '"]'); 660 if (typeof func == 'function') { 661 func.call($(el), el, elementclicked); 662 } 663 }; 664 665 // Hide popup if ESC key is pressed 666 $(document).on('keydown', function (event) { 667 if(visiblePopupsArray.length) { 668 var elementId = visiblePopupsArray[visiblePopupsArray.length - 1]; 669 var el = document.getElementById(elementId); 670 671 if ($(el).data('popupoptions').escape && event.keyCode == 27) { 672 methods.hide(el); 673 } 674 } 675 }); 676 677 // Hide popup on click 678 $(document).on('click', function (event) { 679 if(visiblePopupsArray.length) { 680 var elementId = visiblePopupsArray[visiblePopupsArray.length - 1]; 681 var el = document.getElementById(elementId); 682 var closeButton = ($(el).data('popupoptions').closeelement) ? $(el).data('popupoptions').closeelement : ('.' + el.id + closesuffix); 683 684 // If Close button clicked 685 if ($(event.target).closest(closeButton).length) { 686 event.preventDefault(); 687 methods.hide(el); 688 } 689 690 // If clicked outside of popup 691 if ($(el).data('popupoptions').blur && !$(event.target).closest('#' + elementId).length && event.which !== 2 && $(event.target).is(':visible')) { 692 693 if ($(el).data('popupoptions').background) { 694 // If clicked on popup cover 695 methods.hide(el); 696 697 // Older iOS/Safari will trigger a click on the elements below the cover, 698 // when tapping on the cover, so the default action needs to be prevented. 699 event.preventDefault(); 700 701 } else { 702 // If clicked on outer content 703 methods.hide(el, true); 704 } 705 } 706 } 707 });
708 709 // Keep keyboard focus inside of popup 710 $(document).on('keydown', function(event) { 711 if(visiblePopupsArray.length && event.which == 9) { 712 713 // If tab or shift-tab pressed 714 var elementId = visiblePopupsArray[visiblePopupsArray.length - 1]; 715 var el = document.getElementById(elementId); 716 717 // Get list of all children elements in given object 718 var popupItems = $(el).find('*'); 719 720 // Get list of focusable items 721 var focusableItems = popupItems.filter(focusableElementsString).filter(':visible'); 722 723 // Get currently focused item 724 var focusedItem = $(':focus'); 725 726 // Get the number of focusable items 727 var numberOfFocusableItems = focusableItems.length; 728 729 // Get the index of the currently focused item 730 var focusedItemIndex = focusableItems.index(focusedItem); 731 732 // If popup doesn't contain focusable elements, focus popup itself 733 if (numberOfFocusableItems === 0) { 734 $(el).focus(); 735 event.preventDefault(); 736 } else { 737 if (event.shiftKey) { 738 // Back tab 739 // If focused on first item and user preses back-tab, go to the last focusable item 740 if (focusedItemIndex === 0) { 741 focusableItems.get(numberOfFocusableItems - 1).focus(); 742 event.preventDefault(); 743 } 744 745 } else { 746 // Forward tab 747 // If focused on the last item and user preses tab, go to the first focusable item 748 if (focusedItemIndex == numberOfFocusableItems - 1) { 749 focusableItems.get(0).focus(); 750 event.preventDefault(); 751 } 752 } 753 } 754 } 755 }); 756 757 /** 758 * Plugin API 759 */ 760 $.fn.popup = function (customoptions) { 761 return this.each(function () { 762 763 var $el = $(this); 764 765 if (typeof customoptions === 'object') { // e.g. $('#popup').popup({'color':'blue'}) 766 var opt = $.extend({}, $.fn.popup.defaults, customoptions, $el.data('popupoptions')); 767 $el.data('popupoptions', opt); 768 options = $el.data('popupoptions'); 769 770 methods._init(this); 771 772 } else if (typeof customoptions === 'string') { // e.g. $('#popup').popup('hide') 773 if (!($el.data('popupoptions'))) { 774 $el.data('popupoptions', $.fn.popup.defaults); 775 options = $el.data('popupoptions'); 776 } 777 778 methods[customoptions].call(this, this); 779 780 } else { // e.g. $('#popup').popup() 781 if (!($el.data('popupoptions'))) { 782 $el.data('popupoptions', $.fn.popup.defaults); 783 options = $el.data('popupoptions'); 784 } 785 786 methods._init(this); 787 788 } 789 790 }); 791 }; 792 793 $.fn.popup.defaults = { 794 type: 'overlay', 795 autoopen: false, 796 background: true, 797 backgroundactive: false, 798 color: 'black', 799 opacity: '0.5', 800 horizontal: 'center', 801 vertical: 'middle', 802 offsettop: 0, 803 offsetleft: 0, 804 escape: true, 805 blur: true, 806 setzindex: true, 807 autozindex: false, 808 scrolllock: false, 809 closebutton: false, 810 closebuttonmarkup: null, 811 keepfocus: true, 812 focuselement: null, 813 focusdelay: 50, 814 outline: false, 815 pagecontainer: null, 816 detach: false, 817 openelement: null, 818 closeelement: null, 819 transition: null, 820 tooltipanchor: null, 821 beforeopen: null, 822 onclose: null, 823 onopen: null, 824 opentransitionend: null, 825 closetransitionend: null 826 }; 827 828})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.