792 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			792 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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);
 | |
| }
 | |
| 
 | 
