function LomaxAutocomplete()
{
    var _searchScriptUrl;
    var _keypressDelay = 200;
    var _minLength = 2;
    var _maxLength = 50;

    var _timerObject;
    var _formObject;
    var _inputObject;
    var _htmlContenerObject;
    var _instanceName;

    var _lastRequest;
    var _cache = {};
    var _currentSelection = -1;
    var _answerArr = {};
    var _submited = false;
    
    var _defaultText = null;
            
    this.initialize = function(searchScriptUrl, formId, inputFormId, instanceName, htmlContenerId)
    {
        _instanceName = instanceName;
        _searchScriptUrl = searchScriptUrl;                        
        _formObject = $("#" + formId);
        _inputObject = $("#" + inputFormId);
        _htmlContenerObject = $("#" + htmlContenerId);

        $(_inputObject)
            .keyup( keyPressFunction )
            .focus( displayResults )
            .blur( hideResults )
            ;

        $(_inputObject)
            .focus( function () {
                if( $(_inputObject).hasClass('defaultText') && $(_inputObject).val() == _defaultText)
                {
                    $(_inputObject).val('');
                    $(_inputObject).removeClass('defaultText');
                }
                $(_inputObject).addClass('focused');
                if(_currentSelection == -2)
                {
                    _currentSelection = -1;
                    var phrase = $(_inputObject).val();
                    if(checkPhraseLength( phrase.length ))
                    {
                        _timerObject = setTimeout( _instanceName + ".timeoutTrigger( '" + phrase + "')", 10);
                    }
                }
            })
            .blur( function () 
            {
                if( $(_inputObject).val() == '' )
                {
                    $(_inputObject).val(_defaultText);
                    $(_inputObject).addClass('defaultText');
                }
                $(_inputObject).removeClass('focused');
            });

        $(_formObject).submit( formSubmit );
    }
    
//    this.showMeAgain = function()
//    {
//        displayResults();
//    }
    
    this.setDefaultText = function( text )
    {
        _defaultText = text;
    }

    function checkPhraseLength( length )
    {
        return length >= _minLength && length <= _maxLength;
    }

    function keyPressFunction(event)
    {
        if(_submited)
        {
            return;
        }
        switch(event.keyCode)
        {
            case 27:
                hideResults();
                //alert('escape');
                break;
            case 38:
            case 40:
                selectNeightboor(event.keyCode);
                break;
            case 39:
                if( _currentSelection > -1 )
                {
                    var parts = _answerArr[_currentSelection].split("###", 4);
                    if(parts[3].length > 0)
                    {
                        changeData('modalHolder', 'Book', 'showLomaxAutocompleteForm', parts[3], null, null);
                        $(_inputObject).blur();
                    }
                }
                break;
            default:
                clearTimeout(_timerObject);
                var phrase = $(_inputObject).val();
                if(phrase != _lastRequest)
                {
                    if(checkPhraseLength( phrase.length ))
                    {
                        if( phrase in _cache )
                        {
                            //wartość jest w cache - nie odpytujemy się
                            parseAnswer( _cache[ phrase ] );
                            _lastRequest = phrase;
                        }
                        else
                        {
                            _timerObject = setTimeout( _instanceName + ".timeoutTrigger( '" + phrase + "')", _keypressDelay);
                        }
                    }
                    else
                    {
                        hideResults();
                        _currentSelection = -1;
                        _answerArr = {};
                    }
                }
                break;
        }
    }
    
    this.timeoutTrigger = function( phrase )
    {
        _lastRequest = phrase;
        $.post(_searchScriptUrl, 
        {
            phrase : phrase,
            onlyAvailable : $("#lomax_onlyAvailable").attr("checked")
        }, function( answer ) 
        {
            _cache[ phrase ] = answer;
            parseAnswer( answer );
        });
    }

    function displayResults()
    {
        if( _answerArr.length > 0 && checkPhraseLength( _lastRequest.length ) )
        {
            $(_htmlContenerObject).css("display", "block");
        }
    }

    function hideResults()
    {
        $(_htmlContenerObject).css("display", "none");
    }

    function parseAnswer( answer )
    {
        _currentSelection = -1;
        
        if(answer.length == 0)
        {
            _answerArr = {};
            $(_htmlContenerObject).html( '' );
            hideResults();
            return;
        }
        
        _answerArr = answer.split("\n");

        var html = '<table class="lomaxTable" cellpadding="0" cellspacing="0" width="100%" border="0" onMouseDown="' + _instanceName + '.onClick();" >';
        html +=  '<tr class="lomaxTableHeader" ><td colspan="3" >Propozycje dla Twojego wyszukiwania...</td></tr>';
        
        var quantityCss;
        for ( i in _answerArr )
        {
            var parts = _answerArr[i].split("###", 5);
            if(parts[4] == 1)
            {
                quantityCss = 'available';
            }
            else
            {
                quantityCss = '';
            }
            html += '<tr class="lomaxTableRow ' + quantityCss + '" id="' + _instanceName + '_' + i + '" onMouseOver="'+ _instanceName + '.onMouseOver( this, ' + i + ');" onMouseOut="'+ _instanceName + '.onMouseOut( this );" >';
            html += '<td nowrap="nowrap" class="lomaxTextValue" >' + parts[3].replace(new RegExp("(" + _lastRequest + ")", "ig"),'<span class="lomaxTextPhrase" >$1</span>') +'</td>';
            html += '<td nowrap="nowrap" class="lomaxTextValue lomaxMaxValue" >' + parts[0].replace(new RegExp("(" + _lastRequest + ")", "ig"),'<span class="lomaxTextPhrase" >$1</span>') +'</td>';
            html += '<td nowrap="nowrap" class="lomaxTextType" >' + parts[1] + '</td>';
            html += '<td nowrap="nowrap" class="lomaxTextAmount" >' + parts[2] + '</td>';
            html += '</tr>';
        }

        displayResults();
        $(_htmlContenerObject).html( html );

    }

    this.onClick = function()
    {
        if(_currentSelection > -1 && _currentSelection in _answerArr)
        {
            $(_inputObject).val( _answerArr[_currentSelection].split("###")[0]);
            $(_formObject).submit();
        }
    }

    this.onMouseOver = function( el, i )
    {
        for( index in _answerArr)
        {
            $("#" + _instanceName + '_' + index).removeClass("highlight");
        }
        $(el).addClass("highlight");
        _currentSelection = i;
    }

    this.onMouseOut = function ( el )
    {
        $(el).removeClass("highlight");
        _currentSelection = -1;
    }

    function selectNeightboor( keyCode )
    {
        if( _currentSelection > -1 )
        {
            $("#" + _instanceName + "_" + _currentSelection).removeClass("highlight");
        }
        if( keyCode == 38 ) 
        {
            //up
            _currentSelection--;
        }
        else
        {
            //down
            _currentSelection++;
        }
        if( _currentSelection in _answerArr )
        {
            $("#" + _instanceName + "_" + _currentSelection).addClass("highlight");
        }
        else
        {
            _currentSelection = -1;
            if( _answerArr.length > 0)
            {
                if( keyCode == 38 )
                {
                    $( ).mouseover();
                    _currentSelection = _answerArr.length - 1;
                }
                else
                {
                    _currentSelection = 0;
                }
                $( "#" + _instanceName + "_" + _currentSelection ).addClass("highlight");
            }
        }
    }
    
    function formSubmit()
    {
        if( _currentSelection > -1 && _currentSelection in _answerArr )
        {
            $(_inputObject).val(_answerArr[_currentSelection].split("###")[0]);
            $(_formObject).append('<input type="hidden" name="ac" value="1" />');
        }
        _submited = true;
    }
    
    this.switchWorkingMode = function()
    {
        _currentSelection = -2;
        _answerArr = {};
        _cache = {};
    }

}
