PageSourceSearch

https://www.glfw.org/docs/latest/search/search.js

js glfw.org collected 2026-09-24 17:16:39 UTC 24,093 bytes, 840 lines download raw bytes

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='&#8226;';
255        }
256        else
257        {
258          node.innerHTML='&#160;';
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">&#160;</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.