

jQuery.SearchObject = {
    init: function(options) {
        this.each(function() {
            var defaults = {
                "onSelect": function () {},
                "onAdd": function () {},
                "onEnter": function () {},
                "onResult": undefined,
                "objects": "*",
                "count": 10,
                "width": "300",
                "add": false,
                "no_result_title": "Ни одного результата не найдено.",
                "title": "",
                "dialog": false,
                "show_type": true,
                "show_comment": true,
                "show_loading": true,
                "as_links": false,
                "clear": true,
                "attrs": ""
            }

            this.Config = jQuery.extend(defaults, options || {});

            jQuery.SearchObject.create($(this))

            $(this).addClass("maller-search");
        });

        return this;
    },
    // Создаем форму из объекта
    create: function(object) {
        var config = object[0].Config;
        var self = this;

        config.object = object;
        config.working = false;
        config.hover = true;
        config.last_query = undefined;
        config.selected_id = null;

        var search_input = $("input", object);

        if (search_input.length == 0) {
            object.empty();
            search_input = $("<input />").addClass("search_input search_title")
                                         .val(config.title)
                                         .css("width", parseInt(config.width) - 4)
                                         .attr("name", "q")
                                         .attr("autocomplete", "off")
                                         .appendTo(object);
        } else {
            search_input.addClass("search_input search_title")
                        .val(config.title)
                        .attr("name", "q")
                        .attr("autocomplete", "off")
        }

        if (config.value) {
            search_input.val(config.value)
                        .removeClass("search_title");
        }

        if (config.show_loading) {
            var loading_span = $("<div></div>").addClass("loading").appendTo(object);
        }

        var search_results = $("<div></div>").addClass("search-results hidden")
                                             .appendTo(object);

        search_input.hover(function() {
            object.addClass("hovered");
            config.hover = true;
        }, function() {
            object.removeClass("hovered");
            config.hover = false;
        })

        search_results.hover(function() {
            object.addClass("hovered");
            config.hover = true;
        }, function() {
            object.removeClass("hovered");
            config.hover = false;
        })

        search_input.bind("focusout", function() {
            if (config.hover) {
                return false;
            }

            self = $(this);
            if (self.val().length == 0) {
                self.val(config.title)
                    .addClass("search_title");
            }

            search_results.empty();
            search_results.addClass("hidden");
            config.focused = false;
        });

        search_input.bind("focusin", function() {
            if ($(this).hasClass("search_title")) {
                $(this).removeClass("search_title")
                       .val("");
            }
            config.focused = true;
        });

        search_input.bind("keyup focusin", function(event) {
            if (event.keyCode == 13) { config.onEnter(); return false; }

            if (config.working) { clearTimeout(config.working); }

            var q = $(this).val();

            config.selected_id = null;
            search_input.removeClass("selected");

            if (q.length > 2) {
                config.working = setTimeout(function() {
                    config.last_query = config.working;
                    maller.ajax({
                        url: "/search/",
                        type: "GET",
                        data: {
                            "q": q.toLowerCase(),
                            "obj": config.objects,
                            "attrs": config.attrs,
                            "count": config.count,
                            "variations": true
                        },
                        loading: {
                            container: loading_span
                        },
                        success: function(json) {
                            if (config.working && config.last_query != config.working) {
                                return false;
                            }

                            var left = search_input.position().left;

                            if (config.dialog) {
                                var offset = 1;
                                if ($.browser.webkit) {
                                    offset = 4;
                                }
                                var top = search_input.position().top + search_input.innerHeight() + offset;
                            } else {
                                var offset = 1;
                                var top = search_input.offset().top + search_input.innerHeight() + offset;
                            }
                            search_results.css("left", left)
                                          .css("top", top)
                                          .css("width", search_input.innerWidth());

                            search_results.removeClass("hidden");
                            search_results.empty();

                            if (config.onResult != undefined) {
                                search_results.removeClass("search-results").addClass("onresult-div")
                                              .html(config.onResult(json.results));
                            } else {
                                in_results = false;
                                for (var item in json.results) {
                                    if (json.results[item].caption.toLowerCase() == q.toLowerCase()) {
                                        in_results = true;
                                    }

                                    if (config.as_links) {
                                        var result_link = $("<a></a>").addClass("search-link")
                                                                      .attr("href", json.results[item].resource_url)
                                                                      .appendTo(search_results);

                                        var result_div = $("<div></div>").addClass("search-result")
                                                                         .attr("id", "resource-" + json.results[item].resource_id)
                                                                         .appendTo(result_link);
                                    } else {
                                        var result_div = $("<div></div>").addClass("search-result")
                                                                         .attr("id", "resource-" + json.results[item].resource_id)
                                                                         .click(function() {
                                                                              resource_id = $(this).attr("id").replace("resource-", "");
                                                                              config.onSelect(resource_id);
                                                                              config.selected_id = resource_id;
                                                                              search_input.addClass("selected");
                                                                              search_results.empty();
                                                                              search_results.addClass("hidden");
                                                                              if (config.clear) {
                                                                                  search_input.val("");
                                                                              }

                                                                              return false;
                                                                         })
                                                                         .appendTo(search_results);
                                    }

                                    var div = $("<div></div>").appendTo(result_div);

                                    $("<span></span>").addClass("search_caption bold")
                                                    .html(json.results[item].caption)
                                                    .appendTo(div);

                                    if (config.show_type) {
                                        $("<span></span>").addClass("search_type")
                                                        .html(json.results[item].type)
                                                        .appendTo(div);
                                    }

                                    if (config.show_comment) {
                                        $("<div></div>").addClass("search_comment")
                                                        .html(json.results[item].comment)
                                                        .appendTo(result_div);
                                    }
                                }

                                if (config.add) {
                                    if (!in_results) {
                                        $("<div></div>").addClass("add bold")
                                                        .html(sprintf('Добавить "%s"', q))
                                                        .click(function() {
                                                             config.onAdd(q);
                                                             search_results.empty();
                                                             search_results.addClass("hidden");
                                                             search_input.val("");

                                                             return false;
                                                        })
                                                        .appendTo(search_results);
                                    }
                                } else {
                                    if (maller.empty_object(json.results)) {
                                        $("<div></div>").addClass("no-search-results")
                                                        .html(config.no_result_title)
                                                        .appendTo(search_results);
                                    }
                                }
                            }

                            if (config.last_query == config.working) {
                                config.working = false;
                            }

                            if (!config.focused) {
                                 search_results.empty();
                                 search_results.addClass("hidden");
                            }
                        }
                    })
                }, 200);
            } else {
                search_results.empty();
                search_results.addClass("hidden");
            }
        });

        return this;
    },
    get_value: function() {
        var object = $(this)[0];
        var config = object.Config;
        var search_input = $("input", object);

        if (search_input.hasClass("search_title")) return "";
        return search_input.val();
    },
    get_selected: function() {
        var object = $(this)[0];
        var config = object.Config;
        return config.selected_id;
    }
}

jQuery.fn.extend({
    SearchObject : jQuery.SearchObject.init,
    SearchObjectGetValue : jQuery.SearchObject.get_value,
    SearchObjectGetSelected : jQuery.SearchObject.get_selected
});

// Подгружаем стили
$.getCSS('/gmedia/css/components/search.css', function() {});

