﻿(function ($) {
    $.ui.autocomplete.prototype.options.autoSelect = true;
    $(".ui-autocomplete-input").live("blur", function (event) {
        var autocomplete = $(this).data("autocomplete");
        if (!autocomplete.options.autoSelect && !autocomplete.selectedItem) {
            menu = autocomplete.menu;
            menu.activate($.Event({ type: "mouseenter" }), menu.element.children().first());
        }
        if (!autocomplete.options.autoSelect || autocomplete.selectedItem) { return; }
        var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex($(this).val()) + "$", "i");
        autocomplete.widget().children(".ui-menu-item").each(function () {
            var item = $(this).data("item.autocomplete");
            if (item && matcher.test(item.label || item.value || item)) {
                autocomplete.selectedItem = item;
                return false;
            }
        });
        if (autocomplete.selectedItem) {
            autocomplete._trigger("select", event, { item: autocomplete.selectedItem });
        }
    });

    var proto = $.ui.autocomplete.prototype, initSource = proto._initSource;

    function filter(array, term) {
        var matcher = new RegExp($.ui.autocomplete.escapeRegex(term), "i");
        return $.grep(array, function (value) {
            return matcher.test($("<div>").html(value.label || value.value || value).text());
        });
    }

    $.extend(proto, {
        _initSource: function () {
            if (this.options.html && $.isArray(this.options.source)) {
                this.source = function (request, response) {
                    response(filter(this.options.source, request.term));
                };
            } else {
                initSource.call(this);
            }
        },

        _renderItem: function (ul, item) {
            return $("<li></li>")[this.options.html ? "html" : "text"](item.label)
                .data("item.autocomplete", item)
                //.append($("<a></a>")[this.options.html ? "html" : "text"](item.label))
                .appendTo(ul);
        }
    });
})(jQuery);

