You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							814 lines
						
					
					
						
							22 KiB
						
					
					
				
			
		
		
	
	
							814 lines
						
					
					
						
							22 KiB
						
					
					
				| /* | |
|  @licstart  The following is the entire license notice for the | |
|  JavaScript code in this file. | |
|  | |
|  Copyright (C) 1997-2017 by Dimitri van Heesch | |
|  | |
|  This program is free software; you can redistribute it and/or modify | |
|  it under the terms of the GNU General Public License as published by | |
|  the Free Software Foundation; either version 2 of the License, or | |
|  (at your option) any later version. | |
|  | |
|  This program is distributed in the hope that it will be useful, | |
|  but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
|  GNU General Public License for more details. | |
|  | |
|  You should have received a copy of the GNU General Public License along | |
|  with this program; if not, write to the Free Software Foundation, Inc., | |
|  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
|  | |
|  @licend  The above is the entire license notice | |
|  for the JavaScript code in this file | |
|  */ | |
| function convertToId(search) | |
| { | |
|   var result = ''; | |
|   for (i=0;i<search.length;i++) | |
|   { | |
|     var c = search.charAt(i); | |
|     var 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; | |
| } | |
| 
 | |
| function getXPos(item) | |
| { | |
|   var x = 0; | |
|   if (item.offsetWidth) | |
|   { | |
|     while (item && item!=document.body) | |
|     { | |
|       x   += item.offsetLeft; | |
|       item = item.offsetParent; | |
|     } | |
|   } | |
|   return x; | |
| } | |
| 
 | |
| function getYPos(item) | |
| { | |
|   var y = 0; | |
|   if (item.offsetWidth) | |
|   { | |
|      while (item && item!=document.body) | |
|      { | |
|        y   += item.offsetTop; | |
|        item = item.offsetParent; | |
|      } | |
|   } | |
|   return y; | |
| } | |
| 
 | |
| /* 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, inFrame, label) | |
| { | |
|   if (!name || !resultsPath) {  alert("Missing parameters to SearchBox."); } | |
| 
 | |
|   // ---------- 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.insideFrame           = inFrame; | |
|   this.searchLabel           = label; | |
| 
 | |
|   // ----------- DOM Elements | |
|  | |
|   this.DOMSearchField = function() | |
|   {  return document.getElementById("MSearchField");  } | |
| 
 | |
|   this.DOMSearchSelect = function() | |
|   {  return document.getElementById("MSearchSelect");  } | |
| 
 | |
|   this.DOMSearchSelectWindow = function() | |
|   {  return document.getElementById("MSearchSelectWindow");  } | |
| 
 | |
|   this.DOMPopupSearchResults = function() | |
|   {  return document.getElementById("MSearchResults");  } | |
| 
 | |
|   this.DOMPopupSearchResultsWindow = function() | |
|   {  return document.getElementById("MSearchResultsWindow");  } | |
| 
 | |
|   this.DOMSearchClose = function() | |
|   {  return document.getElementById("MSearchClose"); } | |
| 
 | |
|   this.DOMSearchBox = function() | |
|   {  return 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() | |
|   { | |
|     var searchSelectWindow = this.DOMSearchSelectWindow(); | |
|     var searchField        = this.DOMSearchSelect(); | |
| 
 | |
|     if (this.insideFrame) | |
|     { | |
|       var left = getXPos(searchField); | |
|       var top  = getYPos(searchField); | |
|       left += searchField.offsetWidth + 6; | |
|       top += searchField.offsetHeight; | |
| 
 | |
|       // show search selection popup | |
|       searchSelectWindow.style.display='block'; | |
|       left -= searchSelectWindow.offsetWidth; | |
|       searchSelectWindow.style.left =  left + 'px'; | |
|       searchSelectWindow.style.top  =  top  + 'px'; | |
|     } | |
|     else | |
|     { | |
|       var left = getXPos(searchField); | |
|       var top  = getYPos(searchField); | |
|       top += 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.name +".CloseSelectionWindow()", | |
|                                   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; | |
|     } | |
| 
 | |
|     var e  = (evt) ? evt : window.event; // for IE | |
|     if (e.keyCode==40 || e.keyCode==13) | |
|     { | |
|       if (e.shiftKey==1) | |
|       { | |
|         this.OnSearchSelectShow(); | |
|         var win=this.DOMSearchSelectWindow(); | |
|         for (i=0;i<win.childNodes.length;i++) | |
|         { | |
|           var child = win.childNodes[i]; // get span within a | |
|           if (child.className=='SelectItem') | |
|           { | |
|             child.focus(); | |
|             return; | |
|           } | |
|         } | |
|         return; | |
|       } | |
|       else if (window.frames.MSearchResults.searchResults) | |
|       { | |
|         var elem = window.frames.MSearchResults.searchResults.NavNext(0); | |
|         if (elem) elem.focus(); | |
|       } | |
|     } | |
|     else if (e.keyCode==27) // Escape out of the search field | |
|     { | |
|       this.DOMSearchField().blur(); | |
|       this.DOMPopupSearchResultsWindow().style.display = 'none'; | |
|       this.DOMSearchClose().style.display = 'none'; | |
|       this.lastSearchValue = ''; | |
|       this.Activate(false); | |
|       return; | |
|     } | |
| 
 | |
|     // strip whitespaces | |
|     var 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.name + '.Search()', | |
|                                      this.keyTimeoutLength); | |
|       } | |
|       else // empty search field | |
|       { | |
|         this.DOMPopupSearchResultsWindow().style.display = 'none'; | |
|         this.DOMSearchClose().style.display = 'none'; | |
|         this.lastSearchValue = ''; | |
|       } | |
|     } | |
|   } | |
| 
 | |
|   this.SelectItemCount = function(id) | |
|   { | |
|     var count=0; | |
|     var win=this.DOMSearchSelectWindow(); | |
|     for (i=0;i<win.childNodes.length;i++) | |
|     { | |
|       var child = win.childNodes[i]; // get span within a | |
|       if (child.className=='SelectItem') | |
|       { | |
|         count++; | |
|       } | |
|     } | |
|     return count; | |
|   } | |
| 
 | |
|   this.SelectItemSet = function(id) | |
|   { | |
|     var i,j=0; | |
|     var win=this.DOMSearchSelectWindow(); | |
|     for (i=0;i<win.childNodes.length;i++) | |
|     { | |
|       var child = win.childNodes[i]; // get span within a | |
|       if (child.className=='SelectItem') | |
|       { | |
|         var node = child.firstChild; | |
|         if (j==id) | |
|         { | |
|           node.innerHTML='•'; | |
|         } | |
|         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); | |
|     var searchValue = this.DOMSearchField().value.replace(/ +/g, ""); | |
|     if (searchValue!="" && this.searchActive) // something was found -> do a search | |
|     { | |
|       this.Search(); | |
|     } | |
|   } | |
| 
 | |
|   this.OnSearchSelectKey = function(evt) | |
|   { | |
|     var 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) | |
|     { | |
|       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 | |
|     var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); | |
| 
 | |
|     var code = searchValue.toLowerCase().charCodeAt(0); | |
|     var idxChar = searchValue.substr(0, 1).toLowerCase(); | |
|     if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair | |
|     { | |
|       idxChar = searchValue.substr(0, 2); | |
|     } | |
| 
 | |
|     var resultsPage; | |
|     var resultsPageWithSearch; | |
|     var hasResultsPage; | |
| 
 | |
|     var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); | |
|     if (idx!=-1) | |
|     { | |
|        var hexCode=idx.toString(16); | |
|        resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; | |
|        resultsPageWithSearch = resultsPage+'?'+escape(searchValue); | |
|        hasResultsPage = true; | |
|     } | |
|     else // nothing available for this search term | |
|     { | |
|        resultsPage = this.resultsPath + '/nomatches.html'; | |
|        resultsPageWithSearch = resultsPage; | |
|        hasResultsPage = false; | |
|     } | |
| 
 | |
|     window.frames.MSearchResults.location = resultsPageWithSearch; | |
|     var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); | |
| 
 | |
|     if (domPopupSearchResultsWindow.style.display!='block') | |
|     { | |
|        var domSearchBox = this.DOMSearchBox(); | |
|        this.DOMSearchClose().style.display = 'inline'; | |
|        if (this.insideFrame) | |
|        { | |
|          var domPopupSearchResults = this.DOMPopupSearchResults(); | |
|          domPopupSearchResultsWindow.style.position = 'relative'; | |
|          domPopupSearchResultsWindow.style.display  = 'block'; | |
|          var width = document.body.clientWidth - 8; // the -8 is for IE :-( | |
|          domPopupSearchResultsWindow.style.width    = width + 'px'; | |
|          domPopupSearchResults.style.width          = width + 'px'; | |
|        } | |
|        else | |
|        { | |
|          var domPopupSearchResults = this.DOMPopupSearchResults(); | |
|          var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; | |
|          var top  = getYPos(domSearchBox) + 20;  // domSearchBox.offsetHeight + 1; | |
|          domPopupSearchResultsWindow.style.display = 'block'; | |
|          left -= domPopupSearchResults.offsetWidth; | |
|          domPopupSearchResultsWindow.style.top     = top  + 'px'; | |
|          domPopupSearchResultsWindow.style.left    = left + 'px'; | |
|        } | |
|     } | |
| 
 | |
|     this.lastSearchValue = searchValue; | |
|     this.lastResultsPage = resultsPage; | |
|   } | |
| 
 | |
|   // -------- 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'; | |
| 
 | |
|       var searchField = this.DOMSearchField(); | |
| 
 | |
|       if (searchField.value == this.searchLabel) // clear "Search" term upon entry | |
|       { | |
|         searchField.value = ''; | |
|         this.searchActive = true; | |
|       } | |
|     } | |
|     else if (!isActive) // directly remove the panel | |
|     { | |
|       this.DOMSearchBox().className = 'MSearchBoxInactive'; | |
|       this.DOMSearchField().value   = this.searchLabel; | |
|       this.searchActive             = false; | |
|       this.lastSearchValue          = '' | |
|       this.lastResultsPage          = ''; | |
|     } | |
|   } | |
| } | |
| 
 | |
| // ----------------------------------------------------------------------- | |
|  | |
| // The class that handles everything on the search results page. | |
| function SearchResults(name) | |
| { | |
|     // 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) | |
|     { | |
|       var parentElement = document.getElementById(id); | |
|       var element = parentElement.firstChild; | |
| 
 | |
|       while (element && element!=parentElement) | |
|       { | |
|         if (element.nodeName == 'DIV' && element.className == 'SRChildren') | |
|         { | |
|           return element; | |
|         } | |
| 
 | |
|         if (element.nodeName == '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) | |
|     { | |
|       var 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); | |
| 
 | |
|       var resultRows = document.getElementsByTagName("div"); | |
|       var matches = 0; | |
| 
 | |
|       var i = 0; | |
|       while (i < resultRows.length) | |
|       { | |
|         var row = resultRows.item(i); | |
|         if (row.className == "SRResult") | |
|         { | |
|           var 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) | |
|     { | |
|       var focusItem; | |
|       while (1) | |
|       { | |
|         var 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) | |
|     { | |
|       var focusItem; | |
|       while (1) | |
|       { | |
|         var 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) | |
|     { | |
|       var e  = (evt) ? evt : window.event; // for IE | |
|       if (e.keyCode==13) return true; | |
|       if (!this.ProcessKeys(e)) return false; | |
| 
 | |
|       if (this.lastKey==38) // Up | |
|       { | |
|         var newIndex = itemIndex-1; | |
|         var focusItem = this.NavPrev(newIndex); | |
|         if (focusItem) | |
|         { | |
|           var child = this.FindChildElement(focusItem.parentNode.parentNode.id); | |
|           if (child && child.style.display == 'block') // children visible | |
|           { | |
|             var n=0; | |
|             var tmpElem; | |
|             while (1) // 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 | |
|         { | |
|            parent.document.getElementById("MSearchField").focus(); | |
|         } | |
|       } | |
|       else if (this.lastKey==40) // Down | |
|       { | |
|         var newIndex = itemIndex+1; | |
|         var focusItem; | |
|         var item = document.getElementById('Item'+itemIndex); | |
|         var 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 | |
|       { | |
|         var item = document.getElementById('Item'+itemIndex); | |
|         var elem = this.FindChildElement(item.parentNode.parentNode.id); | |
|         if (elem) elem.style.display = 'block'; | |
|       } | |
|       else if (this.lastKey==37) // Left | |
|       { | |
|         var item = document.getElementById('Item'+itemIndex); | |
|         var elem = this.FindChildElement(item.parentNode.parentNode.id); | |
|         if (elem) elem.style.display = 'none'; | |
|       } | |
|       else if (this.lastKey==27) // Escape | |
|       { | |
|         parent.searchBox.CloseResultsWindow(); | |
|         parent.document.getElementById("MSearchField").focus(); | |
|       } | |
|       else if (this.lastKey==13) // Enter | |
|       { | |
|         return true; | |
|       } | |
|       return false; | |
|     } | |
| 
 | |
|     this.NavChild = function(evt,itemIndex,childIndex) | |
|     { | |
|       var 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) | |
|         { | |
|           var 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 | |
|       { | |
|         var newIndex = childIndex+1; | |
|         var 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 | |
|       { | |
|         parent.searchBox.CloseResultsWindow(); | |
|         parent.document.getElementById("MSearchField").focus(); | |
|       } | |
|       else if (this.lastKey==13) // Enter | |
|       { | |
|         return true; | |
|       } | |
|       return false; | |
|     } | |
| } | |
| 
 | |
| 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); | |
| } | |
| 
 | |
| function createResults() | |
| { | |
|   var results = document.getElementById("SRResults"); | |
|   for (var e=0; e<searchData.length; e++) | |
|   { | |
|     var id = searchData[e][0]; | |
|     var srResult = document.createElement('div'); | |
|     srResult.setAttribute('id','SR_'+id); | |
|     setClassAttr(srResult,'SRResult'); | |
|     var srEntry = document.createElement('div'); | |
|     setClassAttr(srEntry,'SREntry'); | |
|     var srLink = document.createElement('a'); | |
|     srLink.setAttribute('id','Item'+e); | |
|     setKeyActions(srLink,'return searchResults.Nav(event,'+e+')'); | |
|     setClassAttr(srLink,'SRSymbol'); | |
|     srLink.innerHTML = searchData[e][1][0]; | |
|     srEntry.appendChild(srLink); | |
|     if (searchData[e][1].length==2) // single result | |
|     { | |
|       srLink.setAttribute('href',searchData[e][1][1][0]); | |
|       if (searchData[e][1][1][1]) | |
|       { | |
|        srLink.setAttribute('target','_parent'); | |
|       } | |
|       var srScope = document.createElement('span'); | |
|       setClassAttr(srScope,'SRScope'); | |
|       srScope.innerHTML = searchData[e][1][1][2]; | |
|       srEntry.appendChild(srScope); | |
|     } | |
|     else // multiple results | |
|     { | |
|       srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); | |
|       var srChildren = document.createElement('div'); | |
|       setClassAttr(srChildren,'SRChildren'); | |
|       for (var c=0; c<searchData[e][1].length-1; c++) | |
|       { | |
|         var srChild = document.createElement('a'); | |
|         srChild.setAttribute('id','Item'+e+'_c'+c); | |
|         setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')'); | |
|         setClassAttr(srChild,'SRScope'); | |
|         srChild.setAttribute('href',searchData[e][1][c+1][0]); | |
|         if (searchData[e][1][c+1][1]) | |
|         { | |
|          srChild.setAttribute('target','_parent'); | |
|         } | |
|         srChild.innerHTML = searchData[e][1][c+1][2]; | |
|         srChildren.appendChild(srChild); | |
|       } | |
|       srEntry.appendChild(srChildren); | |
|     } | |
|     srResult.appendChild(srEntry); | |
|     results.appendChild(srResult); | |
|   } | |
| } | |
| 
 | |
| function init_search() | |
| { | |
|   var results = document.getElementById("MSearchSelectWindow"); | |
|   for (var key in indexSectionLabels) | |
|   { | |
|     var 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); | |
|   } | |
|   searchBox.OnSelectItem(0); | |
| } | |
| /* @license-end */
 | |
| 
 |