adamstark@23: // Search script generated by doxygen adamstark@23: // Copyright (C) 2009 by Dimitri van Heesch. adamstark@23: adamstark@23: // The code in this file is loosly based on main.js, part of Natural Docs, adamstark@23: // which is Copyright (C) 2003-2008 Greg Valure adamstark@23: // Natural Docs is licensed under the GPL. adamstark@23: adamstark@23: var indexSectionsWithContent = adamstark@23: { adamstark@28: 0: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011101101000001100101010000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", adamstark@23: 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", adamstark@23: 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", adamstark@28: 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011101101000001100101000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", adamstark@24: 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", adamstark@24: 5: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" adamstark@23: }; adamstark@23: adamstark@23: var indexSectionNames = adamstark@23: { adamstark@23: 0: "all", adamstark@23: 1: "classes", adamstark@23: 2: "files", adamstark@23: 3: "functions", adamstark@24: 4: "enums", adamstark@24: 5: "pages" adamstark@23: }; adamstark@23: adamstark@23: function convertToId(search) adamstark@23: { adamstark@23: var result = ''; adamstark@23: for (i=0;i do a search adamstark@23: { adamstark@23: this.Search(); adamstark@23: } adamstark@23: } adamstark@23: adamstark@23: this.OnSearchSelectKey = function(evt) adamstark@23: { adamstark@23: var e = (evt) ? evt : window.event; // for IE adamstark@23: if (e.keyCode==40 && this.searchIndex0) // Up adamstark@23: { adamstark@23: this.searchIndex--; adamstark@23: this.OnSelectItem(this.searchIndex); adamstark@23: } adamstark@23: else if (e.keyCode==13 || e.keyCode==27) adamstark@23: { adamstark@23: this.OnSelectItem(this.searchIndex); adamstark@23: this.CloseSelectionWindow(); adamstark@23: this.DOMSearchField().focus(); adamstark@23: } adamstark@23: return false; adamstark@23: } adamstark@23: adamstark@23: // --------- Actions adamstark@23: adamstark@23: // Closes the results window. adamstark@23: this.CloseResultsWindow = function() adamstark@23: { adamstark@23: this.DOMPopupSearchResultsWindow().style.display = 'none'; adamstark@23: this.DOMSearchClose().style.display = 'none'; adamstark@23: this.Activate(false); adamstark@23: } adamstark@23: adamstark@23: this.CloseSelectionWindow = function() adamstark@23: { adamstark@23: this.DOMSearchSelectWindow().style.display = 'none'; adamstark@23: } adamstark@23: adamstark@23: // Performs a search. adamstark@23: this.Search = function() adamstark@23: { adamstark@23: this.keyTimeout = 0; adamstark@23: adamstark@23: // strip leading whitespace adamstark@23: var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); adamstark@23: adamstark@23: var code = searchValue.toLowerCase().charCodeAt(0); adamstark@23: var hexCode; adamstark@23: if (code<16) adamstark@23: { adamstark@23: hexCode="0"+code.toString(16); adamstark@23: } adamstark@23: else adamstark@23: { adamstark@23: hexCode=code.toString(16); adamstark@23: } adamstark@23: adamstark@23: var resultsPage; adamstark@23: var resultsPageWithSearch; adamstark@23: var hasResultsPage; adamstark@23: adamstark@23: if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1') adamstark@23: { adamstark@23: resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; adamstark@23: resultsPageWithSearch = resultsPage+'?'+escape(searchValue); adamstark@23: hasResultsPage = true; adamstark@23: } adamstark@23: else // nothing available for this search term adamstark@23: { adamstark@23: resultsPage = this.resultsPath + '/nomatches.html'; adamstark@23: resultsPageWithSearch = resultsPage; adamstark@23: hasResultsPage = false; adamstark@23: } adamstark@23: adamstark@23: window.frames.MSearchResults.location = resultsPageWithSearch; adamstark@23: var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); adamstark@23: adamstark@23: if (domPopupSearchResultsWindow.style.display!='block') adamstark@23: { adamstark@23: var domSearchBox = this.DOMSearchBox(); adamstark@23: this.DOMSearchClose().style.display = 'inline'; adamstark@23: if (this.insideFrame) adamstark@23: { adamstark@23: var domPopupSearchResults = this.DOMPopupSearchResults(); adamstark@23: domPopupSearchResultsWindow.style.position = 'relative'; adamstark@23: domPopupSearchResultsWindow.style.display = 'block'; adamstark@23: var width = document.body.clientWidth - 8; // the -8 is for IE :-( adamstark@23: domPopupSearchResultsWindow.style.width = width + 'px'; adamstark@23: domPopupSearchResults.style.width = width + 'px'; adamstark@23: } adamstark@23: else adamstark@23: { adamstark@23: var domPopupSearchResults = this.DOMPopupSearchResults(); adamstark@23: var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; adamstark@23: var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; adamstark@23: domPopupSearchResultsWindow.style.display = 'block'; adamstark@23: left -= domPopupSearchResults.offsetWidth; adamstark@23: domPopupSearchResultsWindow.style.top = top + 'px'; adamstark@23: domPopupSearchResultsWindow.style.left = left + 'px'; adamstark@23: } adamstark@23: } adamstark@23: adamstark@23: this.lastSearchValue = searchValue; adamstark@23: this.lastResultsPage = resultsPage; adamstark@23: } adamstark@23: adamstark@23: // -------- Activation Functions adamstark@23: adamstark@23: // Activates or deactivates the search panel, resetting things to adamstark@23: // their default values if necessary. adamstark@23: this.Activate = function(isActive) adamstark@23: { adamstark@23: if (isActive || // open it adamstark@23: this.DOMPopupSearchResultsWindow().style.display == 'block' adamstark@23: ) adamstark@23: { adamstark@23: this.DOMSearchBox().className = 'MSearchBoxActive'; adamstark@23: adamstark@23: var searchField = this.DOMSearchField(); adamstark@23: adamstark@23: if (searchField.value == this.searchLabel) // clear "Search" term upon entry adamstark@23: { adamstark@23: searchField.value = ''; adamstark@23: this.searchActive = true; adamstark@23: } adamstark@23: } adamstark@23: else if (!isActive) // directly remove the panel adamstark@23: { adamstark@23: this.DOMSearchBox().className = 'MSearchBoxInactive'; adamstark@23: this.DOMSearchField().value = this.searchLabel; adamstark@23: this.searchActive = false; adamstark@23: this.lastSearchValue = '' adamstark@23: this.lastResultsPage = ''; adamstark@23: } adamstark@23: } adamstark@23: } adamstark@23: adamstark@23: // ----------------------------------------------------------------------- adamstark@23: adamstark@23: // The class that handles everything on the search results page. adamstark@23: function SearchResults(name) adamstark@23: { adamstark@23: // The number of matches from the last run of . adamstark@23: this.lastMatchCount = 0; adamstark@23: this.lastKey = 0; adamstark@23: this.repeatOn = false; adamstark@23: adamstark@23: // Toggles the visibility of the passed element ID. adamstark@23: this.FindChildElement = function(id) adamstark@23: { adamstark@23: var parentElement = document.getElementById(id); adamstark@23: var element = parentElement.firstChild; adamstark@23: adamstark@23: while (element && element!=parentElement) adamstark@23: { adamstark@23: if (element.nodeName == 'DIV' && element.className == 'SRChildren') adamstark@23: { adamstark@23: return element; adamstark@23: } adamstark@23: adamstark@23: if (element.nodeName == 'DIV' && element.hasChildNodes()) adamstark@23: { adamstark@23: element = element.firstChild; adamstark@23: } adamstark@23: else if (element.nextSibling) adamstark@23: { adamstark@23: element = element.nextSibling; adamstark@23: } adamstark@23: else adamstark@23: { adamstark@23: do adamstark@23: { adamstark@23: element = element.parentNode; adamstark@23: } adamstark@23: while (element && element!=parentElement && !element.nextSibling); adamstark@23: adamstark@23: if (element && element!=parentElement) adamstark@23: { adamstark@23: element = element.nextSibling; adamstark@23: } adamstark@23: } adamstark@23: } adamstark@23: } adamstark@23: adamstark@23: this.Toggle = function(id) adamstark@23: { adamstark@23: var element = this.FindChildElement(id); adamstark@23: if (element) adamstark@23: { adamstark@23: if (element.style.display == 'block') adamstark@23: { adamstark@23: element.style.display = 'none'; adamstark@23: } adamstark@23: else adamstark@23: { adamstark@23: element.style.display = 'block'; adamstark@23: } adamstark@23: } adamstark@23: } adamstark@23: adamstark@23: // Searches for the passed string. If there is no parameter, adamstark@23: // it takes it from the URL query. adamstark@23: // adamstark@23: // Always returns true, since other documents may try to call it adamstark@23: // and that may or may not be possible. adamstark@23: this.Search = function(search) adamstark@23: { adamstark@23: if (!search) // get search word from URL adamstark@23: { adamstark@23: search = window.location.search; adamstark@23: search = search.substring(1); // Remove the leading '?' adamstark@23: search = unescape(search); adamstark@23: } adamstark@23: adamstark@23: search = search.replace(/^ +/, ""); // strip leading spaces adamstark@23: search = search.replace(/ +$/, ""); // strip trailing spaces adamstark@23: search = search.toLowerCase(); adamstark@23: search = convertToId(search); adamstark@23: adamstark@23: var resultRows = document.getElementsByTagName("div"); adamstark@23: var matches = 0; adamstark@23: adamstark@23: var i = 0; adamstark@23: while (i < resultRows.length) adamstark@23: { adamstark@23: var row = resultRows.item(i); adamstark@23: if (row.className == "SRResult") adamstark@23: { adamstark@23: var rowMatchName = row.id.toLowerCase(); adamstark@23: rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' adamstark@23: adamstark@23: if (search.length<=rowMatchName.length && adamstark@23: rowMatchName.substr(0, search.length)==search) adamstark@23: { adamstark@23: row.style.display = 'block'; adamstark@23: matches++; adamstark@23: } adamstark@23: else adamstark@23: { adamstark@23: row.style.display = 'none'; adamstark@23: } adamstark@23: } adamstark@23: i++; adamstark@23: } adamstark@23: document.getElementById("Searching").style.display='none'; adamstark@23: if (matches == 0) // no results adamstark@23: { adamstark@23: document.getElementById("NoMatches").style.display='block'; adamstark@23: } adamstark@23: else // at least one result adamstark@23: { adamstark@23: document.getElementById("NoMatches").style.display='none'; adamstark@23: } adamstark@23: this.lastMatchCount = matches; adamstark@23: return true; adamstark@23: } adamstark@23: adamstark@23: // return the first item with index index or higher that is visible adamstark@23: this.NavNext = function(index) adamstark@23: { adamstark@23: var focusItem; adamstark@23: while (1) adamstark@23: { adamstark@23: var focusName = 'Item'+index; adamstark@23: focusItem = document.getElementById(focusName); adamstark@23: if (focusItem && focusItem.parentNode.parentNode.style.display=='block') adamstark@23: { adamstark@23: break; adamstark@23: } adamstark@23: else if (!focusItem) // last element adamstark@23: { adamstark@23: break; adamstark@23: } adamstark@23: focusItem=null; adamstark@23: index++; adamstark@23: } adamstark@23: return focusItem; adamstark@23: } adamstark@23: adamstark@23: this.NavPrev = function(index) adamstark@23: { adamstark@23: var focusItem; adamstark@23: while (1) adamstark@23: { adamstark@23: var focusName = 'Item'+index; adamstark@23: focusItem = document.getElementById(focusName); adamstark@23: if (focusItem && focusItem.parentNode.parentNode.style.display=='block') adamstark@23: { adamstark@23: break; adamstark@23: } adamstark@23: else if (!focusItem) // last element adamstark@23: { adamstark@23: break; adamstark@23: } adamstark@23: focusItem=null; adamstark@23: index--; adamstark@23: } adamstark@23: return focusItem; adamstark@23: } adamstark@23: adamstark@23: this.ProcessKeys = function(e) adamstark@23: { adamstark@23: if (e.type == "keydown") adamstark@23: { adamstark@23: this.repeatOn = false; adamstark@23: this.lastKey = e.keyCode; adamstark@23: } adamstark@23: else if (e.type == "keypress") adamstark@23: { adamstark@23: if (!this.repeatOn) adamstark@23: { adamstark@23: if (this.lastKey) this.repeatOn = true; adamstark@23: return false; // ignore first keypress after keydown adamstark@23: } adamstark@23: } adamstark@23: else if (e.type == "keyup") adamstark@23: { adamstark@23: this.lastKey = 0; adamstark@23: this.repeatOn = false; adamstark@23: } adamstark@23: return this.lastKey!=0; adamstark@23: } adamstark@23: adamstark@23: this.Nav = function(evt,itemIndex) adamstark@23: { adamstark@23: var e = (evt) ? evt : window.event; // for IE adamstark@23: if (e.keyCode==13) return true; adamstark@23: if (!this.ProcessKeys(e)) return false; adamstark@23: adamstark@23: if (this.lastKey==38) // Up adamstark@23: { adamstark@23: var newIndex = itemIndex-1; adamstark@23: var focusItem = this.NavPrev(newIndex); adamstark@23: if (focusItem) adamstark@23: { adamstark@23: var child = this.FindChildElement(focusItem.parentNode.parentNode.id); adamstark@23: if (child && child.style.display == 'block') // children visible adamstark@23: { adamstark@23: var n=0; adamstark@23: var tmpElem; adamstark@23: while (1) // search for last child adamstark@23: { adamstark@23: tmpElem = document.getElementById('Item'+newIndex+'_c'+n); adamstark@23: if (tmpElem) adamstark@23: { adamstark@23: focusItem = tmpElem; adamstark@23: } adamstark@23: else // found it! adamstark@23: { adamstark@23: break; adamstark@23: } adamstark@23: n++; adamstark@23: } adamstark@23: } adamstark@23: } adamstark@23: if (focusItem) adamstark@23: { adamstark@23: focusItem.focus(); adamstark@23: } adamstark@23: else // return focus to search field adamstark@23: { adamstark@23: parent.document.getElementById("MSearchField").focus(); adamstark@23: } adamstark@23: } adamstark@23: else if (this.lastKey==40) // Down adamstark@23: { adamstark@23: var newIndex = itemIndex+1; adamstark@23: var focusItem; adamstark@23: var item = document.getElementById('Item'+itemIndex); adamstark@23: var elem = this.FindChildElement(item.parentNode.parentNode.id); adamstark@23: if (elem && elem.style.display == 'block') // children visible adamstark@23: { adamstark@23: focusItem = document.getElementById('Item'+itemIndex+'_c0'); adamstark@23: } adamstark@23: if (!focusItem) focusItem = this.NavNext(newIndex); adamstark@23: if (focusItem) focusItem.focus(); adamstark@23: } adamstark@23: else if (this.lastKey==39) // Right adamstark@23: { adamstark@23: var item = document.getElementById('Item'+itemIndex); adamstark@23: var elem = this.FindChildElement(item.parentNode.parentNode.id); adamstark@23: if (elem) elem.style.display = 'block'; adamstark@23: } adamstark@23: else if (this.lastKey==37) // Left adamstark@23: { adamstark@23: var item = document.getElementById('Item'+itemIndex); adamstark@23: var elem = this.FindChildElement(item.parentNode.parentNode.id); adamstark@23: if (elem) elem.style.display = 'none'; adamstark@23: } adamstark@23: else if (this.lastKey==27) // Escape adamstark@23: { adamstark@23: parent.searchBox.CloseResultsWindow(); adamstark@23: parent.document.getElementById("MSearchField").focus(); adamstark@23: } adamstark@23: else if (this.lastKey==13) // Enter adamstark@23: { adamstark@23: return true; adamstark@23: } adamstark@23: return false; adamstark@23: } adamstark@23: adamstark@23: this.NavChild = function(evt,itemIndex,childIndex) adamstark@23: { adamstark@23: var e = (evt) ? evt : window.event; // for IE adamstark@23: if (e.keyCode==13) return true; adamstark@23: if (!this.ProcessKeys(e)) return false; adamstark@23: adamstark@23: if (this.lastKey==38) // Up adamstark@23: { adamstark@23: if (childIndex>0) adamstark@23: { adamstark@23: var newIndex = childIndex-1; adamstark@23: document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); adamstark@23: } adamstark@23: else // already at first child, jump to parent adamstark@23: { adamstark@23: document.getElementById('Item'+itemIndex).focus(); adamstark@23: } adamstark@23: } adamstark@23: else if (this.lastKey==40) // Down adamstark@23: { adamstark@23: var newIndex = childIndex+1; adamstark@23: var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); adamstark@23: if (!elem) // last child, jump to parent next parent adamstark@23: { adamstark@23: elem = this.NavNext(itemIndex+1); adamstark@23: } adamstark@23: if (elem) adamstark@23: { adamstark@23: elem.focus(); adamstark@23: } adamstark@23: } adamstark@23: else if (this.lastKey==27) // Escape adamstark@23: { adamstark@23: parent.searchBox.CloseResultsWindow(); adamstark@23: parent.document.getElementById("MSearchField").focus(); adamstark@23: } adamstark@23: else if (this.lastKey==13) // Enter adamstark@23: { adamstark@23: return true; adamstark@23: } adamstark@23: return false; adamstark@23: } adamstark@23: } adamstark@23: adamstark@23: function setKeyActions(elem,action) adamstark@23: { adamstark@23: elem.setAttribute('onkeydown',action); adamstark@23: elem.setAttribute('onkeypress',action); adamstark@23: elem.setAttribute('onkeyup',action); adamstark@23: } adamstark@23: adamstark@23: function setClassAttr(elem,attr) adamstark@23: { adamstark@23: elem.setAttribute('class',attr); adamstark@23: elem.setAttribute('className',attr); adamstark@23: } adamstark@23: adamstark@23: function createResults() adamstark@23: { adamstark@23: var results = document.getElementById("SRResults"); adamstark@23: for (var e=0; e