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