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