(function ($) {
    $.fn.fbcompletion = function (settings) {
        var config = {
            collection: "funnelback_documentation",
            show: 10,
            sort: 0,
            delay: 0,
            length: 3,
            program: "padre-qs.cgi",
            source: "csv",
            format: "simple",
            enabled: "disabled",
            tmplId: "fb-completion-tmpl"
        };
        if (settings) {
            $.extend(config, settings)
        }
        if (config.enabled != "enabled") {
            return
        }
        this.each(function () {
            var targetElement = this;
            var compiledTmpl;
            if (jQuery().template) {
                if (jQuery("#" + config.tmplId).length > 0) {
                    compiledTmpl = jQuery("#" + config.tmplId).template()
                } else {
                    compiledTmpl = jQuery("<script>[Error: Template <tt>" + config.tmplId + "</tt> not found]<\/script>").template()
                }
            }
            $(targetElement).autocomplete({
                source: function (request, response) {
                    jQuery.ajax({
                        type: "GET",
                        url: config.program + "?collection=" + config.collection + "&partial_query=" + request.term.replace(/ /g, "+") + "&show=" + config.show + "&sort=" + config.sort + "&alpha=" + config.alpha + "&autoc=" + ((config.source == "internal") ? 0 : 2) + "&fmt=" + ((config.format == "simple") ? "json" : "json++"),
                        dataType: "json",
                        success: function (data) {
                            var responses = new Array();
                            var categorized = new Array();
                            for (var i = 0; i < data.length; i++) {
                                var out;
                                var suggestion = data[i];
                                if (suggestion == null) {
                                    continue
                                }
                                if (typeof (suggestion) == "string") {
                                    responses.push({
                                        label: suggestion,
                                        matchOn: request.term
                                    })
                                } else {
                                    if (typeof (suggestion) == "object") {
                                        if (suggestion.cat) {
                                            if (!categorized[suggestion.cat]) {
                                                categorized[suggestion.cat] = new Array()
                                            }
                                            categorized[suggestion.cat].push({
                                                label: (suggestion.disp) ? suggestion.disp : suggestion.key,
                                                value: (suggestion.action_t == "Q") ? suggestion.action : suggestion.key,
                                                extra: suggestion
                                            })
                                        } else {
                                            responses.push({
                                                label: (suggestion.disp) ? suggestion.disp : suggestion.key,
                                                value: (suggestion.action_t == "Q") ? suggestion.action : suggestion.key,
                                                extra: suggestion
                                            })
                                        }
                                    }
                                }
                            }
                            for (var i in categorized) {
                                responses.push({
                                    label: i,
                                    category: true
                                });
                                for (var j in categorized[i]) {
                                    responses.push(categorized[i][j])
                                }
                            }
                            response(responses)
                        }
                    })
                },
                delay: config.delay,
                minLength: config.length,
                select: function (evt, ui) {
                    jQuery(this).attr("value", ui.item.value.replace(" s ", "'s "));
                    courseFinderDropdown(ui.item.value);
                    return false
                }
            }).data("autocomplete")._renderItem = function (ul, item) {
                var label;
                if (item.category) {
                    return jQuery("<li><h2>" + item.label + "</h2></li>").appendTo(ul)
                } else {
                    if (item.extra) {
                        switch (item.extra.disp_t) {
                        case "J":
                            if (compiledTmpl) {
                                label = jQuery.tmpl(compiledTmpl, item.extra.disp).appendTo("<p></p>").parent().html()
                            } else {
                                label = "[Error: jQuery template plugin is unavailable]"
                            }
                            break;
                        case "C":
                            label = eval(item.extra.disp);
                            break;
                        case "T":
                        case "H":
                        default:
                            label = item.label
                        }
                    } else {
                        label = item.label.replace(new RegExp("(" + item.matchOn + ")", "i"), "<strong>$1</strong>").replace(" s ", "'s ")
                    }
                }
                return jQuery("<li></li>").data("item.autocomplete", item).append("<a>" + label + "</a>").appendTo(ul)
            }
        });
        return this
    }
})(jQuery);

function courseFinderDropdown(a) {
    jQuery("#course-more").removeClass("hidden");
    jQuery("#course-more .more-content").load("/fb-mirror/search.cgi?collection=bedfordshire-courses&num_ranks=1&form=course&query=" + a.replace(/ /g, "%20"));
    jQuery("#course-more").slideDown("fast");
    jQuery(".arrow_down").css("background-position", "0 0");
    jQuery("#query").keydown(function (b) {
        if (jQuery("#course-more").hasClass("hidden")) {} else {
            if (b.keyCode != 13) {
                jQuery("#course-more").slideUp("fast");
                jQuery("#course-more .more-content").html('<div id="loading-screen"><div class="left" style="width:200px;"></div><div class="summary"><h2>Loading Course Data....</h2><img src="/__data/assets/image/0014/1328/loading.gif" class="loading-image"></div></div>');
                jQuery(".arrow_down").css("background-position", "-19px 0px")
            }
        }
    })
};
