(function($){
$( function() {
    var delayAfterKeypress = 800;
    var speedAfter = 10;
    var minChars = 4;
    var maxChars = 100;
    var timeout;
    var has_results = 1;
    var last_char_length = 0;
    
    $.minimum_matches_for_exact = 2;
    $.useExactMatch = 0; // 1 uses the hyperlink to product page 
    $.hoverItem = -1;

    function updateSelection() {
        listItems = $('#autoComplete ul').find('li');
        if ($.hoverItem < 0) {
            $.hoverItem = listItems.size() - 1;
        } else if ($.hoverItem >= listItems.size()) {
            $.hoverItem = 0;
        } else if ($.hoverItem == undefined) {
             $.hoverItem = 0;
        }
        $('#autoComplete ul').children('li').removeClass('hover');
        $('#autoComplete ul').children('li:eq('+$.hoverItem+')').addClass('hover');
    }

    function submitSelection( obj ) {
        if (obj.siblings().size() <= $.minimum_matches_for_exact ) {
            $.useExactMatch = 0; // turned off
        }
        var url;
        if ($.useExactMatch) {
            url = obj.find('a').attr('href');
            window.location = url;
        } else {
            var classes = obj.attr('class').split(' ');
            var selectedSearch_text = obj.text();
            if (obj.find('span').hasClass('has_format')) {
                var escape_col = new RegExp(":{1}[^:]*$", "g");
                selectedSearch_text = selectedSearch_text.replace(escape_col, '');
            }
            selectedSearch = selectedSearch_text;
            $('#search_keywords').val( selectedSearch );
            $('#search_keywords').parent('form').submit();
        }
    }

    function findSelected() {
        listItems = $('#autoComplete ul').find('li');
        $.each(listItems, function (i, items) {
            alert( $(this).attr('class'));
            // if( $(this).attr('class') == 'hover') alert (i);
        });
    }
    function clearSelection() {
        $("#autoComplete").slideUp('slow', function() {
            $(this).html(''); //clear contents
        });
    }
    function nextSelection(i) {
        $.hoverItem = $.hoverItem + 1;
        updateSelection( $.hoverItem );
    }
    function prevSelection(i) {
        $.hoverItem = $.hoverItem - 1;
        updateSelection( $.hoverItem );
    }
    
    $('#search_keywords').keydown( function(event) {
        // track last key pressed
        lastKeyPressCode = event.keyCode;

        switch(event.keyCode) {
            case 38: // up key
                event.preventDefault();
                prevSelection();
                break;

            case 40: // down key
                event.preventDefault();
                nextSelection();
                break;

            case 13: // Return key
                var selectedItem = $('#autoComplete ul li.hover');
                if (selectedItem.size() > 0) {
                    event.preventDefault();
                    submitSelection( selectedItem );
                }
                break;

            case 27: // ESC key
                clearSelection();
                break;

            default:
                var newSpeed;
                if ($(this).val().length < 1) 
                if ($(this).val().length > speedAfter) newSpeed = (delayAfterKeypress/2);  // speed up result matchng for long names
                else newSpeed = delayAfterKeypress;

                clearTimeout(timeout);
                timeout = window.setTimeout(function() {
                    $('#search_keywords').autoComplete();
                }, newSpeed);
                break;
        }
    });
    
    $.fn.autoComplete = function() {
        if ( $(this).val().length >= minChars && $(this).val().length <= maxChars && (has_results || $(this).val().length < last_char_length ) ) {
            last_char_length = $(this).val().length;
            var getJSON = $.getJSON(location.protocol + '//' + location.hostname + '/ajax/autocomplete.html?keywords=' + encodeURI($(this).val()),
                function(data){
                    jQuery.each(jQuery.browser, function(i) {
                        if ($.browser.msie) {
                            if ($.browser.version == '6.0') $('#film_listings form.right').hide();
                        }
                    });
                    var result_rows = '<ul>';
                    has_results = data.items.length;
                    $.each(data.items, function(i,item){
                        var escape_chars = new RegExp("[\\.]", "g");
                        var escaped_keyword = data.keyword.replace(escape_chars, '\\.');
                        escaped_keyword = decodeURI(escaped_keyword);
                        item.name = decodeURI(item.name);
                        var matches = item.name.match( new RegExp(escaped_keyword, "ig") );
                        var result_row = item.name;
                        jQuery.each(matches, function(i) {
                                 result_row = result_row.replace(new RegExp('('+matches[i]+')([^\<]?)', "g"), '<strong>$1</strong>$2'); 
                        });   
                        result_rows += '<li class="'+ item.type+'">';
                        if (item.url != undefined) result_rows += '<a href="'+item.url+'">'+ decodeURI(result_row) + '</a>';
                        if (item.format != undefined && item.type == 'g') result_rows += ':<span class="has_format"> '+item.format + '</span>';
                        result_rows += '</li>';
                    });
                    result_rows += '</ul>';
                    if (data.items.length > 0) {
                        $('#autoComplete').html(result_rows);
                        //$('#autoComplete ul').children('li:eq(0)').addClass('hover');
                        $('#autoComplete ul li').hover(function() {
                            $('#autoComplete ul li').removeClass('hover');
                            $(this).addClass('hover');
                        }, function() {
                            //$(this).removeClass('hover');
                        });
                        $('#autoComplete ul li').click(function() {
                            submitSelection( $(this) );
                        });
                        if (!$.useExactMatch) {
                            $('#autoComplete ul li').find('a').click(function(e) {
                                e.preventDefault();
                            });
                        }

                        //get the position of the placeholder element
                        var pos = $('#search_keywords').offset();
                        var height = $('#search_keywords').height();
                        $("#autoComplete").css( { "left": (pos.left) + "px", "top":(pos.top + height+9) + "px" } );
                        $("#autoComplete").slideDown();
                    } else {
                        $("#autoComplete").hide();
                    }
                });
            } else {
                $("#autoComplete").hide();
            }
        }
        $('#search_keywords').blur(function() {
            clearSelection();
            jQuery.each(jQuery.browser, function(i) {
                if ($.browser.msie) {
                    if ($.browser.version == '6.0') $('#film_listings form.right').show();
                }
            });
        }); 
    });
})(jQuery);

