Blame templates/html/search.js

Packit Service 50c9f2
/*
Packit Service 50c9f2
 @licstart  The following is the entire license notice for the
Packit Service 50c9f2
 JavaScript code in this file.
Packit Service 50c9f2
Packit Service 50c9f2
 Copyright (C) 1997-2017 by Dimitri van Heesch
Packit Service 50c9f2
Packit Service 50c9f2
 This program is free software; you can redistribute it and/or modify
Packit Service 50c9f2
 it under the terms of the GNU General Public License as published by
Packit Service 50c9f2
 the Free Software Foundation; either version 2 of the License, or
Packit Service 50c9f2
 (at your option) any later version.
Packit Service 50c9f2
Packit Service 50c9f2
 This program is distributed in the hope that it will be useful,
Packit Service 50c9f2
 but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 50c9f2
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 50c9f2
 GNU General Public License for more details.
Packit Service 50c9f2
Packit Service 50c9f2
 You should have received a copy of the GNU General Public License along
Packit Service 50c9f2
 with this program; if not, write to the Free Software Foundation, Inc.,
Packit Service 50c9f2
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit Service 50c9f2
Packit Service 50c9f2
 @licend  The above is the entire license notice
Packit Service 50c9f2
 for the JavaScript code in this file
Packit Service 50c9f2
 */
Packit Service 50c9f2
function convertToId(search)
Packit Service 50c9f2
{
Packit Service 50c9f2
  var result = '';
Packit Service 50c9f2
  for (i=0;i
Packit Service 50c9f2
  {
Packit Service 50c9f2
    var c = search.charAt(i);
Packit Service 50c9f2
    var cn = c.charCodeAt(0);
Packit Service 50c9f2
    if (c.match(/[a-z0-9\u0080-\uFFFF]/))
Packit Service 50c9f2
    {
Packit Service 50c9f2
      result+=c;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (cn<16)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      result+="_0"+cn.toString(16);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      result+="_"+cn.toString(16);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return result;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
function getXPos(item)
Packit Service 50c9f2
{
Packit Service 50c9f2
  var x = 0;
Packit Service 50c9f2
  if (item.offsetWidth)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    while (item && item!=document.body)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      x   += item.offsetLeft;
Packit Service 50c9f2
      item = item.offsetParent;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return x;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
function getYPos(item)
Packit Service 50c9f2
{
Packit Service 50c9f2
  var y = 0;
Packit Service 50c9f2
  if (item.offsetWidth)
Packit Service 50c9f2
  {
Packit Service 50c9f2
     while (item && item!=document.body)
Packit Service 50c9f2
     {
Packit Service 50c9f2
       y   += item.offsetTop;
Packit Service 50c9f2
       item = item.offsetParent;
Packit Service 50c9f2
     }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return y;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/* A class handling everything associated with the search panel.
Packit Service 50c9f2
Packit Service 50c9f2
   Parameters:
Packit Service 50c9f2
   name - The name of the global variable that will be
Packit Service 50c9f2
          storing this instance.  Is needed to be able to set timeouts.
Packit Service 50c9f2
   resultPath - path to use for external files
Packit Service 50c9f2
*/
Packit Service 50c9f2
function SearchBox(name, resultsPath, inFrame, label)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (!name || !resultsPath) {  alert("Missing parameters to SearchBox."); }
Packit Service 50c9f2
Packit Service 50c9f2
  // ---------- Instance variables
Packit Service 50c9f2
  this.name                  = name;
Packit Service 50c9f2
  this.resultsPath           = resultsPath;
Packit Service 50c9f2
  this.keyTimeout            = 0;
Packit Service 50c9f2
  this.keyTimeoutLength      = 500;
Packit Service 50c9f2
  this.closeSelectionTimeout = 300;
Packit Service 50c9f2
  this.lastSearchValue       = "";
Packit Service 50c9f2
  this.lastResultsPage       = "";
Packit Service 50c9f2
  this.hideTimeout           = 0;
Packit Service 50c9f2
  this.searchIndex           = 0;
Packit Service 50c9f2
  this.searchActive          = false;
Packit Service 50c9f2
  this.insideFrame           = inFrame;
Packit Service 50c9f2
  this.searchLabel           = label;
Packit Service 50c9f2
Packit Service 50c9f2
  // ----------- DOM Elements
Packit Service 50c9f2
Packit Service 50c9f2
  this.DOMSearchField = function()
Packit Service 50c9f2
  {  return document.getElementById("MSearchField");  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.DOMSearchSelect = function()
Packit Service 50c9f2
  {  return document.getElementById("MSearchSelect");  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.DOMSearchSelectWindow = function()
Packit Service 50c9f2
  {  return document.getElementById("MSearchSelectWindow");  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.DOMPopupSearchResults = function()
Packit Service 50c9f2
  {  return document.getElementById("MSearchResults");  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.DOMPopupSearchResultsWindow = function()
Packit Service 50c9f2
  {  return document.getElementById("MSearchResultsWindow");  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.DOMSearchClose = function()
Packit Service 50c9f2
  {  return document.getElementById("MSearchClose"); }
Packit Service 50c9f2
Packit Service 50c9f2
  this.DOMSearchBox = function()
Packit Service 50c9f2
  {  return document.getElementById("MSearchBox");  }
Packit Service 50c9f2
Packit Service 50c9f2
  // ------------ Event Handlers
Packit Service 50c9f2
Packit Service 50c9f2
  // Called when focus is added or removed from the search field.
Packit Service 50c9f2
  this.OnSearchFieldFocus = function(isActive)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    this.Activate(isActive);
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.OnSearchSelectShow = function()
Packit Service 50c9f2
  {
Packit Service 50c9f2
    var searchSelectWindow = this.DOMSearchSelectWindow();
Packit Service 50c9f2
    var searchField        = this.DOMSearchSelect();
Packit Service 50c9f2
Packit Service 50c9f2
    if (this.insideFrame)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var left = getXPos(searchField);
Packit Service 50c9f2
      var top  = getYPos(searchField);
Packit Service 50c9f2
      left += searchField.offsetWidth + 6;
Packit Service 50c9f2
      top += searchField.offsetHeight;
Packit Service 50c9f2
Packit Service 50c9f2
      // show search selection popup
Packit Service 50c9f2
      searchSelectWindow.style.display='block';
Packit Service 50c9f2
      left -= searchSelectWindow.offsetWidth;
Packit Service 50c9f2
      searchSelectWindow.style.left =  left + 'px';
Packit Service 50c9f2
      searchSelectWindow.style.top  =  top  + 'px';
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var left = getXPos(searchField);
Packit Service 50c9f2
      var top  = getYPos(searchField);
Packit Service 50c9f2
      top += searchField.offsetHeight;
Packit Service 50c9f2
Packit Service 50c9f2
      // show search selection popup
Packit Service 50c9f2
      searchSelectWindow.style.display='block';
Packit Service 50c9f2
      searchSelectWindow.style.left =  left + 'px';
Packit Service 50c9f2
      searchSelectWindow.style.top  =  top  + 'px';
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    // stop selection hide timer
Packit Service 50c9f2
    if (this.hideTimeout)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      clearTimeout(this.hideTimeout);
Packit Service 50c9f2
      this.hideTimeout=0;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    return false; // to avoid "image drag" default event
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.OnSearchSelectHide = function()
Packit Service 50c9f2
  {
Packit Service 50c9f2
    this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
Packit Service 50c9f2
                                  this.closeSelectionTimeout);
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // Called when the content of the search field is changed.
Packit Service 50c9f2
  this.OnSearchFieldChange = function(evt)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (this.keyTimeout) // kill running timer
Packit Service 50c9f2
    {
Packit Service 50c9f2
      clearTimeout(this.keyTimeout);
Packit Service 50c9f2
      this.keyTimeout = 0;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    var e  = (evt) ? evt : window.event; // for IE
Packit Service 50c9f2
    if (e.keyCode==40 || e.keyCode==13)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (e.shiftKey==1)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        this.OnSearchSelectShow();
Packit Service 50c9f2
        var win=this.DOMSearchSelectWindow();
Packit Service 50c9f2
        for (i=0;i
Packit Service 50c9f2
        {
Packit Service 50c9f2
          var child = win.childNodes[i]; // get span within a
Packit Service 50c9f2
          if (child.className=='SelectItem')
Packit Service 50c9f2
          {
Packit Service 50c9f2
            child.focus();
Packit Service 50c9f2
            return;
Packit Service 50c9f2
          }
Packit Service 50c9f2
        }
Packit Service 50c9f2
        return;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (window.frames.MSearchResults.searchResults)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var elem = window.frames.MSearchResults.searchResults.NavNext(0);
Packit Service 50c9f2
        if (elem) elem.focus();
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (e.keyCode==27) // Escape out of the search field
Packit Service 50c9f2
    {
Packit Service 50c9f2
      this.DOMSearchField().blur();
Packit Service 50c9f2
      this.DOMPopupSearchResultsWindow().style.display = 'none';
Packit Service 50c9f2
      this.DOMSearchClose().style.display = 'none';
Packit Service 50c9f2
      this.lastSearchValue = '';
Packit Service 50c9f2
      this.Activate(false);
Packit Service 50c9f2
      return;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    // strip whitespaces
Packit Service 50c9f2
    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
Packit Service 50c9f2
Packit Service 50c9f2
    if (searchValue != this.lastSearchValue) // search value has changed
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (searchValue != "") // non-empty search
Packit Service 50c9f2
      {
Packit Service 50c9f2
        // set timer for search update
Packit Service 50c9f2
        this.keyTimeout = setTimeout(this.name + '.Search()',
Packit Service 50c9f2
                                     this.keyTimeoutLength);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else // empty search field
Packit Service 50c9f2
      {
Packit Service 50c9f2
        this.DOMPopupSearchResultsWindow().style.display = 'none';
Packit Service 50c9f2
        this.DOMSearchClose().style.display = 'none';
Packit Service 50c9f2
        this.lastSearchValue = '';
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.SelectItemCount = function(id)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    var count=0;
Packit Service 50c9f2
    var win=this.DOMSearchSelectWindow();
Packit Service 50c9f2
    for (i=0;i
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var child = win.childNodes[i]; // get span within a
Packit Service 50c9f2
      if (child.className=='SelectItem')
Packit Service 50c9f2
      {
Packit Service 50c9f2
        count++;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    return count;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.SelectItemSet = function(id)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    var i,j=0;
Packit Service 50c9f2
    var win=this.DOMSearchSelectWindow();
Packit Service 50c9f2
    for (i=0;i
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var child = win.childNodes[i]; // get span within a
Packit Service 50c9f2
      if (child.className=='SelectItem')
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var node = child.firstChild;
Packit Service 50c9f2
        if (j==id)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          node.innerHTML='•';
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else
Packit Service 50c9f2
        {
Packit Service 50c9f2
          node.innerHTML=' ';
Packit Service 50c9f2
        }
Packit Service 50c9f2
        j++;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // Called when an search filter selection is made.
Packit Service 50c9f2
  // set item with index id as the active item
Packit Service 50c9f2
  this.OnSelectItem = function(id)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    this.searchIndex = id;
Packit Service 50c9f2
    this.SelectItemSet(id);
Packit Service 50c9f2
    var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
Packit Service 50c9f2
    if (searchValue!="" && this.searchActive) // something was found -> do a search
Packit Service 50c9f2
    {
Packit Service 50c9f2
      this.Search();
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.OnSearchSelectKey = function(evt)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    var e = (evt) ? evt : window.event; // for IE
Packit Service 50c9f2
    if (e.keyCode==40 && this.searchIndex
Packit Service 50c9f2
    {
Packit Service 50c9f2
      this.searchIndex++;
Packit Service 50c9f2
      this.OnSelectItem(this.searchIndex);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (e.keyCode==38 && this.searchIndex>0) // Up
Packit Service 50c9f2
    {
Packit Service 50c9f2
      this.searchIndex--;
Packit Service 50c9f2
      this.OnSelectItem(this.searchIndex);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (e.keyCode==13 || e.keyCode==27)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      this.OnSelectItem(this.searchIndex);
Packit Service 50c9f2
      this.CloseSelectionWindow();
Packit Service 50c9f2
      this.DOMSearchField().focus();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    return false;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // --------- Actions
Packit Service 50c9f2
Packit Service 50c9f2
  // Closes the results window.
Packit Service 50c9f2
  this.CloseResultsWindow = function()
Packit Service 50c9f2
  {
Packit Service 50c9f2
    this.DOMPopupSearchResultsWindow().style.display = 'none';
Packit Service 50c9f2
    this.DOMSearchClose().style.display = 'none';
Packit Service 50c9f2
    this.Activate(false);
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  this.CloseSelectionWindow = function()
Packit Service 50c9f2
  {
Packit Service 50c9f2
    this.DOMSearchSelectWindow().style.display = 'none';
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // Performs a search.
Packit Service 50c9f2
  this.Search = function()
Packit Service 50c9f2
  {
Packit Service 50c9f2
    this.keyTimeout = 0;
Packit Service 50c9f2
Packit Service 50c9f2
    // strip leading whitespace
Packit Service 50c9f2
    var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
Packit Service 50c9f2
Packit Service 50c9f2
    var code = searchValue.toLowerCase().charCodeAt(0);
Packit Service 50c9f2
    var idxChar = searchValue.substr(0, 1).toLowerCase();
Packit Service 50c9f2
    if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
Packit Service 50c9f2
    {
Packit Service 50c9f2
      idxChar = searchValue.substr(0, 2);
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    var resultsPage;
Packit Service 50c9f2
    var resultsPageWithSearch;
Packit Service 50c9f2
    var hasResultsPage;
Packit Service 50c9f2
Packit Service 50c9f2
    var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
Packit Service 50c9f2
    if (idx!=-1)
Packit Service 50c9f2
    {
Packit Service 50c9f2
       var hexCode=idx.toString(16);
Packit Service 50c9f2
       resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
Packit Service 50c9f2
       resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
Packit Service 50c9f2
       hasResultsPage = true;
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else // nothing available for this search term
Packit Service 50c9f2
    {
Packit Service 50c9f2
       resultsPage = this.resultsPath + '/nomatches.html';
Packit Service 50c9f2
       resultsPageWithSearch = resultsPage;
Packit Service 50c9f2
       hasResultsPage = false;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    window.frames.MSearchResults.location = resultsPageWithSearch;
Packit Service 50c9f2
    var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
Packit Service 50c9f2
Packit Service 50c9f2
    if (domPopupSearchResultsWindow.style.display!='block')
Packit Service 50c9f2
    {
Packit Service 50c9f2
       var domSearchBox = this.DOMSearchBox();
Packit Service 50c9f2
       this.DOMSearchClose().style.display = 'inline';
Packit Service 50c9f2
       if (this.insideFrame)
Packit Service 50c9f2
       {
Packit Service 50c9f2
         var domPopupSearchResults = this.DOMPopupSearchResults();
Packit Service 50c9f2
         domPopupSearchResultsWindow.style.position = 'relative';
Packit Service 50c9f2
         domPopupSearchResultsWindow.style.display  = 'block';
Packit Service 50c9f2
         var width = document.body.clientWidth - 8; // the -8 is for IE :-(
Packit Service 50c9f2
         domPopupSearchResultsWindow.style.width    = width + 'px';
Packit Service 50c9f2
         domPopupSearchResults.style.width          = width + 'px';
Packit Service 50c9f2
       }
Packit Service 50c9f2
       else
Packit Service 50c9f2
       {
Packit Service 50c9f2
         var domPopupSearchResults = this.DOMPopupSearchResults();
Packit Service 50c9f2
         var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
Packit Service 50c9f2
         var top  = getYPos(domSearchBox) + 20;  // domSearchBox.offsetHeight + 1;
Packit Service 50c9f2
         domPopupSearchResultsWindow.style.display = 'block';
Packit Service 50c9f2
         left -= domPopupSearchResults.offsetWidth;
Packit Service 50c9f2
         domPopupSearchResultsWindow.style.top     = top  + 'px';
Packit Service 50c9f2
         domPopupSearchResultsWindow.style.left    = left + 'px';
Packit Service 50c9f2
       }
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    this.lastSearchValue = searchValue;
Packit Service 50c9f2
    this.lastResultsPage = resultsPage;
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // -------- Activation Functions
Packit Service 50c9f2
Packit Service 50c9f2
  // Activates or deactivates the search panel, resetting things to
Packit Service 50c9f2
  // their default values if necessary.
Packit Service 50c9f2
  this.Activate = function(isActive)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (isActive || // open it
Packit Service 50c9f2
        this.DOMPopupSearchResultsWindow().style.display == 'block'
Packit Service 50c9f2
       )
Packit Service 50c9f2
    {
Packit Service 50c9f2
      this.DOMSearchBox().className = 'MSearchBoxActive';
Packit Service 50c9f2
Packit Service 50c9f2
      var searchField = this.DOMSearchField();
Packit Service 50c9f2
Packit Service 50c9f2
      if (searchField.value == this.searchLabel) // clear "Search" term upon entry
Packit Service 50c9f2
      {
Packit Service 50c9f2
        searchField.value = '';
Packit Service 50c9f2
        this.searchActive = true;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else if (!isActive) // directly remove the panel
Packit Service 50c9f2
    {
Packit Service 50c9f2
      this.DOMSearchBox().className = 'MSearchBoxInactive';
Packit Service 50c9f2
      this.DOMSearchField().value   = this.searchLabel;
Packit Service 50c9f2
      this.searchActive             = false;
Packit Service 50c9f2
      this.lastSearchValue          = ''
Packit Service 50c9f2
      this.lastResultsPage          = '';
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
// -----------------------------------------------------------------------
Packit Service 50c9f2
Packit Service 50c9f2
// The class that handles everything on the search results page.
Packit Service 50c9f2
function SearchResults(name)
Packit Service 50c9f2
{
Packit Service 50c9f2
    // The number of matches from the last run of <Search()>.
Packit Service 50c9f2
    this.lastMatchCount = 0;
Packit Service 50c9f2
    this.lastKey = 0;
Packit Service 50c9f2
    this.repeatOn = false;
Packit Service 50c9f2
Packit Service 50c9f2
    // Toggles the visibility of the passed element ID.
Packit Service 50c9f2
    this.FindChildElement = function(id)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var parentElement = document.getElementById(id);
Packit Service 50c9f2
      var element = parentElement.firstChild;
Packit Service 50c9f2
Packit Service 50c9f2
      while (element && element!=parentElement)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        if (element.nodeName == 'DIV' && element.className == 'SRChildren')
Packit Service 50c9f2
        {
Packit Service 50c9f2
          return element;
Packit Service 50c9f2
        }
Packit Service 50c9f2
Packit Service 50c9f2
        if (element.nodeName == 'DIV' && element.hasChildNodes())
Packit Service 50c9f2
        {
Packit Service 50c9f2
           element = element.firstChild;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else if (element.nextSibling)
Packit Service 50c9f2
        {
Packit Service 50c9f2
           element = element.nextSibling;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else
Packit Service 50c9f2
        {
Packit Service 50c9f2
          do
Packit Service 50c9f2
          {
Packit Service 50c9f2
            element = element.parentNode;
Packit Service 50c9f2
          }
Packit Service 50c9f2
          while (element && element!=parentElement && !element.nextSibling);
Packit Service 50c9f2
Packit Service 50c9f2
          if (element && element!=parentElement)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            element = element.nextSibling;
Packit Service 50c9f2
          }
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    this.Toggle = function(id)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var element = this.FindChildElement(id);
Packit Service 50c9f2
      if (element)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        if (element.style.display == 'block')
Packit Service 50c9f2
        {
Packit Service 50c9f2
          element.style.display = 'none';
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else
Packit Service 50c9f2
        {
Packit Service 50c9f2
          element.style.display = 'block';
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    // Searches for the passed string.  If there is no parameter,
Packit Service 50c9f2
    // it takes it from the URL query.
Packit Service 50c9f2
    //
Packit Service 50c9f2
    // Always returns true, since other documents may try to call it
Packit Service 50c9f2
    // and that may or may not be possible.
Packit Service 50c9f2
    this.Search = function(search)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (!search) // get search word from URL
Packit Service 50c9f2
      {
Packit Service 50c9f2
        search = window.location.search;
Packit Service 50c9f2
        search = search.substring(1);  // Remove the leading '?'
Packit Service 50c9f2
        search = unescape(search);
Packit Service 50c9f2
      }
Packit Service 50c9f2
Packit Service 50c9f2
      search = search.replace(/^ +/, ""); // strip leading spaces
Packit Service 50c9f2
      search = search.replace(/ +$/, ""); // strip trailing spaces
Packit Service 50c9f2
      search = search.toLowerCase();
Packit Service 50c9f2
      search = convertToId(search);
Packit Service 50c9f2
Packit Service 50c9f2
      var resultRows = document.getElementsByTagName("div");
Packit Service 50c9f2
      var matches = 0;
Packit Service 50c9f2
Packit Service 50c9f2
      var i = 0;
Packit Service 50c9f2
      while (i < resultRows.length)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var row = resultRows.item(i);
Packit Service 50c9f2
        if (row.className == "SRResult")
Packit Service 50c9f2
        {
Packit Service 50c9f2
          var rowMatchName = row.id.toLowerCase();
Packit Service 50c9f2
          rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
Packit Service 50c9f2
Packit Service 50c9f2
          if (search.length<=rowMatchName.length &&
Packit Service 50c9f2
             rowMatchName.substr(0, search.length)==search)
Packit Service 50c9f2
          {
Packit Service 50c9f2
            row.style.display = 'block';
Packit Service 50c9f2
            matches++;
Packit Service 50c9f2
          }
Packit Service 50c9f2
          else
Packit Service 50c9f2
          {
Packit Service 50c9f2
            row.style.display = 'none';
Packit Service 50c9f2
          }
Packit Service 50c9f2
        }
Packit Service 50c9f2
        i++;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      document.getElementById("Searching").style.display='none';
Packit Service 50c9f2
      if (matches == 0) // no results
Packit Service 50c9f2
      {
Packit Service 50c9f2
        document.getElementById("NoMatches").style.display='block';
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else // at least one result
Packit Service 50c9f2
      {
Packit Service 50c9f2
        document.getElementById("NoMatches").style.display='none';
Packit Service 50c9f2
      }
Packit Service 50c9f2
      this.lastMatchCount = matches;
Packit Service 50c9f2
      return true;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    // return the first item with index index or higher that is visible
Packit Service 50c9f2
    this.NavNext = function(index)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var focusItem;
Packit Service 50c9f2
      while (1)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var focusName = 'Item'+index;
Packit Service 50c9f2
        focusItem = document.getElementById(focusName);
Packit Service 50c9f2
        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
Packit Service 50c9f2
        {
Packit Service 50c9f2
          break;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else if (!focusItem) // last element
Packit Service 50c9f2
        {
Packit Service 50c9f2
          break;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        focusItem=null;
Packit Service 50c9f2
        index++;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      return focusItem;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    this.NavPrev = function(index)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var focusItem;
Packit Service 50c9f2
      while (1)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var focusName = 'Item'+index;
Packit Service 50c9f2
        focusItem = document.getElementById(focusName);
Packit Service 50c9f2
        if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
Packit Service 50c9f2
        {
Packit Service 50c9f2
          break;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else if (!focusItem) // last element
Packit Service 50c9f2
        {
Packit Service 50c9f2
          break;
Packit Service 50c9f2
        }
Packit Service 50c9f2
        focusItem=null;
Packit Service 50c9f2
        index--;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      return focusItem;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    this.ProcessKeys = function(e)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (e.type == "keydown")
Packit Service 50c9f2
      {
Packit Service 50c9f2
        this.repeatOn = false;
Packit Service 50c9f2
        this.lastKey = e.keyCode;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (e.type == "keypress")
Packit Service 50c9f2
      {
Packit Service 50c9f2
        if (!this.repeatOn)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          if (this.lastKey) this.repeatOn = true;
Packit Service 50c9f2
          return false; // ignore first keypress after keydown
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (e.type == "keyup")
Packit Service 50c9f2
      {
Packit Service 50c9f2
        this.lastKey = 0;
Packit Service 50c9f2
        this.repeatOn = false;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      return this.lastKey!=0;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    this.Nav = function(evt,itemIndex)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var e  = (evt) ? evt : window.event; // for IE
Packit Service 50c9f2
      if (e.keyCode==13) return true;
Packit Service 50c9f2
      if (!this.ProcessKeys(e)) return false;
Packit Service 50c9f2
Packit Service 50c9f2
      if (this.lastKey==38) // Up
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var newIndex = itemIndex-1;
Packit Service 50c9f2
        var focusItem = this.NavPrev(newIndex);
Packit Service 50c9f2
        if (focusItem)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
Packit Service 50c9f2
          if (child && child.style.display == 'block') // children visible
Packit Service 50c9f2
          {
Packit Service 50c9f2
            var n=0;
Packit Service 50c9f2
            var tmpElem;
Packit Service 50c9f2
            while (1) // search for last child
Packit Service 50c9f2
            {
Packit Service 50c9f2
              tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
Packit Service 50c9f2
              if (tmpElem)
Packit Service 50c9f2
              {
Packit Service 50c9f2
                focusItem = tmpElem;
Packit Service 50c9f2
              }
Packit Service 50c9f2
              else // found it!
Packit Service 50c9f2
              {
Packit Service 50c9f2
                break;
Packit Service 50c9f2
              }
Packit Service 50c9f2
              n++;
Packit Service 50c9f2
            }
Packit Service 50c9f2
          }
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (focusItem)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          focusItem.focus();
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else // return focus to search field
Packit Service 50c9f2
        {
Packit Service 50c9f2
           parent.document.getElementById("MSearchField").focus();
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (this.lastKey==40) // Down
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var newIndex = itemIndex+1;
Packit Service 50c9f2
        var focusItem;
Packit Service 50c9f2
        var item = document.getElementById('Item'+itemIndex);
Packit Service 50c9f2
        var elem = this.FindChildElement(item.parentNode.parentNode.id);
Packit Service 50c9f2
        if (elem && elem.style.display == 'block') // children visible
Packit Service 50c9f2
        {
Packit Service 50c9f2
          focusItem = document.getElementById('Item'+itemIndex+'_c0');
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (!focusItem) focusItem = this.NavNext(newIndex);
Packit Service 50c9f2
        if (focusItem)  focusItem.focus();
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (this.lastKey==39) // Right
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var item = document.getElementById('Item'+itemIndex);
Packit Service 50c9f2
        var elem = this.FindChildElement(item.parentNode.parentNode.id);
Packit Service 50c9f2
        if (elem) elem.style.display = 'block';
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (this.lastKey==37) // Left
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var item = document.getElementById('Item'+itemIndex);
Packit Service 50c9f2
        var elem = this.FindChildElement(item.parentNode.parentNode.id);
Packit Service 50c9f2
        if (elem) elem.style.display = 'none';
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (this.lastKey==27) // Escape
Packit Service 50c9f2
      {
Packit Service 50c9f2
        parent.searchBox.CloseResultsWindow();
Packit Service 50c9f2
        parent.document.getElementById("MSearchField").focus();
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (this.lastKey==13) // Enter
Packit Service 50c9f2
      {
Packit Service 50c9f2
        return true;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      return false;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    this.NavChild = function(evt,itemIndex,childIndex)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      var e  = (evt) ? evt : window.event; // for IE
Packit Service 50c9f2
      if (e.keyCode==13) return true;
Packit Service 50c9f2
      if (!this.ProcessKeys(e)) return false;
Packit Service 50c9f2
Packit Service 50c9f2
      if (this.lastKey==38) // Up
Packit Service 50c9f2
      {
Packit Service 50c9f2
        if (childIndex>0)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          var newIndex = childIndex-1;
Packit Service 50c9f2
          document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
Packit Service 50c9f2
        }
Packit Service 50c9f2
        else // already at first child, jump to parent
Packit Service 50c9f2
        {
Packit Service 50c9f2
          document.getElementById('Item'+itemIndex).focus();
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (this.lastKey==40) // Down
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var newIndex = childIndex+1;
Packit Service 50c9f2
        var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
Packit Service 50c9f2
        if (!elem) // last child, jump to parent next parent
Packit Service 50c9f2
        {
Packit Service 50c9f2
          elem = this.NavNext(itemIndex+1);
Packit Service 50c9f2
        }
Packit Service 50c9f2
        if (elem)
Packit Service 50c9f2
        {
Packit Service 50c9f2
          elem.focus();
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (this.lastKey==27) // Escape
Packit Service 50c9f2
      {
Packit Service 50c9f2
        parent.searchBox.CloseResultsWindow();
Packit Service 50c9f2
        parent.document.getElementById("MSearchField").focus();
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (this.lastKey==13) // Enter
Packit Service 50c9f2
      {
Packit Service 50c9f2
        return true;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      return false;
Packit Service 50c9f2
    }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
function setKeyActions(elem,action)
Packit Service 50c9f2
{
Packit Service 50c9f2
  elem.setAttribute('onkeydown',action);
Packit Service 50c9f2
  elem.setAttribute('onkeypress',action);
Packit Service 50c9f2
  elem.setAttribute('onkeyup',action);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
function setClassAttr(elem,attr)
Packit Service 50c9f2
{
Packit Service 50c9f2
  elem.setAttribute('class',attr);
Packit Service 50c9f2
  elem.setAttribute('className',attr);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
function createResults()
Packit Service 50c9f2
{
Packit Service 50c9f2
  var results = document.getElementById("SRResults");
Packit Service 50c9f2
  for (var e=0; e
Packit Service 50c9f2
  {
Packit Service 50c9f2
    var id = searchData[e][0];
Packit Service 50c9f2
    var srResult = document.createElement('div');
Packit Service 50c9f2
    srResult.setAttribute('id','SR_'+id);
Packit Service 50c9f2
    setClassAttr(srResult,'SRResult');
Packit Service 50c9f2
    var srEntry = document.createElement('div');
Packit Service 50c9f2
    setClassAttr(srEntry,'SREntry');
Packit Service 50c9f2
    var srLink = document.createElement('a');
Packit Service 50c9f2
    srLink.setAttribute('id','Item'+e);
Packit Service 50c9f2
    setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
Packit Service 50c9f2
    setClassAttr(srLink,'SRSymbol');
Packit Service 50c9f2
    srLink.innerHTML = searchData[e][1][0];
Packit Service 50c9f2
    srEntry.appendChild(srLink);
Packit Service 50c9f2
    if (searchData[e][1].length==2) // single result
Packit Service 50c9f2
    {
Packit Service 50c9f2
      srLink.setAttribute('href',searchData[e][1][1][0]);
Packit Service 50c9f2
      if (searchData[e][1][1][1])
Packit Service 50c9f2
      {
Packit Service 50c9f2
       srLink.setAttribute('target','_parent');
Packit Service 50c9f2
      }
Packit Service 50c9f2
      var srScope = document.createElement('span');
Packit Service 50c9f2
      setClassAttr(srScope,'SRScope');
Packit Service 50c9f2
      srScope.innerHTML = searchData[e][1][1][2];
Packit Service 50c9f2
      srEntry.appendChild(srScope);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else // multiple results
Packit Service 50c9f2
    {
Packit Service 50c9f2
      srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
Packit Service 50c9f2
      var srChildren = document.createElement('div');
Packit Service 50c9f2
      setClassAttr(srChildren,'SRChildren');
Packit Service 50c9f2
      for (var c=0; c
Packit Service 50c9f2
      {
Packit Service 50c9f2
        var srChild = document.createElement('a');
Packit Service 50c9f2
        srChild.setAttribute('id','Item'+e+'_c'+c);
Packit Service 50c9f2
        setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
Packit Service 50c9f2
        setClassAttr(srChild,'SRScope');
Packit Service 50c9f2
        srChild.setAttribute('href',searchData[e][1][c+1][0]);
Packit Service 50c9f2
        if (searchData[e][1][c+1][1])
Packit Service 50c9f2
        {
Packit Service 50c9f2
         srChild.setAttribute('target','_parent');
Packit Service 50c9f2
        }
Packit Service 50c9f2
        srChild.innerHTML = searchData[e][1][c+1][2];
Packit Service 50c9f2
        srChildren.appendChild(srChild);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      srEntry.appendChild(srChildren);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    srResult.appendChild(srEntry);
Packit Service 50c9f2
    results.appendChild(srResult);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
function init_search()
Packit Service 50c9f2
{
Packit Service 50c9f2
  var results = document.getElementById("MSearchSelectWindow");
Packit Service 50c9f2
  for (var key in indexSectionLabels)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    var link = document.createElement('a');
Packit Service 50c9f2
    link.setAttribute('class','SelectItem');
Packit Service 50c9f2
    link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
Packit Service 50c9f2
    link.href='javascript:void(0)';
Packit Service 50c9f2
    link.innerHTML=' '+indexSectionLabels[key];
Packit Service 50c9f2
    results.appendChild(link);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  searchBox.OnSelectItem(0);
Packit Service 50c9f2
}
Packit Service 50c9f2
/* @license-end */