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];createQueryFromSuggestField();}}
this.handleClick=function(){if(pSuggest[pCurrentSelection]!=undefined){document[pFormname][pQueryParamName].value=pSuggest[pCurrentSelection].split('###')[0];createQueryFromSuggestField();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+'?'+pQueryParamName+'='+encodeURIComponent(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';}}
FFSuggest.prototype.showLayer=showLayer;FFSuggest.prototype.hideLayer=hideLayer;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);}}}}
function fireSuggestCompleted(suggestLayerIsVisible){if(typeof(onSuggestCompleted)=='function'){onSuggestCompleted(suggestLayerIsVisible);}}
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 für ihre 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+='</table>';if(pSuggest.length>=1){showLayer();pLayer.innerHTML=outputText;fireSuggestCompleted(true);}else{hideLayer();pLayer.innerHTML='';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;}
function createQueryFromSuggestField(){var element=document.createElement('input');element.name='queryFromSuggest';element.type='hidden';element.value='true';document[pFormname].appendChild(element);}}
