mirror of
				https://github.com/ml-explore/mlx.git
				synced 2025-11-04 10:38:10 +08:00 
			
		
		
		
	
		
			
	
	
		
			695 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			695 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 @licstart  The following is the entire license notice for the JavaScript code in this file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 The MIT License (MIT)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 Copyright (C) 1997-2020 by Dimitri van Heesch
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
							 | 
						||
| 
								 | 
							
								 and associated documentation files (the "Software"), to deal in the Software without restriction,
							 | 
						||
| 
								 | 
							
								 including without limitation the rights to use, copy, modify, merge, publish, distribute,
							 | 
						||
| 
								 | 
							
								 sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
							 | 
						||
| 
								 | 
							
								 furnished to do so, subject to the following conditions:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 The above copyright notice and this permission notice shall be included in all copies or
							 | 
						||
| 
								 | 
							
								 substantial portions of the Software.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
							 | 
						||
| 
								 | 
							
								 BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
							 | 
						||
| 
								 | 
							
								 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
							 | 
						||
| 
								 | 
							
								 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
							 | 
						||
| 
								 | 
							
								 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 @licend  The above is the entire license notice for the JavaScript code in this file
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								const SEARCH_COOKIE_NAME = ''+'search_grp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const searchResults = new SearchResults();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* A class handling everything associated with the search panel.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   Parameters:
							 | 
						||
| 
								 | 
							
								   name - The name of the global variable that will be
							 | 
						||
| 
								 | 
							
								          storing this instance.  Is needed to be able to set timeouts.
							 | 
						||
| 
								 | 
							
								   resultPath - path to use for external files
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								function SearchBox(name, resultsPath, extension) {
							 | 
						||
| 
								 | 
							
								  if (!name || !resultsPath) {  alert("Missing parameters to SearchBox."); }
							 | 
						||
| 
								 | 
							
								  if (!extension || extension == "") { extension = ".html"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function getXPos(item) {
							 | 
						||
| 
								 | 
							
								    let x = 0;
							 | 
						||
| 
								 | 
							
								    if (item.offsetWidth) {
							 | 
						||
| 
								 | 
							
								      while (item && item!=document.body) {
							 | 
						||
| 
								 | 
							
								        x   += item.offsetLeft;
							 | 
						||
| 
								 | 
							
								        item = item.offsetParent;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return x;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function getYPos(item) {
							 | 
						||
| 
								 | 
							
								    let y = 0;
							 | 
						||
| 
								 | 
							
								    if (item.offsetWidth) {
							 | 
						||
| 
								 | 
							
								      while (item && item!=document.body) {
							 | 
						||
| 
								 | 
							
								        y   += item.offsetTop;
							 | 
						||
| 
								 | 
							
								        item = item.offsetParent;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return y;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // ---------- Instance variables
							 | 
						||
| 
								 | 
							
								  this.name                  = name;
							 | 
						||
| 
								 | 
							
								  this.resultsPath           = resultsPath;
							 | 
						||
| 
								 | 
							
								  this.keyTimeout            = 0;
							 | 
						||
| 
								 | 
							
								  this.keyTimeoutLength      = 500;
							 | 
						||
| 
								 | 
							
								  this.closeSelectionTimeout = 300;
							 | 
						||
| 
								 | 
							
								  this.lastSearchValue       = "";
							 | 
						||
| 
								 | 
							
								  this.lastResultsPage       = "";
							 | 
						||
| 
								 | 
							
								  this.hideTimeout           = 0;
							 | 
						||
| 
								 | 
							
								  this.searchIndex           = 0;
							 | 
						||
| 
								 | 
							
								  this.searchActive          = false;
							 | 
						||
| 
								 | 
							
								  this.extension             = extension;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // ----------- DOM Elements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.DOMSearchField              = () => document.getElementById("MSearchField");
							 | 
						||
| 
								 | 
							
								  this.DOMSearchSelect             = () => document.getElementById("MSearchSelect");
							 | 
						||
| 
								 | 
							
								  this.DOMSearchSelectWindow       = () => document.getElementById("MSearchSelectWindow");
							 | 
						||
| 
								 | 
							
								  this.DOMPopupSearchResults       = () => document.getElementById("MSearchResults");
							 | 
						||
| 
								 | 
							
								  this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow");
							 | 
						||
| 
								 | 
							
								  this.DOMSearchClose              = () => document.getElementById("MSearchClose");
							 | 
						||
| 
								 | 
							
								  this.DOMSearchBox                = () => document.getElementById("MSearchBox");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // ------------ Event Handlers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Called when focus is added or removed from the search field.
							 | 
						||
| 
								 | 
							
								  this.OnSearchFieldFocus = function(isActive) {
							 | 
						||
| 
								 | 
							
								    this.Activate(isActive);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.OnSearchSelectShow = function() {
							 | 
						||
| 
								 | 
							
								    const searchSelectWindow = this.DOMSearchSelectWindow();
							 | 
						||
| 
								 | 
							
								    const searchField        = this.DOMSearchSelect();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const left = getXPos(searchField);
							 | 
						||
| 
								 | 
							
								    const top  = getYPos(searchField) + searchField.offsetHeight;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // show search selection popup
							 | 
						||
| 
								 | 
							
								    searchSelectWindow.style.display='block';
							 | 
						||
| 
								 | 
							
								    searchSelectWindow.style.left =  left + 'px';
							 | 
						||
| 
								 | 
							
								    searchSelectWindow.style.top  =  top  + 'px';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // stop selection hide timer
							 | 
						||
| 
								 | 
							
								    if (this.hideTimeout) {
							 | 
						||
| 
								 | 
							
								      clearTimeout(this.hideTimeout);
							 | 
						||
| 
								 | 
							
								      this.hideTimeout=0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false; // to avoid "image drag" default event
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.OnSearchSelectHide = function() {
							 | 
						||
| 
								 | 
							
								    this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this),
							 | 
						||
| 
								 | 
							
								                                  this.closeSelectionTimeout);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Called when the content of the search field is changed.
							 | 
						||
| 
								 | 
							
								  this.OnSearchFieldChange = function(evt) {
							 | 
						||
| 
								 | 
							
								    if (this.keyTimeout) { // kill running timer
							 | 
						||
| 
								 | 
							
								      clearTimeout(this.keyTimeout);
							 | 
						||
| 
								 | 
							
								      this.keyTimeout = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const e = evt ? evt : window.event; // for IE
							 | 
						||
| 
								 | 
							
								    if (e.keyCode==40 || e.keyCode==13) {
							 | 
						||
| 
								 | 
							
								      if (e.shiftKey==1) {
							 | 
						||
| 
								 | 
							
								        this.OnSearchSelectShow();
							 | 
						||
| 
								 | 
							
								        const win=this.DOMSearchSelectWindow();
							 | 
						||
| 
								 | 
							
								        for (let i=0;i<win.childNodes.length;i++) {
							 | 
						||
| 
								 | 
							
								          const child = win.childNodes[i]; // get span within a
							 | 
						||
| 
								 | 
							
								          if (child.className=='SelectItem') {
							 | 
						||
| 
								 | 
							
								            child.focus();
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        const elem = searchResults.NavNext(0);
							 | 
						||
| 
								 | 
							
								        if (elem) elem.focus();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else if (e.keyCode==27) { // Escape out of the search field
							 | 
						||
| 
								 | 
							
								      e.stopPropagation();
							 | 
						||
| 
								 | 
							
								      this.DOMSearchField().blur();
							 | 
						||
| 
								 | 
							
								      this.DOMPopupSearchResultsWindow().style.display = 'none';
							 | 
						||
| 
								 | 
							
								      this.DOMSearchClose().style.display = 'none';
							 | 
						||
| 
								 | 
							
								      this.lastSearchValue = '';
							 | 
						||
| 
								 | 
							
								      this.Activate(false);
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // strip whitespaces
							 | 
						||
| 
								 | 
							
								    const searchValue = this.DOMSearchField().value.replace(/ +/g, "");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (searchValue != this.lastSearchValue) { // search value has changed
							 | 
						||
| 
								 | 
							
								      if (searchValue != "") { // non-empty search
							 | 
						||
| 
								 | 
							
								        // set timer for search update
							 | 
						||
| 
								 | 
							
								        this.keyTimeout = setTimeout(this.Search.bind(this), this.keyTimeoutLength);
							 | 
						||
| 
								 | 
							
								      } else { // empty search field
							 | 
						||
| 
								 | 
							
								        this.DOMPopupSearchResultsWindow().style.display = 'none';
							 | 
						||
| 
								 | 
							
								        this.DOMSearchClose().style.display = 'none';
							 | 
						||
| 
								 | 
							
								        this.lastSearchValue = '';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.SelectItemCount = function() {
							 | 
						||
| 
								 | 
							
								    let count=0;
							 | 
						||
| 
								 | 
							
								    const win=this.DOMSearchSelectWindow();
							 | 
						||
| 
								 | 
							
								    for (let i=0;i<win.childNodes.length;i++) {
							 | 
						||
| 
								 | 
							
								      const child = win.childNodes[i]; // get span within a
							 | 
						||
| 
								 | 
							
								      if (child.className=='SelectItem') {
							 | 
						||
| 
								 | 
							
								        count++;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return count;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.GetSelectionIdByName = function(name) {
							 | 
						||
| 
								 | 
							
								    let j=0;
							 | 
						||
| 
								 | 
							
								    const win=this.DOMSearchSelectWindow();
							 | 
						||
| 
								 | 
							
								    for (let i=0;i<win.childNodes.length;i++) {
							 | 
						||
| 
								 | 
							
								      const child = win.childNodes[i];
							 | 
						||
| 
								 | 
							
								      if (child.className=='SelectItem') {
							 | 
						||
| 
								 | 
							
								        if (child.childNodes[1].nodeValue==name) {
							 | 
						||
| 
								 | 
							
								          return j;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        j++;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.SelectItemSet = function(id) {
							 | 
						||
| 
								 | 
							
								    let j=0;
							 | 
						||
| 
								 | 
							
								    const win=this.DOMSearchSelectWindow();
							 | 
						||
| 
								 | 
							
								    for (let i=0;i<win.childNodes.length;i++) {
							 | 
						||
| 
								 | 
							
								      const child = win.childNodes[i]; // get span within a
							 | 
						||
| 
								 | 
							
								      if (child.className=='SelectItem') {
							 | 
						||
| 
								 | 
							
								        const node = child.firstChild;
							 | 
						||
| 
								 | 
							
								        if (j==id) {
							 | 
						||
| 
								 | 
							
								          node.innerHTML='•';
							 | 
						||
| 
								 | 
							
								          Cookie.writeSetting(SEARCH_COOKIE_NAME, child.childNodes[1].nodeValue, 0)
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          node.innerHTML=' ';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        j++;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Called when an search filter selection is made.
							 | 
						||
| 
								 | 
							
								  // set item with index id as the active item
							 | 
						||
| 
								 | 
							
								  this.OnSelectItem = function(id) {
							 | 
						||
| 
								 | 
							
								    this.searchIndex = id;
							 | 
						||
| 
								 | 
							
								    this.SelectItemSet(id);
							 | 
						||
| 
								 | 
							
								    const searchValue = this.DOMSearchField().value.replace(/ +/g, "");
							 | 
						||
| 
								 | 
							
								    if (searchValue!="" && this.searchActive) { // something was found -> do a search
							 | 
						||
| 
								 | 
							
								      this.Search();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.OnSearchSelectKey = function(evt) {
							 | 
						||
| 
								 | 
							
								    const e = (evt) ? evt : window.event; // for IE
							 | 
						||
| 
								 | 
							
								    if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) { // Down
							 | 
						||
| 
								 | 
							
								      this.searchIndex++;
							 | 
						||
| 
								 | 
							
								      this.OnSelectItem(this.searchIndex);
							 | 
						||
| 
								 | 
							
								    } else if (e.keyCode==38 && this.searchIndex>0) { // Up
							 | 
						||
| 
								 | 
							
								      this.searchIndex--;
							 | 
						||
| 
								 | 
							
								      this.OnSelectItem(this.searchIndex);
							 | 
						||
| 
								 | 
							
								    } else if (e.keyCode==13 || e.keyCode==27) {
							 | 
						||
| 
								 | 
							
								      e.stopPropagation();
							 | 
						||
| 
								 | 
							
								      this.OnSelectItem(this.searchIndex);
							 | 
						||
| 
								 | 
							
								      this.CloseSelectionWindow();
							 | 
						||
| 
								 | 
							
								      this.DOMSearchField().focus();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // --------- Actions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Closes the results window.
							 | 
						||
| 
								 | 
							
								  this.CloseResultsWindow = function() {
							 | 
						||
| 
								 | 
							
								    this.DOMPopupSearchResultsWindow().style.display = 'none';
							 | 
						||
| 
								 | 
							
								    this.DOMSearchClose().style.display = 'none';
							 | 
						||
| 
								 | 
							
								    this.Activate(false);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.CloseSelectionWindow = function() {
							 | 
						||
| 
								 | 
							
								    this.DOMSearchSelectWindow().style.display = 'none';
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Performs a search.
							 | 
						||
| 
								 | 
							
								  this.Search = function() {
							 | 
						||
| 
								 | 
							
								    this.keyTimeout = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // strip leading whitespace
							 | 
						||
| 
								 | 
							
								    const searchValue = this.DOMSearchField().value.replace(/^ +/, "");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const code = searchValue.toLowerCase().charCodeAt(0);
							 | 
						||
| 
								 | 
							
								    let idxChar = searchValue.substr(0, 1).toLowerCase();
							 | 
						||
| 
								 | 
							
								    if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair
							 | 
						||
| 
								 | 
							
								      idxChar = searchValue.substr(0, 2);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let jsFile;
							 | 
						||
| 
								 | 
							
								    let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
							 | 
						||
| 
								 | 
							
								    if (idx!=-1) {
							 | 
						||
| 
								 | 
							
								      const hexCode=idx.toString(16);
							 | 
						||
| 
								 | 
							
								      jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const loadJS = function(url, impl, loc) {
							 | 
						||
| 
								 | 
							
								      const scriptTag = document.createElement('script');
							 | 
						||
| 
								 | 
							
								      scriptTag.src = url;
							 | 
						||
| 
								 | 
							
								      scriptTag.onload = impl;
							 | 
						||
| 
								 | 
							
								      scriptTag.onreadystatechange = impl;
							 | 
						||
| 
								 | 
							
								      loc.appendChild(scriptTag);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
							 | 
						||
| 
								 | 
							
								    const domSearchBox = this.DOMSearchBox();
							 | 
						||
| 
								 | 
							
								    const domPopupSearchResults = this.DOMPopupSearchResults();
							 | 
						||
| 
								 | 
							
								    const domSearchClose = this.DOMSearchClose();
							 | 
						||
| 
								 | 
							
								    const resultsPath = this.resultsPath;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const handleResults = function() {
							 | 
						||
| 
								 | 
							
								      document.getElementById("Loading").style.display="none";
							 | 
						||
| 
								 | 
							
								      if (typeof searchData !== 'undefined') {
							 | 
						||
| 
								 | 
							
								        createResults(resultsPath);
							 | 
						||
| 
								 | 
							
								        document.getElementById("NoMatches").style.display="none";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (idx!=-1) {
							 | 
						||
| 
								 | 
							
								        searchResults.Search(searchValue);
							 | 
						||
| 
								 | 
							
								      } else { // no file with search results => force empty search results
							 | 
						||
| 
								 | 
							
								        searchResults.Search('====');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (domPopupSearchResultsWindow.style.display!='block') {
							 | 
						||
| 
								 | 
							
								        domSearchClose.style.display = 'inline-block';
							 | 
						||
| 
								 | 
							
								        let left = getXPos(domSearchBox) + 150;
							 | 
						||
| 
								 | 
							
								        let top  = getYPos(domSearchBox) + 20;
							 | 
						||
| 
								 | 
							
								        domPopupSearchResultsWindow.style.display = 'block';
							 | 
						||
| 
								 | 
							
								        left -= domPopupSearchResults.offsetWidth;
							 | 
						||
| 
								 | 
							
								        const maxWidth  = document.body.clientWidth;
							 | 
						||
| 
								 | 
							
								        const maxHeight = document.body.clientHeight;
							 | 
						||
| 
								 | 
							
								        let width = 300;
							 | 
						||
| 
								 | 
							
								        if (left<10) left=10;
							 | 
						||
| 
								 | 
							
								        if (width+left+8>maxWidth) width=maxWidth-left-8;
							 | 
						||
| 
								 | 
							
								        let height = 400;
							 | 
						||
| 
								 | 
							
								        if (height+top+8>maxHeight) height=maxHeight-top-8;
							 | 
						||
| 
								 | 
							
								        domPopupSearchResultsWindow.style.top     = top  + 'px';
							 | 
						||
| 
								 | 
							
								        domPopupSearchResultsWindow.style.left    = left + 'px';
							 | 
						||
| 
								 | 
							
								        domPopupSearchResultsWindow.style.width   = width + 'px';
							 | 
						||
| 
								 | 
							
								        domPopupSearchResultsWindow.style.height  = height + 'px';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (jsFile) {
							 | 
						||
| 
								 | 
							
								      loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow());
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      handleResults();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.lastSearchValue = searchValue;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // -------- Activation Functions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Activates or deactivates the search panel, resetting things to
							 | 
						||
| 
								 | 
							
								  // their default values if necessary.
							 | 
						||
| 
								 | 
							
								  this.Activate = function(isActive) {
							 | 
						||
| 
								 | 
							
								    if (isActive || // open it
							 | 
						||
| 
								 | 
							
								      this.DOMPopupSearchResultsWindow().style.display == 'block'
							 | 
						||
| 
								 | 
							
								    ) {
							 | 
						||
| 
								 | 
							
								      this.DOMSearchBox().className = 'MSearchBoxActive';
							 | 
						||
| 
								 | 
							
								      this.searchActive = true;
							 | 
						||
| 
								 | 
							
								    } else if (!isActive) { // directly remove the panel
							 | 
						||
| 
								 | 
							
								      this.DOMSearchBox().className = 'MSearchBoxInactive';
							 | 
						||
| 
								 | 
							
								      this.searchActive             = false;
							 | 
						||
| 
								 | 
							
								      this.lastSearchValue          = ''
							 | 
						||
| 
								 | 
							
								      this.lastResultsPage          = '';
							 | 
						||
| 
								 | 
							
								      this.DOMSearchField().value   = '';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// -----------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// The class that handles everything on the search results page.
							 | 
						||
| 
								 | 
							
								function SearchResults() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function convertToId(search) {
							 | 
						||
| 
								 | 
							
								    let result = '';
							 | 
						||
| 
								 | 
							
								    for (let i=0;i<search.length;i++) {
							 | 
						||
| 
								 | 
							
								      const c = search.charAt(i);
							 | 
						||
| 
								 | 
							
								      const cn = c.charCodeAt(0);
							 | 
						||
| 
								 | 
							
								      if (c.match(/[a-z0-9\u0080-\uFFFF]/)) {
							 | 
						||
| 
								 | 
							
								        result+=c;
							 | 
						||
| 
								 | 
							
								      } else if (cn<16) {
							 | 
						||
| 
								 | 
							
								        result+="_0"+cn.toString(16);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        result+="_"+cn.toString(16);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return result;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // The number of matches from the last run of <Search()>.
							 | 
						||
| 
								 | 
							
								  this.lastMatchCount = 0;
							 | 
						||
| 
								 | 
							
								  this.lastKey = 0;
							 | 
						||
| 
								 | 
							
								  this.repeatOn = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Toggles the visibility of the passed element ID.
							 | 
						||
| 
								 | 
							
								  this.FindChildElement = function(id) {
							 | 
						||
| 
								 | 
							
								    const parentElement = document.getElementById(id);
							 | 
						||
| 
								 | 
							
								    let element = parentElement.firstChild;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    while (element && element!=parentElement) {
							 | 
						||
| 
								 | 
							
								      if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') {
							 | 
						||
| 
								 | 
							
								        return element;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) {
							 | 
						||
| 
								 | 
							
								        element = element.firstChild;
							 | 
						||
| 
								 | 
							
								      } else if (element.nextSibling) {
							 | 
						||
| 
								 | 
							
								        element = element.nextSibling;
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        do {
							 | 
						||
| 
								 | 
							
								          element = element.parentNode;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        while (element && element!=parentElement && !element.nextSibling);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (element && element!=parentElement) {
							 | 
						||
| 
								 | 
							
								          element = element.nextSibling;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.Toggle = function(id) {
							 | 
						||
| 
								 | 
							
								    const element = this.FindChildElement(id);
							 | 
						||
| 
								 | 
							
								    if (element) {
							 | 
						||
| 
								 | 
							
								      if (element.style.display == 'block') {
							 | 
						||
| 
								 | 
							
								        element.style.display = 'none';
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        element.style.display = 'block';
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Searches for the passed string.  If there is no parameter,
							 | 
						||
| 
								 | 
							
								  // it takes it from the URL query.
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  // Always returns true, since other documents may try to call it
							 | 
						||
| 
								 | 
							
								  // and that may or may not be possible.
							 | 
						||
| 
								 | 
							
								  this.Search = function(search) {
							 | 
						||
| 
								 | 
							
								    if (!search) { // get search word from URL
							 | 
						||
| 
								 | 
							
								      search = window.location.search;
							 | 
						||
| 
								 | 
							
								      search = search.substring(1);  // Remove the leading '?'
							 | 
						||
| 
								 | 
							
								      search = unescape(search);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    search = search.replace(/^ +/, ""); // strip leading spaces
							 | 
						||
| 
								 | 
							
								    search = search.replace(/ +$/, ""); // strip trailing spaces
							 | 
						||
| 
								 | 
							
								    search = search.toLowerCase();
							 | 
						||
| 
								 | 
							
								    search = convertToId(search);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const resultRows = document.getElementsByTagName("div");
							 | 
						||
| 
								 | 
							
								    let matches = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let i = 0;
							 | 
						||
| 
								 | 
							
								    while (i < resultRows.length) {
							 | 
						||
| 
								 | 
							
								      const row = resultRows.item(i);
							 | 
						||
| 
								 | 
							
								      if (row.className == "SRResult") {
							 | 
						||
| 
								 | 
							
								        let rowMatchName = row.id.toLowerCase();
							 | 
						||
| 
								 | 
							
								        rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (search.length<=rowMatchName.length &&
							 | 
						||
| 
								 | 
							
								          rowMatchName.substr(0, search.length)==search) {
							 | 
						||
| 
								 | 
							
								          row.style.display = 'block';
							 | 
						||
| 
								 | 
							
								          matches++;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								          row.style.display = 'none';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      i++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    document.getElementById("Searching").style.display='none';
							 | 
						||
| 
								 | 
							
								    if (matches == 0) { // no results
							 | 
						||
| 
								 | 
							
								      document.getElementById("NoMatches").style.display='block';
							 | 
						||
| 
								 | 
							
								    } else { // at least one result
							 | 
						||
| 
								 | 
							
								      document.getElementById("NoMatches").style.display='none';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.lastMatchCount = matches;
							 | 
						||
| 
								 | 
							
								    return true;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // return the first item with index index or higher that is visible
							 | 
						||
| 
								 | 
							
								  this.NavNext = function(index) {
							 | 
						||
| 
								 | 
							
								    let focusItem;
							 | 
						||
| 
								 | 
							
								    for (;;) {
							 | 
						||
| 
								 | 
							
								      const focusName = 'Item'+index;
							 | 
						||
| 
								 | 
							
								      focusItem = document.getElementById(focusName);
							 | 
						||
| 
								 | 
							
								      if (focusItem && focusItem.parentNode.parentNode.style.display=='block') {
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      } else if (!focusItem) { // last element
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      focusItem=null;
							 | 
						||
| 
								 | 
							
								      index++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return focusItem;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.NavPrev = function(index) {
							 | 
						||
| 
								 | 
							
								    let focusItem;
							 | 
						||
| 
								 | 
							
								    for (;;) {
							 | 
						||
| 
								 | 
							
								      const focusName = 'Item'+index;
							 | 
						||
| 
								 | 
							
								      focusItem = document.getElementById(focusName);
							 | 
						||
| 
								 | 
							
								      if (focusItem && focusItem.parentNode.parentNode.style.display=='block') {
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      } else if (!focusItem) { // last element
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      focusItem=null;
							 | 
						||
| 
								 | 
							
								      index--;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return focusItem;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.ProcessKeys = function(e) {
							 | 
						||
| 
								 | 
							
								    if (e.type == "keydown") {
							 | 
						||
| 
								 | 
							
								      this.repeatOn = false;
							 | 
						||
| 
								 | 
							
								      this.lastKey = e.keyCode;
							 | 
						||
| 
								 | 
							
								    } else if (e.type == "keypress") {
							 | 
						||
| 
								 | 
							
								      if (!this.repeatOn) {
							 | 
						||
| 
								 | 
							
								        if (this.lastKey) this.repeatOn = true;
							 | 
						||
| 
								 | 
							
								        return false; // ignore first keypress after keydown
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else if (e.type == "keyup") {
							 | 
						||
| 
								 | 
							
								      this.lastKey = 0;
							 | 
						||
| 
								 | 
							
								      this.repeatOn = false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return this.lastKey!=0;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.Nav = function(evt,itemIndex) {
							 | 
						||
| 
								 | 
							
								    const e  = (evt) ? evt : window.event; // for IE
							 | 
						||
| 
								 | 
							
								    if (e.keyCode==13) return true;
							 | 
						||
| 
								 | 
							
								    if (!this.ProcessKeys(e)) return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.lastKey==38) { // Up
							 | 
						||
| 
								 | 
							
								      const newIndex = itemIndex-1;
							 | 
						||
| 
								 | 
							
								      let focusItem = this.NavPrev(newIndex);
							 | 
						||
| 
								 | 
							
								      if (focusItem) {
							 | 
						||
| 
								 | 
							
								        let child = this.FindChildElement(focusItem.parentNode.parentNode.id);
							 | 
						||
| 
								 | 
							
								        if (child && child.style.display == 'block') { // children visible
							 | 
						||
| 
								 | 
							
								          let n=0;
							 | 
						||
| 
								 | 
							
								          let tmpElem;
							 | 
						||
| 
								 | 
							
								          for (;;) { // search for last child
							 | 
						||
| 
								 | 
							
								            tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
							 | 
						||
| 
								 | 
							
								            if (tmpElem) {
							 | 
						||
| 
								 | 
							
								              focusItem = tmpElem;
							 | 
						||
| 
								 | 
							
								            } else { // found it!
							 | 
						||
| 
								 | 
							
								              break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            n++;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (focusItem) {
							 | 
						||
| 
								 | 
							
								        focusItem.focus();
							 | 
						||
| 
								 | 
							
								      } else { // return focus to search field
							 | 
						||
| 
								 | 
							
								        document.getElementById("MSearchField").focus();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else if (this.lastKey==40) { // Down
							 | 
						||
| 
								 | 
							
								      const newIndex = itemIndex+1;
							 | 
						||
| 
								 | 
							
								      let focusItem;
							 | 
						||
| 
								 | 
							
								      const item = document.getElementById('Item'+itemIndex);
							 | 
						||
| 
								 | 
							
								      const elem = this.FindChildElement(item.parentNode.parentNode.id);
							 | 
						||
| 
								 | 
							
								      if (elem && elem.style.display == 'block') { // children visible
							 | 
						||
| 
								 | 
							
								        focusItem = document.getElementById('Item'+itemIndex+'_c0');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (!focusItem) focusItem = this.NavNext(newIndex);
							 | 
						||
| 
								 | 
							
								      if (focusItem)  focusItem.focus();
							 | 
						||
| 
								 | 
							
								    } else if (this.lastKey==39) { // Right
							 | 
						||
| 
								 | 
							
								      const item = document.getElementById('Item'+itemIndex);
							 | 
						||
| 
								 | 
							
								      const elem = this.FindChildElement(item.parentNode.parentNode.id);
							 | 
						||
| 
								 | 
							
								      if (elem) elem.style.display = 'block';
							 | 
						||
| 
								 | 
							
								    } else if (this.lastKey==37) { // Left
							 | 
						||
| 
								 | 
							
								      const item = document.getElementById('Item'+itemIndex);
							 | 
						||
| 
								 | 
							
								      const elem = this.FindChildElement(item.parentNode.parentNode.id);
							 | 
						||
| 
								 | 
							
								      if (elem) elem.style.display = 'none';
							 | 
						||
| 
								 | 
							
								    } else if (this.lastKey==27) { // Escape
							 | 
						||
| 
								 | 
							
								      e.stopPropagation();
							 | 
						||
| 
								 | 
							
								      searchBox.CloseResultsWindow();
							 | 
						||
| 
								 | 
							
								      document.getElementById("MSearchField").focus();
							 | 
						||
| 
								 | 
							
								    } else if (this.lastKey==13) { // Enter
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.NavChild = function(evt,itemIndex,childIndex) {
							 | 
						||
| 
								 | 
							
								    const e  = (evt) ? evt : window.event; // for IE
							 | 
						||
| 
								 | 
							
								    if (e.keyCode==13) return true;
							 | 
						||
| 
								 | 
							
								    if (!this.ProcessKeys(e)) return false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.lastKey==38) { // Up
							 | 
						||
| 
								 | 
							
								      if (childIndex>0) {
							 | 
						||
| 
								 | 
							
								        const newIndex = childIndex-1;
							 | 
						||
| 
								 | 
							
								        document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
							 | 
						||
| 
								 | 
							
								      } else { // already at first child, jump to parent
							 | 
						||
| 
								 | 
							
								        document.getElementById('Item'+itemIndex).focus();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else if (this.lastKey==40) { // Down
							 | 
						||
| 
								 | 
							
								      const newIndex = childIndex+1;
							 | 
						||
| 
								 | 
							
								      let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
							 | 
						||
| 
								 | 
							
								      if (!elem) { // last child, jump to parent next parent
							 | 
						||
| 
								 | 
							
								        elem = this.NavNext(itemIndex+1);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (elem) {
							 | 
						||
| 
								 | 
							
								        elem.focus();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else if (this.lastKey==27) { // Escape
							 | 
						||
| 
								 | 
							
								      e.stopPropagation();
							 | 
						||
| 
								 | 
							
								      searchBox.CloseResultsWindow();
							 | 
						||
| 
								 | 
							
								      document.getElementById("MSearchField").focus();
							 | 
						||
| 
								 | 
							
								    } else if (this.lastKey==13) { // Enter
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function createResults(resultsPath) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function setKeyActions(elem,action) {
							 | 
						||
| 
								 | 
							
								    elem.setAttribute('onkeydown',action);
							 | 
						||
| 
								 | 
							
								    elem.setAttribute('onkeypress',action);
							 | 
						||
| 
								 | 
							
								    elem.setAttribute('onkeyup',action);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function setClassAttr(elem,attr) {
							 | 
						||
| 
								 | 
							
								    elem.setAttribute('class',attr);
							 | 
						||
| 
								 | 
							
								    elem.setAttribute('className',attr);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const results = document.getElementById("SRResults");
							 | 
						||
| 
								 | 
							
								  results.innerHTML = '';
							 | 
						||
| 
								 | 
							
								  searchData.forEach((elem,index) => {
							 | 
						||
| 
								 | 
							
								    const id = elem[0];
							 | 
						||
| 
								 | 
							
								    const srResult = document.createElement('div');
							 | 
						||
| 
								 | 
							
								    srResult.setAttribute('id','SR_'+id);
							 | 
						||
| 
								 | 
							
								    setClassAttr(srResult,'SRResult');
							 | 
						||
| 
								 | 
							
								    const srEntry = document.createElement('div');
							 | 
						||
| 
								 | 
							
								    setClassAttr(srEntry,'SREntry');
							 | 
						||
| 
								 | 
							
								    const srLink = document.createElement('a');
							 | 
						||
| 
								 | 
							
								    srLink.setAttribute('id','Item'+index);
							 | 
						||
| 
								 | 
							
								    setKeyActions(srLink,'return searchResults.Nav(event,'+index+')');
							 | 
						||
| 
								 | 
							
								    setClassAttr(srLink,'SRSymbol');
							 | 
						||
| 
								 | 
							
								    srLink.innerHTML = elem[1][0];
							 | 
						||
| 
								 | 
							
								    srEntry.appendChild(srLink);
							 | 
						||
| 
								 | 
							
								    if (elem[1].length==2) { // single result
							 | 
						||
| 
								 | 
							
								      srLink.setAttribute('href',resultsPath+elem[1][1][0]);
							 | 
						||
| 
								 | 
							
								      srLink.setAttribute('onclick','searchBox.CloseResultsWindow()');
							 | 
						||
| 
								 | 
							
								      if (elem[1][1][1]) {
							 | 
						||
| 
								 | 
							
								       srLink.setAttribute('target','_parent');
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								       srLink.setAttribute('target','_blank');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      const srScope = document.createElement('span');
							 | 
						||
| 
								 | 
							
								      setClassAttr(srScope,'SRScope');
							 | 
						||
| 
								 | 
							
								      srScope.innerHTML = elem[1][1][2];
							 | 
						||
| 
								 | 
							
								      srEntry.appendChild(srScope);
							 | 
						||
| 
								 | 
							
								    } else { // multiple results
							 | 
						||
| 
								 | 
							
								      srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
							 | 
						||
| 
								 | 
							
								      const srChildren = document.createElement('div');
							 | 
						||
| 
								 | 
							
								      setClassAttr(srChildren,'SRChildren');
							 | 
						||
| 
								 | 
							
								      for (let c=0; c<elem[1].length-1; c++) {
							 | 
						||
| 
								 | 
							
								        const srChild = document.createElement('a');
							 | 
						||
| 
								 | 
							
								        srChild.setAttribute('id','Item'+index+'_c'+c);
							 | 
						||
| 
								 | 
							
								        setKeyActions(srChild,'return searchResults.NavChild(event,'+index+','+c+')');
							 | 
						||
| 
								 | 
							
								        setClassAttr(srChild,'SRScope');
							 | 
						||
| 
								 | 
							
								        srChild.setAttribute('href',resultsPath+elem[1][c+1][0]);
							 | 
						||
| 
								 | 
							
								        srChild.setAttribute('onclick','searchBox.CloseResultsWindow()');
							 | 
						||
| 
								 | 
							
								        if (elem[1][c+1][1]) {
							 | 
						||
| 
								 | 
							
								         srChild.setAttribute('target','_parent');
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								         srChild.setAttribute('target','_blank');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        srChild.innerHTML = elem[1][c+1][2];
							 | 
						||
| 
								 | 
							
								        srChildren.appendChild(srChild);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      srEntry.appendChild(srChildren);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    srResult.appendChild(srEntry);
							 | 
						||
| 
								 | 
							
								    results.appendChild(srResult);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function init_search() {
							 | 
						||
| 
								 | 
							
								  const results = document.getElementById("MSearchSelectWindow");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  results.tabIndex=0;
							 | 
						||
| 
								 | 
							
								  for (let key in indexSectionLabels) {
							 | 
						||
| 
								 | 
							
								    const link = document.createElement('a');
							 | 
						||
| 
								 | 
							
								    link.setAttribute('class','SelectItem');
							 | 
						||
| 
								 | 
							
								    link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
							 | 
						||
| 
								 | 
							
								    link.href='javascript:void(0)';
							 | 
						||
| 
								 | 
							
								    link.innerHTML='<span class="SelectionMark"> </span>'+indexSectionLabels[key];
							 | 
						||
| 
								 | 
							
								    results.appendChild(link);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const input = document.getElementById("MSearchSelect");
							 | 
						||
| 
								 | 
							
								  const searchSelectWindow = document.getElementById("MSearchSelectWindow");
							 | 
						||
| 
								 | 
							
								  input.tabIndex=0;
							 | 
						||
| 
								 | 
							
								  input.addEventListener("keydown", function(event) {
							 | 
						||
| 
								 | 
							
								    if (event.keyCode==13 || event.keyCode==40) {
							 | 
						||
| 
								 | 
							
								      event.preventDefault();
							 | 
						||
| 
								 | 
							
								      if (searchSelectWindow.style.display == 'block') {
							 | 
						||
| 
								 | 
							
								        searchBox.CloseSelectionWindow();
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        searchBox.OnSearchSelectShow();
							 | 
						||
| 
								 | 
							
								        searchBox.DOMSearchSelectWindow().focus();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  const name = Cookie.readSetting(SEARCH_COOKIE_NAME,0);
							 | 
						||
| 
								 | 
							
								  const id = searchBox.GetSelectionIdByName(name);
							 | 
						||
| 
								 | 
							
								  searchBox.OnSelectItem(id);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/* @license-end */
							 |