(function($) {
    $.fn.yallaAutocomplete = function (options) {
        var defaults = {
            minimumChars: 4,
            ajaxUrl: '',
            moreArguments: ''
        };
        var options = $.extend(defaults,options);
        var autocompleteAjaxRequest;
        
        var autocompletebox = $(jQuery('<div style="position: absolute; z-index: 100; background-color: #FFF; border: 1px solid #74B1D8;" id="autocompletebox"></div>').css({
            'width': $(this).width(),
            'top': $(this).offset().top + $(this).outerHeight(),
            'left': $(this).offset().left
        }));
        
        $(this).keyup(function(event) {
            if (event.keyCode == 40) {
                if ($('#autocompletebox').length < 1) {
                    $(document).scrollTop($(document).scrollTop()+100);
                } else {
                    if ($('#autocompletebox li.search-highlight').length < 1) {
                        $('#autocompletebox ul li:first').addClass('search-highlight');
                    } else {
                        var nextObject = $('#autocompletebox ul li.search-highlight').next();
                        $('#autocompletebox ul li.search-highlight').removeClass('search-highlight');
                        nextObject.addClass('search-highlight');
                    }
                }
            } else if (event.keyCode == 38) {
                if ($('#autocompletebox').length < 1) {
                    $(document).scrollTop($(document).scrollTop()-100);
                } else {
                    if ($('#autocompletebox li.search-highlight').length < 1) {
                        $('#autocompletebox ul li:last').addClass('search-highlight');
                    } else {
                        var prevObject = $('#autocompletebox ul li.search-highlight').prev();
                        $('#autocompletebox ul li.search-highlight').removeClass('search-highlight');
                        prevObject.addClass('search-highlight');
                    }
                }
            } else if (event.keyCode == 13) {
                if ($('#autocompletebox li.search-highlight').length > 0) {
                    $('#autocompletebox li.search-highlight').mousedown();
                } else {
                    $(this).closest('form').submit();
                }
            } else {
                if ($(this).val().length >= options.minimumChars) {
                    var inputField = $(this);
                    
                    if (typeof( autocompleteAjaxRequest ) != 'undefined') {
                        autocompleteAjaxRequest.abort();
                    }
                    autocompleteAjaxRequest = $.post(options.ajaxUrl,$(this).closest('form').serialize(),function (data) {
                        if (data == '') {
                            $('#autocompletebox').remove()
                        } else {
                            if ($('#autocompletebox').length < 1) {
                                $('#autocompletebox').css({
                                    'width': inputField.width(),
                                    'top': inputField.offset().top + inputField.height(),
                                    'left': inputField.offset().left
                                });
                                
                                $('body').append(autocompletebox);
                            }
                            
                            $('#autocompletebox').html(data);
                            $('#autocompletebox ul li').mouseover(function () {
                                $('#autocompletebox ul li').removeClass('search-highlight');
                                $(this).addClass('search-highlight');
                            });
                            $('#autocompletebox ul li').mouseout(function () {
                                $(this).removeClass('search-highlight');
                            });
                        }
                    });
                } else {
                    $('#autocompletebox').remove();
                }
            }
        });
        
        $(this).blur(function() {
            setTimeout("$('#autocompletebox').remove()",250);
        });
    };
})(jQuery);
