/* URL to the PHP page called for receiving suggestions for a keyword*/ var getFunctionsUrl = "suggest.php?keyword="; /* URL for seeing the results for the selected suggestion */ var phpHelpUrl="https://www.voipon.co.uk/advanced_search_result.php?keywords="; /* the keyword for which an HTTP request has been initiated */ var httpRequestKeyword = ""; /* the last keyword for which suggests have been requested */ var userKeyword = ""; /* number of suggestions received as results for the keyword */ var suggestions = 0; /* the maximum number of characters to be displayed for a suggestion */ var suggestionMaxLength = 30; /* flag that indicates if the up or down arrow keys were pressed the last time a keyup event occurred */ var isKeyUpDownPressed = false; /* the last suggestion that has been used for autocompleting the keyword */ var autocompletedKeyword = ""; /* flag that indicates if there are results for the current requested keyword*/ var hasResults = false; /* the identifier used to cancel the evaluation with the clearTimeout method. */ var timeoutId = -1; /* the currently selected suggestion (by arrow keys or mouse)*/ var position = -1; /* cache object containing the retrieved suggestions for different keywords */ var oCache = new Object(); /* the minimum and maximum position of the visible suggestions */ var minVisiblePosition = 0; var maxVisiblePosition = 5; // when set to true, display detailed error messages var debugMode = false; /* the XMLHttp object for communicating with the server */ var xmlHttpGetSuggestions = createXmlHttpRequestObject(); /* the onload event is handled by our init function */ // creates an XMLHttpRequest instance function createXmlHttpRequestObject() { // will store the reference to the XMLHttpRequest object var xmlHttp; // this should work for all browsers except IE6 and older try { // try to create XMLHttpRequest object xmlHttp = new XMLHttpRequest(); } catch(e) { // assume IE6 or older var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"); // try every prog id until one works for (var i=0; i=0; i--) { // compute the current prefix keyword var currentKeyword = keyword.substring(0, i+1); // check to see if we have the current prefix keyword in the cache if(oCache[currentKeyword]) { // the current keyword's results already in the cache var cacheResults = oCache[currentKeyword]; // the results matching the keyword in the current cache results var keywordResults = new Array(); var keywordResultsSize = 0; // try to find all matching results starting with the current prefix for(j=0;j= 0) //== dibs keywordResults[keywordResultsSize++] = cacheResults[j]; } // add all the keyword's prefix results to the cache addToCache(keyword, keywordResults); return true; } } // no match found return false; } /* initiate HTTP request to retrieve suggestions for the current keyword */ function getSuggestions(keyword) { /* continue if keyword isn't null and the last pressed key wasn't up or down */ if(keyword != "" && !isKeyUpDownPressed) { // check to see if the keyword is in the cache isInCache = checkCache(keyword); // if keyword is in cache... if(isInCache == true) { // retrieve the results from the cache httpRequestKeyword=keyword; userKeyword=keyword; // display the results in the cache displayResults(keyword, oCache[keyword]); } // if the keyword isn't in cache, make an HTTP request else { if(xmlHttpGetSuggestions) { try { /* if the XMLHttpRequest object isn't busy with a previous request... */ if (xmlHttpGetSuggestions.readyState == 4 || xmlHttpGetSuggestions.readyState == 0) { httpRequestKeyword = keyword; userKeyword = keyword; xmlHttpGetSuggestions.open("GET", getFunctionsUrl + encode(keyword), true); xmlHttpGetSuggestions.onreadystatechange = handleGettingSuggestions; xmlHttpGetSuggestions.send(null); } // if the XMLHttpRequest object is busy... else { // retain the keyword the user wanted userKeyword = keyword; // clear any previous timeouts already set if(timeoutId != -1) clearTimeout(timeoutId); // try again in 0.5 seconds timeoutId = setTimeout("getSuggestions(userKeyword);", 500); } } catch(e) { displayError("Can't connect to server:\n" + e.toString()); } } } } } /* transforms all the children of an xml node into an array */ function xmlToArray(resultsXml) { // initiate the resultsArray var resultsArray= new Array(); // loop through all the xml nodes retrieving the content for(i=0;i= 0 || response.indexOf("error:") >= 0 || response.length == 0) throw(response.length == 0 ? "Void server response." : response); // retrieve the document element response = xmlHttpGetSuggestions.responseXML.documentElement; // initialize the new array of functions' names nameArray = new Array(); // check to see if we have any results for the searched keyword if(response.childNodes.length) { /* we retrieve the new functions' names from the document element as an array */ nameArray= xmlToArray(response.getElementsByTagName("name")); } // check to see if other keywords are already being searched for if(httpRequestKeyword == userKeyword) { // display the results array displayResults(httpRequestKeyword, nameArray); } else { // add the results to the cache // we don't need to display the results since they are no longer useful addToCache(httpRequestKeyword, nameArray); } } /* populates the list with the current suggestions */ function displayResults(keyword, results_array) { // start building the HTML table containing the results var div = ""; // if the searched for keyword is not in the cache then add it to the cache if(!oCache[keyword] && keyword) addToCache(keyword, results_array); // if the array of results is empty display a message if(results_array.length == 0) { // div += ""; // set the flag indicating that no results have been found // and reset the counter for results hasResults = false; suggestions = 0; } // display the results else { // resets the index of the currently selected suggestion // position = -1; // resets the flag indicating whether the up or down key has been pressed isKeyUpDownPressed = false; /* sets the flag indicating that there are results for the searched for keyword */ hasResults = true; // get the number of results from the cache suggestions = oCache[keyword].length; // loop through all the results and generate the HTML list of results for (var i=0; i" + ""; div += "'>" + (crtFunction.replace ( httpRequestKeyword.toUpperCase(), "" + httpRequestKeyword.toUpperCase() + "")) + ""; // EOF Search Suggest V2 Marcelon Brazil } else { // check to see if the length of the current keyword exceeds // the maximum number of characters that can be displayed if(httpRequestKeyword.length < suggestionMaxLength) { /* bold the matching prefix of the function name and that of the keyword */ // BOF Search Suggest V2 Marcelon Brazil // div += "'>" + // (crtFunction.substring(0, httpRequestKeyword.length)) + // "" // div += (crtFunction.substring(httpRequestKeyword.length, // suggestionMaxLength)) + // ""; div += "'>" + (crtFunction.replace ( httpRequestKeyword.toUpperCase(), "" + httpRequestKeyword.toUpperCase() + "")) + ""; // EOF Search Suggest V2 Marcelon Brazil } else { // bold the entire function name div += "'>" + crtFunction.substring(0,suggestionMaxLength) + "" } } } } // end building the HTML table div += "
No results found starting with " + keyword + // "
" + // (crtFunction.substring(0, httpRequestKeyword.length)) + // "" // div += (crtFunction.substring(httpRequestKeyword.length, // crtFunction.length)) + // "
"; // retrieve the suggest and scroll object var oSuggest = document.getElementById("suggest"); var oScroll = document.getElementById("scroll"); // scroll to the top of the list oScroll.scrollTop = 0; // update the suggestions list and make it visible oSuggest.innerHTML = div; oScroll.style.visibility = "visible"; // if we had results we apply the type ahead for the current keyword if(results_array.length > 0) autocompleteKeyword(); } /* function that periodically checks to see if the typed keyword has changed */ function checkForChanges() { // retrieve the keyword object var keyword = document.getElementById("keyword").value; // check to see if the keyword is empty if(keyword == "") { // hide the suggestions hideSuggestions(); // reset the keywords userKeyword=""; httpRequestKeyword=""; } // set the timer for a new check setTimeout("checkForChanges()", 500); // check to see if there are any changes if((userKeyword != keyword) && (autocompletedKeyword != keyword) && (!isKeyUpDownPressed)) // update the suggestions getSuggestions(keyword); } /* function that handles the keys that are pressed */ function handleKeyUp(e) { // get the event e = (!e) ? window.event : e; // get the event's target target = (!e.target) ? e.srcElement : e.target; if (target.nodeType == 3) target = target.parentNode; // get the character code of the pressed button code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0)); // check to see if the event was keyup if (e.type == "keyup") { isKeyUpDownPressed =false; // check to see we if are interested in the current character if ((code < 13 && code != 8) || (code >=14 && code < 32) || (code >= 33 && code <= 46 && code != 38 && code != 40) || (code >= 112 && code <= 123)) { // simply ignore non-interesting characters } else /* if Enter is pressed we jump to the PHP help page of the current function */ if(code == 13) { // check to see if any function is currently selected if(position>=0) { // location.href = document.getElementById("a" + position).href; } } else // if the down arrow is pressed we go to the next suggestion if(code == 40) { newTR=document.getElementById("tr"+(++position)); oldTR=document.getElementById("tr"+(--position)); // deselect the old selected suggestion if(position>=0 && position maxVisiblePosition) { oScroll = document.getElementById("scroll"); oScroll.scrollTop += 18; maxVisiblePosition += 1; minVisiblePosition += 1; } } else // if the up arrow is pressed we go to the previous suggestion if(code == 38) { newTR=document.getElementById("tr"+(--position)); oldTR=document.getElementById("tr"+(++position)); // deselect the old selected position if(position>=0 && position <= suggestions - 1) { oldTR.className = ""; } // select the new suggestion and update the keyword if(position > 0) { newTR.className = "moduleRowOver"; updateKeywordValue(newTR); position--; // scroll up if the current window is no longer valid if(position