Diese JavaScript-Datei enthält den Java Serverpage-Code für die Suggest-Kommunikation mit FACT-Finder. Kopieren und speichern Sie die Datei unter dem Namen "ff_suggest.js" in Ihrem JS-Verzeichnis.
function FFSuggest() { var pRequest; var pLayer; var pDebug = false; var pInstanceName = ''; var pSearchURL = ''; var pQueryParamName = ''; var pFormname = ''; var pLayerName = ''; var pQueryInput; var pSuggest = new Array(); var pLastQuery; var pCurrentSelection = 0; var submitted = false; var pSuggestQueryClass = 'suggestTextQuery'; var pSuggestTypeClass = 'suggestTextType'; var pSuggestAmountClass = 'suggestTextAmount'; var pSuggestQueryTypedClass = 'suggestTextQueryTyped'; var pSuggestFooterClass = 'suggestFooter'; var pSuggestHeaderClass = 'suggestHeader'; var pSuggestRowClass = 'suggestRow'; var pSuggestHighlightClass = 'suggestHighlight'; this.init = function(searchURL, formname, queryParamName, divLayername, instanceName, debugMode, channelParamName, channel) { pSearchURL = searchURL; pFormname = formname; pQueryParamName = queryParamName; pChannelParamName = channelParamName; pChannel = channel; pLayerName = divLayername; pInstanceName = instanceName; pDebug = debugMode; if (pSearchURL == '') { if (pDebug) alert('no searchurl defined'); return null; } else if (pInstanceName == '') { if (pDebug) alert('no instancename defined'); return null; } else if (pFormname == '') { if (pDebug) alert('no formname defined'); return null; } else if (pQueryParamName == '') { if (pDebug) alert('no queryparamname defined'); return null; } else if (pLayerName == '') { if (pDebug) alert('need a layer for output'); } pQueryInput = document[pFormname][pQueryParamName]; pQueryInput.onkeyup = handleKeyPress; pQueryInput.onfocus = showLayer; pQueryInput.onblur = hideLayer; document[pFormname].onsubmit = handleSubmit; } function handleSubmit() { submitted = true; if (pSuggest[pCurrentSelection] != undefined) { document[pFormname][pQueryParamName].value = pSuggest[pCurrentSelection].split('###')[0]; if(document[pFormname]['queryFromSuggest'] != null){ document[pFormname]['queryFromSuggest'].value = true; } } } this.handleClick = function() { if (pSuggest[pCurrentSelection] != undefined) { document[pFormname][pQueryParamName].value = pSuggest[pCurrentSelection].split('###')[0]; if(document[pFormname]['queryFromSuggest'] != null){ document[pFormname]['queryFromSuggest'].value = true; } document[pFormname].submit(); } } this.handleMouseOver = function(pos) { var tblCell = getTableCell(pos); unmarkAll(); if (tblCell != null) { highlightSuggest(tblCell); pCurrentSelection = pos; } } this.handleMouseOut = function(pos) { var tblCell = getTableCell(pos); if (tblCell != null) { unmarkSuggest(tblCell); pCurrentSelection = -1 } } function handleKeyPress(evt) { evt = (evt) ? evt : ((event) ? event : null); var keyCode = evt.keyCode; if (keyCode == 38) { moveSelection('up') } else if (keyCode == 27) { hideLayer(); } else if (keyCode == 40) { moveSelection('down'); } else { if (pQueryInput.value == '') { hideLayer(); if (pLayer != null){ pLayer.innerHTML = ''; } return null; } if (pLastQuery != pQueryInput.value){ startAjax(); } pLastQuery = pQueryInput.value; } } function moveSelection(direction) { var pos = pCurrentSelection; if (direction == 'up'){ pos--; } else{ pos += 1; } if (pos < 0) { unmarkAll(); pQueryInput.focus(); pCurrentSelection = -1; } else { var tblCell = getTableCell(pos); if (tblCell != null) { unmarkAll(); highlightSuggest(tblCell); pCurrentSelection = pos; } } var query = pQueryInput.value; pQueryInput.value = ''; pQueryInput.focus(); pQueryInput.value = query; } function startAjax() { var query = pQueryInput.value; if(query.length > 50 ){ return; } var requestURL = pSearchURL +'?query='+ escape(query) +'&'+ pChannelParamName +'='+ pChannel; try { if( window.XMLHttpRequest ) { pRequest = new XMLHttpRequest(); } else if( window.ActiveXObject ) { pRequest = new ActiveXObject( "Microsoft.XMLHTTP" ); } else { if (pDebug) alert( 'no ajax connection' ); } pLayer = document.getElementById(pLayerName); if (pLayer != null) { if (query != '') { pRequest.open( "GET", requestURL, true ); pRequest.onreadystatechange = callbackAjax; pRequest.send( null ); } else { hideLayer(); } } else { if (pDebug) alert( 'no layer for output found' ); } } catch( ex ) { hideLayer(); if (ex == undefined) { if (pDebug) alert( 'Error: ' + ex.getmessage ); } else { if (pDebug) alert( 'Error: ' + ex ); } } } function hideLayer() { if (pLayer != null) { pLayer.style.display = 'none'; fireSuggestLayerHidden(); } } this.hideLayerOutsideCall = function() { if (pLayer != null) { pLayer.style.display = 'none'; fireSuggestLayerHidden(); } } function showLayer() { if (pLayer != null && pSuggest != null && pSuggest.length >= 1) { pLayer.style.display = 'block'; } } function callbackAjax() { if (submitted == false) { if (pRequest.readyState == 4) { if (pRequest.status != 200) { hideLayer(); if (pDebug) alert( 'Error (' + pRequest.status + '): ' + pRequest.statusText ); } else { handleResponse(pRequest.responseText); } } } } // calls the callback for "outside" listeners if the callback is implemented function fireSuggestCompleted(suggestLayerIsVisible) { if (typeof(onSuggestCompleted) == 'function') { onSuggestCompleted(suggestLayerIsVisible); } } // calls the callback for "outside" listeners if the callback is implemented function fireSuggestLayerHidden() { if (typeof(onSuggestLayerHidden) == 'function') { onSuggestLayerHidden(); } } function handleResponse(text) { pCurrentSelection = -1; pSuggest = new Array(); pSuggest = text.split('\n'); var outputText = '<table cellpadding="0" cellspacing="0" class="' + pLayerName + '" width="100%" border="0" onMouseDown="' + pInstanceName + '.handleClick();">'; outputText += '<tr class="'+pSuggestHeaderClass+'" ><td nowrap="nowrap" colspan="3">Vorschläge zu Ihrer Suche...</td></tr>'; var pNewSuggest = new Array(); for (var i = 0; i < pSuggest.length; i++) { var firstChar = pSuggest[i].charCodeAt(0); if (firstChar != 13 && firstChar != 10 && pSuggest[i].length >= 1) { pNewSuggest.push(pSuggest[i]); } } pSuggest = pNewSuggest; var query = pQueryInput.value; for (var i = 0; i < pSuggest.length; i++) { pSuggestParts = new Array(); pSuggestParts = pSuggest[i].split("###"); outputText += '<tr id="' + pLayerName + '_' + i + '" class="'+pSuggestRowClass+'" onMouseOver="' + pInstanceName + '.handleMouseOver(' + i + ');" onMouseOut="' + pInstanceName + '.handleMouseOut(' + i + ');">' +'<td nowrap="nowrap" class="'+ pSuggestQueryClass +'">' + pSuggestParts[0].replace(new RegExp("("+query+")","ig"),'<span class="'+pSuggestQueryTypedClass+'">$1</span>') + '</td>' +'<td nowrap="nowrap" class="'+ pSuggestTypeClass +'">' + pSuggestParts[2] + '</td>' +'<td nowrap="nowrap" class="'+ pSuggestAmountClass +'">' + pSuggestParts[1] + '</td>' +'</tr>'; } outputText += '<tr><td class="'+pSuggestFooterClass+'" colspan="3"> </td></tr></table>'; if (pSuggest.length >= 1) { showLayer(); pLayer.innerHTML = outputText; // calback for "outside" listeners fireSuggestCompleted(true); } else { hideLayer(); pLayer.innerHTML = ''; // calback for "outside" listeners fireSuggestCompleted(false); } } function highlightSuggest(tblCell) { tblCell.className = pSuggestHighlightClass; } function unmarkSuggest(tblCell) { tblCell.className = pSuggestRowClass; } function unmarkAll() { var tblCell; for (var i = 0; i < pSuggest.length; i++) { tblCell = getTableCell(i); if (tblCell != null) { unmarkSuggest(tblCell); } } } function getTableCell(pos) { var tblCell; tblCell = document.getElementById(pLayerName + '_' + pos); return tblCell; } }