
        
        
        
        
        
        

        function FFSuggest() {

            var pRequest;
            var pLayer;
            var pDebug = false;
            var pInstanceName = '';
            var pSearchURL = '';
            var pQueryParamName = '';
            var pFormname = '';
            var pLayerName = '';
            var pQueryInput;
            var pChannel;
            var pLanguage;
            var pAllLanguage = ['de','eng','es','fr','it'];
            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, language) {
                pSearchURL = searchURL;
                pFormname = formname;
                pQueryParamName = queryParamName;
                pChannelParamName = channelParamName;
                pChannel = channel;
                this.channel = pChannel;
                pLanguage = language;
                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;
                if (pLayer != undefined) {
                    pLayer.innerHTML = '';
                }
            }

            function handleSubmit() {
                submitted = true;
                if (pSuggest[pCurrentSelection] != undefined) {
                    document[pFormname][pQueryParamName].value = pSuggest[pCurrentSelection].split('###')[0];
                    if (document[pFormname]['suggestChannel'] != null) {
                        document[pFormname]['suggestChannel'].value = pChannel;
                        document[pFormname]['suggestTextType'].value = pSuggest[pCurrentSelection].split('###')[2];
                    }
                }
            }

            this.handleClick = function() {
                if (pSuggest[pCurrentSelection] != undefined) {
                    document[pFormname][pQueryParamName].value = pSuggest[pCurrentSelection].split('###')[0];
                    if (document[pFormname]['suggestChannel'] != null) {
                        document[pFormname]['suggestChannel'].value = pChannel;
                        document[pFormname]['suggestTextType'].value = pSuggest[pCurrentSelection].split('###')[2];
                    }
                    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 && pQueryInput.value.length < 2) {
                        hideLayer();
                        pLastQuery = '';
                        if (pLayer != null) {
                            pLayer.innerHTML = '';
                        }
                        pLastQuery = pQueryInput.value;
                        return null;
                    }
                    if (pQueryInput.value.length > 1 && pLastQuery != pQueryInput.value && isNaN(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.setRequestHeader('Content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
                            pRequest.setRequestHeader("Accept-Charset", "UTF-8");

                            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) {
                    showOrHideDropDowns('visible');
                    pLayer.style.display = 'none';
                    fireSuggestLayerHidden();
                }
            }

            this.hideLayerOutsideCall = function() {
                if (pLayer != null) {
                    showOrHideDropDowns('visible');
                    pLayer.style.display = 'none';
                    fireSuggestLayerHidden();
                }
            }

            function showLayer() {
                if (pLayer != null && pSuggest != null && pSuggest.length >= 1) {
                    showOrHideDropDowns('hidden');
                    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) {
                pLayer.innerHTML = '';
                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 += suggestHeader();

                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; pSuggest.length > i; 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 + '">' + suggestPart2Translation(pSuggestParts[2]) + '</td>'
                            + '<td nowrap="nowrap" class="' + pSuggestAmountClass + '">' + pSuggestParts[1] + '</td>'
                            + '</tr>';
                }
                outputText += '<tr><td class="' + pSuggestFooterClass + '" colspan="3">&nbsp;</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;
            }

            function suggestHeader() {
                var outputText = "";
                outputText += '<tr class="' + pSuggestHeaderClass + '" ><td nowrap="nowrap" colspan="3">';
                if (pLanguage == 'de') {
                    outputText += 'Vorschl&#228;ge';
                }
                else if (pLanguage == 'eng') {
                    outputText += 'Proposals';
                }
                else if (pLanguage == 'es') {
                        outputText += 'Propuestes';
                    }
                    else if (pLanguage == 'fr') {
                            outputText += 'Propositions';
                        }
                        else if (pLanguage == 'it') {
                                outputText += 'Proposte';
                            }

                outputText += '</td></tr>';
                return outputText;
            }

            function suggestPart2Translation(suggestPart) {

                var indiction = ['Krankheit','Illness','Enfermedad','Maladie','Malattia'];
                var substance = ['Wirkstoff','Substance','Principio activo','Princip actif','Principio attiva'];
                var manufacture = ['Hersteller','Manufacturer','Fabricante','Fabricant','Fabbricante'];
                var name = ['Name','Name','Nombre','Nom','Nome'];
                var articleGroup = ['Sortiment','Assortment','Surtido','Assortiment','Assortimento'];
                if (pChannel.split("_")[0] == 'main') {
                    if (suggestPart == 'Manufacturer') {
                        return translationSelectWordByLanguage(manufacture);
                    }
                    else if (suggestPart == 'Category') {
                        return translationSelectWordByLanguage(articleGroup);
                    }
                    else {
                        return translationSelectWordByLanguage(name);
                    }
                }
                else if (pChannel == 'substance') {
                    return translationSelectWordByLanguage(substance);
                }
                else {
                    return translationSelectWordByLanguage(indiction);
                }
            }

            function translationSelectWordByLanguage(list) {

                for (var i = 0; pAllLanguage.length > i; i++) {
                    if (pAllLanguage[i] == pLanguage) {
                        return list[i]
                    }
                }
                return ""
            }

            function showOrHideDropDowns(newState) {
                // ie 6 bug
                var element = document.getElementById('order');
                if (element) {
                    element.style.visibility = newState;
                }
                element = document.getElementById('manufacturer');
                if (element) {
                    element.style.visibility = newState;
                }
            }
        }




