var getFunctionsUrl = "suggest.php?keyword=";
var PhpHelpUrl="http://www.php.net/manual/en/function.";
var httpRequestKeyword = "";
var userKeyword = "";
var suggestions = 0;
var suggestionMaxLength = 10;
var isKeyUpDownPressed = false;
var autocompletedKeyword = "";
var hasResults = false;
var timeoutId = -1;
var position = -1;
var oCache = new Object();
var minVisiblePosition = 0;
var maxVisiblePosition = 9;
var debugMode = true;
var xmlHttpGetSuggestions = createXmlHttpRequestObject();
window.onload = init;
function createXmlHttpRequestObject()
{
var xmlHttp;
try
{
xmlHttp = new XMLHttpRequest();
}
catch(e)
{
var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP");
for (var i=0; i < XmlHttpVersions.length && !xmlHttp; i++)
{
try
{
xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
}
catch (e) {}
}
}
if (!xmlHttp)
alert ("Errore durante la creazione dell'oggetto XMLHttpRequest.");
else
return xmlHttp;
}
function init()
{
var oKeyword = document.getElementById("keyword");
oKeyword.setAttribute("autocomplete", "off");
oKeyword.value = "";
oKeyword.focus();
setTimeout("checkForChanges()", 500);
}
function addToCache(keyword, values)
{
oCache[keyword] = new Array();
for (i=0; i<values.length; i++)
oCache[keyword][i] = values[i];
}
function checkCache(keyword)
{
if (oCache[keyword])
return true;
for (i=keyword.length-2; i>=0; i--)
{
var currentKeyword = keyword.substring(0, i+1);
if (oCache[currentKeyword])
{
var cacheResults = oCache[currentKeyword];
var keywordResults = new Array();
var keywordResultsSize = 0;
for (j=0; j<cacheResults.length; j++)
{
if (cacheResults[j].indexOf(keyword) == 0)
keywordResults[keywordResultsSize++] = cacheResults[j];
}
addToCache(keyword, keywordResults);
return true;
}
}
return false;
}
function getSuggestions(keyword)
{
if (keyword != "" && !isKeyUpDownPressed)
{
isInCache = checkCache(keyword);
if (isInCache == true)
{
httpRequestKeyword=keyword;
userKeyword=keyword;
displayResults(keyword, oCache[keyword]);
}
else
{
if(xmlHttpGetSuggestions)
{
try
{
if (xmlHttpGetSuggestions.readyState == 4 || xmlHttpGetSuggestions.readyState == 0)
{
httpRequestKeyword = keyword;
userKeyword = keyword;
xmlHttpGetSuggestions.open("GET", getFunctionsUrl + encode(keyword), true);
xmlHttpGetSuggestions.onreadystatechange = handleGettingSuggestions;
xmlHttpGetSuggestions.send(null);
}
else
{
userKeyword = keyword;
if(timeoutId != -1)
clearTimeout(timeoutId);
timeoutId = setTimeout("getSuggestions(userKeyword)", 500);
}
}
catch(e)
{
displayError("Impossibile collegarsi al server:\n" + e.toString());
}
}
}
}
}
function xmlToArray(resultsXml)
{
var resultsArray = new Array();
for (i=0; i<resultsXml.length; i++)
resultsArray[i] = resultsXml.item(i).firstChild.data;
return resultsArray;
}
function handleGettingSuggestions()
{
if (xmlHttpGetSuggestions.readyState == 4)
{
if (xmlHttpGetSuggestions.status == 200)
{
try
{
updateSuggestions();
}
catch(e)
{
displayError(e.toString());
}
}
else
{
displayError("C'è stato un problema nel recupero dei dati:\n" + xmlHttpGetSuggestions.statusText);
}
}
}
function updateSuggestions()
{
var response = xmlHttpGetSuggestions.responseText;
if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0)
throw(response.length == 0 ? "void server response." : response);
response = xmlHttpGetSuggestions.responseXML.documentElement;
nameArray = new Array();
if(response.childNodes.length)
{
nameArray = xmlToArray(response.getElementsByTagName("name"));
}
if(httpRequestKeyword == userKeyword)
{
displayResults(httpRequestKeyword, nameArray);
}
else
{
addToCache(httpRequestKeyword, nameArray);
}
}
function displayResults(keyword, results_array)
{
var div = "<table>";
if (!oCache[keyword] && keyword)
addToCache(keyword, results_array);
if (results_array.length == 0)
{
div += "<tr><td>Nessun risultato per
" + keyword + "</td></tr>";
hasResults = false;
suggestions = 0;
}
else
{
position = -1;
isKeyUpDownPressed = false;
hasResults = true;
suggestions = oCache[keyword].length;
for (var i=0; i<oCache[keyword].length; i++)
{
crtFunction = oCache[keyword][i];
crtFunctionLink = crtFunction;
while(crtFunctionLink.indexOf("_") !=-1)
crtFunctionLink = crtFunctionLink.replace("_","-");
div += "<tr id='tr" + i + "' onclick='location.href=document.getElementById(\"a " + i + "\").href;' onmouseover='handleOnMouseOver(this);' " + "onmouseout='handleOnMouseOut(this);'>" + "<td align='left'><a id='a" + i + "'href='" + phpHelpUrl + crtFunctionLink + ".php";
if(crtFunction.length <= suggestionMaxLength)
{
div += "'>
" + crtFunction.substring(0, httpRequestKeyword.length) + ""
div += crtFunction.substring(httpRequestKeyword.length, crtFunction.length) + "</a></td></tr>";
}
else
{
if(httpRequestKeyword.length < suggestionMaxLength)
{
div += "'>
" + crtFunction.substring(0, httpRequestKeyword.length) + ""
div += crtFunction.substring(httpRequestKeyword.length, suggestionMaxLength) + "</a></td></tr>";
}
else
{
div += "'>
" + crtFunction.substring(0, suggestionMaxLength) + "</td></tr>";
}
}
}
}
div += "</table>";
var oSuggest = document.getElementById("suggest");
var oScroll = document.getElementById("scroll");
oScroll.scrollTop = 0;
oSuggest.innerHTML = div;
oScroll.style.visibility = "visible";
if (results_array.length > 0)
autocompleteKeyword();
}
function checkForChanges()
{
var keyword = document.getElementById("keyword").value;
if(keyword == "")
{
hideSuggestions();
userKeyword = "";
httpRequestKeyword="";
}
setTimeout("checkForChanges()", 500);
if((userKeyword != keyword) && (autocompletedKeyword != keyword) && (!isKeyUpDownPressed))
getSuggestions(keyword);
}
function handleKeyUp(e)
{
e = (!e) ? window.event : e;
target = (!e.target) ? e.srcElement : e.target;
if (target.nodeType == 3)
target = target.parentNode;
code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
if (e.type == "keyup")
{
isKeyUpDownPressed = false;
if ((code < 13 && code != 8) || (code >= 14 && code < 32) || (code >= 33 && code <= 46 && code != 38 && code != 40) || (code >= 112 && code <= 123))
{
}
else
if (code == 13)
{
if (position >= 0)
{
location.href = document.getElementById("a" + position).href;
}
}
else
if (code == 40)
{
newTR=document.getElementById("tr" + (++position));
oldTR=document.getElementById("tr" + (--position));
if (position >= 0 && position < suggestions-1)
oldTR.className = "";
if (position < suggestions - 1)
{
newTR.className = "highlightrow";
updateKeywordValue(newTR);
position++;
}
e.cancelBubble = true;
e.returnValue = false;
isKeyUpDownPressed = true;
if (position > maxVisiblePosition)
{
oScroll = document.getElementById("scroll");
oScroll.scrollTop += 18;
maxVisiblePosition += 1;
minVisiblePosition += 1;
}
}
else
if (code == 38)
{
newTR=document.getElementById("tr" + (--position));
oldTR=document.getElementById("tr" + (++position));
if (position >= 0 && position <= suggestions - 1)
{
oldTR.className = "";
}
if (position > 0)
{
newTR.className = "highlightrow";
updateKeywordValue(newTR);
position--;
if (position < minVisiblePosition)
{
oScroll = document.getElementById("scroll");
oScroll.scrollTop -= 18;
maxVisiblePosition -= 1;
minVisiblePosition -= 1;
}
}
else
if (position == 0)
position--;
e.cancelBubble = true;
e.returnValue = false;
isKeyUpDownPressed = true;
}
}
}
function updateKeywordValue(oTr)
{
var oKeyword = document.getElementById("keyword");
var crtLink = document.getElementById("a" + oTr.id.substring(2,oTr.id.length)).toString();
crtLink = crtLink.replace("-", "_");
crtLink = crtLink.substring(0, crtLink.length - 4);
oKeyword.value = unescape(crtLink.substring(phpHelpUrl.length.crtLi nk.length));
}
function deselectAll()
{
for (i=0; i < suggestions; i++)
{
var oCrtTr = document.getElementById("tr" + i);
oCrtTr.className = "";
}
}
function handleOnMouseOver(oTr)
{
deselctAll();
oTr.className = "highlightrow";
position = oTr.id.substring(2, oTr.id.length);
}
function handleOnMouseOut(oTr)
{
oTr.className = "";
position = -1;
}
function encode(uri)
{
if (encodeURIComponent)
{
return encodeURIComponent(uri);
}
if (escape)
{
return escape(uri);
}
}
function hideSuggestions()
{
var oScroll = document.getElementById("scroll");
oScroll.style.visibility = "hidden";
}
function selectRange(oText, start, length)
{
if (oText.createTextRange)
{
var oRange = oText.createTextRange();
oRange.moveStart("character", start);
oRange.moveEnd("character", length - oText.value.length);
oRange.select();
}
else
if (oText.setSelectionRange)
{
oText.setSelectionRange(start, length);
}
oText.focus();
}
function autocompleteKeyword()
{
var oKeyword = document.getElementById("keyword");
position = 0;
deselectAll();
document.getElementById("trO").className="highligh trow";
updateKeywordValue(document.getElementById("trO")) ;
selectRange(oKeyword.httpRequestKeyword.length.oKe yword.value.length);
autocompletedKeyword=oKeyword.value;
}
function displayError(message)
{
alert("Errore durante l'accesso al server! " + (debugMode ? "\n" + message : ""));
}