1/* 2 @licstart The following is the entire license notice for the JavaScript code in this file. 3 4 The MIT License (MIT) 5 6 Copyright (C) 1997-2020 by Dimitri van Heesch 7 8 Permission is hereby granted, free of charge, to any person obtaining a copy of this software 9 and associated documentation files (the "Software"), to deal in the Software without restriction, 10 including without limitation the rights to use, copy, modify, merge, publish, distribute, 11 sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 12 furnished to do so, subject to the following conditions: 13 14 The above copyright notice and this permission notice shall be included in all copies or 15 substantial portions of the Software. 16 17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 18 BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 20 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 23 @licend The above is the entire license notice for the JavaScript code in this file 24 */ 25function convertToId(search) 26{ 27 var result = ''; 28 for (i=0;i<search.length;i++) 29 { 30 var c = search.charAt(i); 31 var cn = c.charCodeAt(0); 32 if (c.match(/[a-z0-9\u0080-\uFFFF]/)) 33 { 34 result+=c; 35 } 36 else if (cn<16) 37 { 38 result+="_0"+cn.toString(16); 39 } 40 else 41 { 42 result+="_"+cn.toString(16); 43 } 44 } 45 return result; 46} 47 48function getXPos(item) 49{ 50 var x = 0; 51 if (item.offsetWidth) 52 { 53 while (item && item!=document.body) 54 { 55 x += item.offsetLeft; 56 item = item.offsetParent; 57 } 58 } 59 return x; 60} 61 62function getYPos(item) 63{ 64 var y = 0; 65 if (item.offsetWidth) 66 { 67 while (item && item!=document.body) 68 { 69 y += item.offsetTop; 70 item = item.offsetParent; 71 } 72 } 73 return y; 74} 75 76var searchResults = new SearchResults("searchResults"); 77 78/* A class handling everything associated with the search panel. 79 80 Parameters: 81 name - The name of the global variable that will be 82 storing this instance. Is needed to be able to set timeouts. 83 resultPath - path to use for external files 84*/ 85function SearchBox(name, resultsPath, extension) 86{ 87 if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } 88 if (!extension || extension == "") { extension = ".html"; } 89 90 // ---------- Instance variables 91 this.name = name; 92 this.resultsPath = resultsPath; 93 this.keyTimeout = 0; 94 this.keyTimeoutLength = 500; 95 this.closeSelectionTimeout = 300; 96 this.lastSearchValue = ""; 97 this.lastResultsPage = ""; 98 this.hideTimeout = 0; 99 this.searchIndex = 0; 100 this.searchActive = false; 101 this.extension = extension; 102 103 // ----------- DOM Elements 104 105 this.DOMSearchField = function() 106 { return document.getElementById("MSearchField"); } 107 108 this.DOMSearchSelect = function() 109 { return document.getElementById("MSearchSelect"); } 110 111 this.DOMSearchSelectWindow = function() 112 { return document.getElementById("MSearchSelectWindow"); } 113 114 this.DOMPopupSearchResults = function() 115 { return document.getElementById("MSearchResults"); } 116 117 this.DOMPopupSearchResultsWindow = function() 118 { return document.getElementById("MSearchResultsWindow"); } 119 120 this.DOMSearchClose = function() 121 { return document.getElementById("MSearchClose"); } 122 123 this.DOMSearchBox = function() 124 { return document.getElementById("MSearchBox"); } 125 126 // ------------ Event Handlers 127 128 // Called when focus is added or removed from the search field. 129 this.OnSearchFieldFocus = function(isActive) 130 { 131 this.Activate(isActive); 132 } 133 134 this.OnSearchSelectShow = function() 135 { 136 var searchSelectWindow = this.DOMSearchSelectWindow(); 137 var searchField = this.DOMSearchSelect(); 138 139 var left = getXPos(searchField); 140 var top = getYPos(searchField); 141 top += searchField.offsetHeight; 142 143 // show search selection popup 144 searchSelectWindow.style.display='block'; 145 searchSelectWindow.style.left = left + 'px'; 146 searchSelectWindow.style.top = top + 'px'; 147 148 // stop selection hide timer 149 if (this.hideTimeout) 150 { 151 clearTimeout(this.hideTimeout); 152 this.hideTimeout=0; 153 } 154 return false; // to avoid "image drag" default event 155 } 156 157 this.OnSearchSelectHide = function() 158 { 159 this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), 160 this.closeSelectionTimeout); 161 } 162
163 // Called when the content of the search field is changed. 164 this.OnSearchFieldChange = function(evt) 165 { 166 if (this.keyTimeout) // kill running timer 167 { 168 clearTimeout(this.keyTimeout); 169 this.keyTimeout = 0; 170 } 171 172 var e = (evt) ? evt : window.event; // for IE 173 if (e.keyCode==40 || e.keyCode==13) 174 { 175 if (e.shiftKey==1) 176 { 177 this.OnSearchSelectShow(); 178 var win=this.DOMSearchSelectWindow(); 179 for (i=0;i<win.childNodes.length;i++) 180 { 181 var child = win.childNodes[i]; // get span within a 182 if (child.className=='SelectItem') 183 { 184 child.focus(); 185 return; 186 } 187 } 188 return; 189 } 190 else 191 { 192 var elem = searchResults.NavNext(0); 193 if (elem) elem.focus(); 194 } 195 } 196 else if (e.keyCode==27) // Escape out of the search field 197 { 198 e.stopPropagation(); 199 this.DOMSearchField().blur(); 200 this.DOMPopupSearchResultsWindow().style.display = 'none'; 201 this.DOMSearchClose().style.display = 'none'; 202 this.lastSearchValue = ''; 203 this.Activate(false); 204 return; 205 } 206 207 // strip whitespaces 208 var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); 209 210 if (searchValue != this.lastSearchValue) // search value has changed 211 { 212 if (searchValue != "") // non-empty search 213 { 214 // set timer for search update 215 this.keyTimeout = setTimeout(this.Search.bind(this), 216 this.keyTimeoutLength); 217 } 218 else // empty search field 219 { 220 this.DOMPopupSearchResultsWindow().style.display = 'none'; 221 this.DOMSearchClose().style.display = 'none'; 222 this.lastSearchValue = ''; 223 } 224 } 225 } 226 227 this.SelectItemCount = function(id) 228 { 229 var count=0; 230 var win=this.DOMSearchSelectWindow(); 231 for (i=0;i<win.childNodes.length;i++) 232 { 233 var child = win.childNodes[i]; // get span within a 234 if (child.className=='SelectItem') 235 { 236 count++; 237 } 238 } 239 return count; 240 } 241 242 this.SelectItemSet = function(id) 243 { 244 var i,j=0; 245 var win=this.DOMSearchSelectWindow(); 246 for (i=0;i<win.childNodes.length;i++) 247 { 248 var child = win.childNodes[i]; // get span within a 249 if (child.className=='SelectItem') 250 { 251 var node = child.firstChild; 252 if (j==id) 253 { 254 node.innerHTML='•'; 255 } 256 else 257 { 258 node.innerHTML=' '; 259 } 260 j++; 261 } 262 } 263 } 264 265 // Called when an search filter selection is made. 266 // set item with index id as the active item 267 this.OnSelectItem = function(id) 268 { 269 this.searchIndex = id; 270 this.SelectItemSet(id); 271 var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); 272 if (searchValue!="" && this.searchActive) // something was found -> do a search 273 { 274 this.Search(); 275 } 276 } 277 278 this.OnSearchSelectKey = function(evt) 279 { 280 var e = (evt) ? evt : window.event; // for IE 281 if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down 282 { 283 this.searchIndex++; 284 this.OnSelectItem(this.searchIndex); 285 } 286 else if (e.keyCode==38 && this.searchIndex>0) // Up 287 { 288 this.searchIndex--; 289 this.OnSelectItem(this.searchIndex); 290 } 291 else if (e.keyCode==13 || e.keyCode==27) 292 { 293 e.stopPropagation(); 294 this.OnSelectItem(this.searchIndex); 295 this.CloseSelectionWindow(); 296 this.DOMSearchField().focus(); 297 } 298 return false; 299 } 300 301 // --------- Actions 302 303 // Closes the results window. 304 this.CloseResultsWindow = function() 305 { 306 this.DOMPopupSearchResultsWindow().style.display = 'none'; 307 this.DOMSearchClose().style.display = 'none'; 308 this.Activate(false); 309 } 310 311 this.CloseSelectionWindow = function() 312 { 313 this.DOMSearchSelectWindow().style.display = 'none'; 314 } 315 316 // Performs a search. 317 this.Search = function() 318 { 319 this.keyTimeout = 0; 320 321 // strip leading whitespace 322 var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); 323
324 var code = searchValue.toLowerCase().charCodeAt(0); 325 var idxChar = searchValue.substr(0, 1).toLowerCase(); 326 if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair 327 { 328 idxChar = searchValue.substr(0, 2); 329 } 330 331 var jsFile; 332 333 var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); 334 if (idx!=-1) 335 { 336 var hexCode=idx.toString(16); 337 jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; 338 } 339 340 var loadJS = function(url, impl, loc){ 341 var scriptTag = document.createElement('script'); 342 scriptTag.src = url; 343 scriptTag.onload = impl; 344 scriptTag.onreadystatechange = impl; 345 loc.appendChild(scriptTag); 346 } 347 348 var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); 349 var domSearchBox = this.DOMSearchBox(); 350 var domPopupSearchResults = this.DOMPopupSearchResults(); 351 var domSearchClose = this.DOMSearchClose(); 352 var resultsPath = this.resultsPath; 353 354 var handleResults = function() { 355 document.getElementById("Loading").style.display="none"; 356 if (typeof searchData !== 'undefined') { 357 createResults(resultsPath); 358 document.getElementById("NoMatches").style.display="none"; 359 } 360 361 if (idx!=-1) { 362 searchResults.Search(searchValue); 363 } else { // no file with search results => force empty search results 364 searchResults.Search('===='); 365 } 366 367 if (domPopupSearchResultsWindow.style.display!='block') 368 { 369 domSearchClose.style.display = 'inline-block'; 370 var left = getXPos(domSearchBox) + 150; 371 var top = getYPos(domSearchBox) + 20; 372 domPopupSearchResultsWindow.style.display = 'block'; 373 left -= domPopupSearchResults.offsetWidth; 374 var maxWidth = document.body.clientWidth; 375 var maxHeight = document.body.clientHeight; 376 var width = 300; 377 if (left<10) left=10; 378 if (width+left+8>maxWidth) width=maxWidth-left-8; 379 var height = 400; 380 if (height+top+8>maxHeight) height=maxHeight-top-8; 381 domPopupSearchResultsWindow.style.top = top + 'px'; 382 domPopupSearchResultsWindow.style.left = left + 'px'; 383 domPopupSearchResultsWindow.style.width = width + 'px'; 384 domPopupSearchResultsWindow.style.height = height + 'px'; 385 } 386 } 387 388 if (jsFile) { 389 loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); 390 } else { 391 handleResults(); 392 } 393 394 this.lastSearchValue = searchValue; 395 } 396 397 // -------- Activation Functions 398 399 // Activates or deactivates the search panel, resetting things to 400 // their default values if necessary. 401 this.Activate = function(isActive) 402 { 403 if (isActive || // open it 404 this.DOMPopupSearchResultsWindow().style.display == 'block' 405 ) 406 { 407 this.DOMSearchBox().className = 'MSearchBoxActive'; 408 this.searchActive = true; 409 } 410 else if (!isActive) // directly remove the panel 411 { 412 this.DOMSearchBox().className = 'MSearchBoxInactive'; 413 this.searchActive = false; 414 this.lastSearchValue = '' 415 this.lastResultsPage = ''; 416 this.DOMSearchField().value = ''; 417 } 418 } 419} 420 421// ----------------------------------------------------------------------- 422 423// The class that handles everything on the search results page. 424function SearchResults(name) 425{ 426 // The number of matches from the last run of <Search()>. 427 this.lastMatchCount = 0; 428 this.lastKey = 0; 429 this.repeatOn = false; 430 431 // Toggles the visibility of the passed element ID. 432 this.FindChildElement = function(id) 433 { 434 var parentElement = document.getElementById(id); 435 var element = parentElement.firstChild; 436 437 while (element && element!=parentElement) 438 { 439 if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') 440 { 441 return element; 442 } 443 444 if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) 445 { 446 element = element.firstChild; 447 } 448 else if (element.nextSibling) 449 { 450 element = element.nextSibling; 451 } 452 else 453 { 454 do 455 { 456 element = element.parentNode; 457 } 458 while (element && element!=parentElement && !element.nextSibling); 459 460 if (element && element!=parentElement) 461 { 462 element = element.nextSibling; 463 } 464 } 465 } 466 } 467 468 this.Toggle = function(id) 469 { 470 var element = this.FindChildElement(id); 471 if (element) 472 { 473 if (element.style.display == 'block') 474 { 475 element.style.display = 'none'; 476 } 477 else 478 { 479 element.style.display = 'block'; 480 } 481 } 482 } 483 484 // Searches for the passed string. If there is no parameter, 485 // it takes it from the URL query. 486 // 487 // Always returns true, since other documents may try to call it 488 // and that may or may not be possible. 489 this.Search = function(search) 490 { 491 if (!search) // get search word from URL 492 { 493 search = window.location.search; 494 search = search.substring(1); // Remove the leading '?' 495 search = unescape(search); 496 } 497 498 search = search.replace(/^ +/, "");
498 // strip leading spaces 499 search = search.replace(/ +$/, ""); // strip trailing spaces 500 search = search.toLowerCase(); 501 search = convertToId(search); 502 503 var resultRows = document.getElementsByTagName("div"); 504 var matches = 0; 505 506 var i = 0; 507 while (i < resultRows.length) 508 { 509 var row = resultRows.item(i); 510 if (row.className == "SRResult") 511 { 512 var rowMatchName = row.id.toLowerCase(); 513 rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' 514 515 if (search.length<=rowMatchName.length && 516 rowMatchName.substr(0, search.length)==search) 517 { 518 row.style.display = 'block'; 519 matches++; 520 } 521 else 522 { 523 row.style.display = 'none'; 524 } 525 } 526 i++; 527 } 528 document.getElementById("Searching").style.display='none'; 529 if (matches == 0) // no results 530 { 531 document.getElementById("NoMatches").style.display='block'; 532 } 533 else // at least one result 534 { 535 document.getElementById("NoMatches").style.display='none'; 536 } 537 this.lastMatchCount = matches; 538 return true; 539 } 540 541 // return the first item with index index or higher that is visible 542 this.NavNext = function(index) 543 { 544 var focusItem; 545 while (1) 546 { 547 var focusName = 'Item'+index; 548 focusItem = document.getElementById(focusName); 549 if (focusItem && focusItem.parentNode.parentNode.style.display=='block') 550 { 551 break; 552 } 553 else if (!focusItem) // last element 554 { 555 break; 556 } 557 focusItem=null; 558 index++; 559 } 560 return focusItem; 561 } 562 563 this.NavPrev = function(index) 564 { 565 var focusItem; 566 while (1) 567 { 568 var focusName = 'Item'+index; 569 focusItem = document.getElementById(focusName); 570 if (focusItem && focusItem.parentNode.parentNode.style.display=='block') 571 { 572 break; 573 } 574 else if (!focusItem) // last element 575 { 576 break; 577 } 578 focusItem=null; 579 index--; 580 } 581 return focusItem; 582 } 583 584 this.ProcessKeys = function(e) 585 { 586 if (e.type == "keydown") 587 { 588 this.repeatOn = false; 589 this.lastKey = e.keyCode; 590 } 591 else if (e.type == "keypress") 592 { 593 if (!this.repeatOn) 594 { 595 if (this.lastKey) this.repeatOn = true; 596 return false; // ignore first keypress after keydown 597 } 598 } 599 else if (e.type == "keyup") 600 { 601 this.lastKey = 0; 602 this.repeatOn = false; 603 } 604 return this.lastKey!=0; 605 } 606 607 this.Nav = function(evt,itemIndex) 608 { 609 var e = (evt) ? evt : window.event; // for IE 610 if (e.keyCode==13) return true; 611 if (!this.ProcessKeys(e)) return false; 612 613 if (this.lastKey==38) // Up 614 { 615 var newIndex = itemIndex-1; 616 var focusItem = this.NavPrev(newIndex); 617 if (focusItem) 618 { 619 var child = this.FindChildElement(focusItem.parentNode.parentNode.id); 620 if (child && child.style.display == 'block') // children visible 621 { 622 var n=0; 623 var tmpElem; 624 while (1) // search for last child 625 { 626 tmpElem = document.getElementById('Item'+newIndex+'_c'+n); 627 if (tmpElem) 628 { 629 focusItem = tmpElem; 630 } 631 else // found it! 632 { 633 break; 634 } 635 n++; 636 } 637 } 638 } 639 if (focusItem) 640 { 641 focusItem.focus(); 642 } 643 else // return focus to search field 644 { 645 document.getElementById("MSearchField").focus(); 646 } 647 } 648 else if (this.lastKey==40) // Down 649 { 650 var newIndex = itemIndex+1; 651 var focusItem; 652 var item = document.getElementById('Item'+itemIndex); 653 var elem = this.FindChildElement(item.parentNode.parentNode.id); 654 if (elem && elem.style.display == 'block') // children visible 655 { 656 focusItem = document.getElementById('Item'+itemIndex+'_c0'); 657 } 658 if (!focusItem) focusItem = this.NavNext(newIndex); 659 if (focusItem) focusItem.focus(); 660 } 661 else if (this.lastKey==39) // Right 662 { 663 var item = document.getElementById('Item'+itemIndex); 664 var elem = this.FindChildElement(item.parentNode.parentNode.id); 665 if (elem) elem.style.display = 'block'; 666 } 667 else if (this.lastKey==37) // Left 668 { 669 var item = document.getElementById('Item'+itemIndex); 670 var elem = this.FindChildElement(item.parentNode.parentNode.id); 671 if (elem) elem.style.display = 'none'; 672 } 673 else if (this.lastKey==27) // Escape 674 { 675 e.stopPropagation(); 676 searchBox.CloseResultsWindow(); 677 document.getElementById("MSearchField").focus(); 678 } 679 else if (this.lastKey==13) // Enter 680 { 681 return true; 682 } 683 return false;
684 } 685 686 this.NavChild = function(evt,itemIndex,childIndex) 687 { 688 var e = (evt) ? evt : window.event; // for IE 689 if (e.keyCode==13) return true; 690 if (!this.ProcessKeys(e)) return false; 691 692 if (this.lastKey==38) // Up 693 { 694 if (childIndex>0) 695 { 696 var newIndex = childIndex-1; 697 document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); 698 } 699 else // already at first child, jump to parent 700 { 701 document.getElementById('Item'+itemIndex).focus(); 702 } 703 } 704 else if (this.lastKey==40) // Down 705 { 706 var newIndex = childIndex+1; 707 var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); 708 if (!elem) // last child, jump to parent next parent 709 { 710 elem = this.NavNext(itemIndex+1); 711 } 712 if (elem) 713 { 714 elem.focus(); 715 } 716 } 717 else if (this.lastKey==27) // Escape 718 { 719 e.stopPropagation(); 720 searchBox.CloseResultsWindow(); 721 document.getElementById("MSearchField").focus(); 722 } 723 else if (this.lastKey==13) // Enter 724 { 725 return true; 726 } 727 return false; 728 } 729} 730 731function setKeyActions(elem,action) 732{ 733 elem.setAttribute('onkeydown',action); 734 elem.setAttribute('onkeypress',action); 735 elem.setAttribute('onkeyup',action); 736} 737 738function setClassAttr(elem,attr) 739{ 740 elem.setAttribute('class',attr); 741 elem.setAttribute('className',attr); 742} 743 744function createResults(resultsPath) 745{ 746 var results = document.getElementById("SRResults"); 747 results.innerHTML = ''; 748 for (var e=0; e<searchData.length; e++) 749 { 750 var id = searchData[e][0]; 751 var srResult = document.createElement('div'); 752 srResult.setAttribute('id','SR_'+id); 753 setClassAttr(srResult,'SRResult'); 754 var srEntry = document.createElement('div'); 755 setClassAttr(srEntry,'SREntry'); 756 var srLink = document.createElement('a'); 757 srLink.setAttribute('id','Item'+e); 758 setKeyActions(srLink,'return searchResults.Nav(event,'+e+')'); 759 setClassAttr(srLink,'SRSymbol'); 760 srLink.innerHTML = searchData[e][1][0]; 761 srEntry.appendChild(srLink); 762 if (searchData[e][1].length==2) // single result 763 { 764 srLink.setAttribute('href',resultsPath+searchData[e][1][1][0]); 765 srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); 766 if (searchData[e][1][1][1]) 767 { 768 srLink.setAttribute('target','_parent'); 769 } 770 else 771 { 772 srLink.setAttribute('target','_blank'); 773 } 774 var srScope = document.createElement('span'); 775 setClassAttr(srScope,'SRScope'); 776 srScope.innerHTML = searchData[e][1][1][2]; 777 srEntry.appendChild(srScope); 778 } 779 else // multiple results 780 { 781 srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); 782 var srChildren = document.createElement('div'); 783 setClassAttr(srChildren,'SRChildren'); 784 for (var c=0; c<searchData[e][1].length-1; c++) 785 { 786 var srChild = document.createElement('a'); 787 srChild.setAttribute('id','Item'+e+'_c'+c); 788 setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')'); 789 setClassAttr(srChild,'SRScope'); 790 srChild.setAttribute('href',resultsPath+searchData[e][1][c+1][0]); 791 srChild.setAttribute('onclick','searchBox.CloseResultsWindow()'); 792 if (searchData[e][1][c+1][1]) 793 { 794 srChild.setAttribute('target','_parent'); 795 } 796 else 797 { 798 srChild.setAttribute('target','_blank'); 799 } 800 srChild.innerHTML = searchData[e][1][c+1][2]; 801 srChildren.appendChild(srChild); 802 } 803 srEntry.appendChild(srChildren); 804 } 805 srResult.appendChild(srEntry); 806 results.appendChild(srResult); 807 } 808} 809 810function init_search() 811{ 812 var results = document.getElementById("MSearchSelectWindow"); 813 results.tabIndex=0; 814 for (var key in indexSectionLabels) 815 { 816 var link = document.createElement('a'); 817 link.setAttribute('class','SelectItem'); 818 link.setAttribute('onclick','searchBox.OnSelectItem('+key+')'); 819 link.href='javascript:void(0)'; 820 link.innerHTML='<span class="SelectionMark"> </span>'+indexSectionLabels[key]; 821 results.appendChild(link); 822 } 823 searchBox.OnSelectItem(0); 824 825 var input = document.getElementById("MSearchSelect"); 826 var searchSelectWindow = document.getElementById("MSearchSelectWindow"); 827 input.tabIndex=0; 828 input.addEventListener("keydown", function(event) { 829 if (event.keyCode==13 || event.keyCode==40) { 830 event.preventDefault(); 831 if (searchSelectWindow.style.display == 'block') { 832 searchBox.CloseSelectionWindow(); 833 } else { 834 searchBox.OnSearchSelectShow(); 835 searchBox.DOMSearchSelectWindow().focus(); 836 } 837 } 838 }); 839} 840/* @license-end */
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.