define([ "require", "backbone", "underscore", "utils/Utils", "utils/Globals", "backgrid-filter", "backgrid-paginator", "select2" ], function(require, Backbone, _, Utils) {
    "use strict";
    var HeaderSearchCell = Backbone.View.extend({
        tagName: "td",
        className: "backgrid-filter",
        template: _.template(' placeholder="<%- placeholder %>" <% } %> name="<%- name %>" <% if (style) { %> style="<%- style %>" <% } %> />'),
        placeholder: "",
        events: {
            "keyup input": "evKeyUp",
            submit: "search"
        },
        initialize: function(options) {
            _.extend(this, _.pick(options, "column")), this.name = this.column.get("name"), 
            void 0 !== this.column.get("reName") && (this.name = this.column.get("reName"));
            var collection = this.collection, self = this;
            Backbone.PageableCollection && collection instanceof Backbone.PageableCollection && (collection.queryParams[this.name] = function() {
                return self.searchBox().val() || null;
            });
        },
        render: function() {
            return this.$el.empty().append(this.template({
                name: this.column.get("name"),
                placeholder: this.column.get("placeholder") || "Search",
                style: this.column.get("headerSearchStyle")
            })), this.$el.addClass("renderable"), this.delegateEvents(), this;
        },
        evKeyUp: function(e) {
            var $clearButton = this.clearButton(), searchTerms = this.searchBox().val();
            e.shiftKey || this.search(), searchTerms ? $clearButton.show() : $clearButton.hide();
        },
        searchBox: function() {
            return this.$el.find("input[type=search]");
        },
        clearButton: function() {
            return this.$el.find(".clear");
        },
        search: function() {
            var data = {}, collection = this.collection;
            Backbone.PageableCollection && collection instanceof Backbone.PageableCollection && "server" === collection.mode && (collection.state.currentPage = collection.state.firstPage);
            var query = this.searchBox().val();
            query && (data[this.name] = query), collection.extraSearchParams && _.extend(data, collection.extraSearchParams), 
            "server" === collection.mode ? collection.fetch({
                data: data,
                reset: !0,
                success: function() {},
                error: function(msResponse) {
                    Utils.notifyError("Error", "Invalid input data!");
                }
            }) : "client" === collection.mode;
        },
        clear: function(e) {
            e && e.preventDefault(), this.searchBox().val(null), this.collection.fetch({
                reset: !0
            });
        }
    }), HeaderFilterCell = Backbone.View.extend({
        tagName: "td",
        className: "backgrid-filter",
        template: _.template(''),
        placeholder: "",
        events: {
            click: function() {}
        },
        initialize: function(options) {
            _.extend(this, _.pick(options, "column")), this.name = this.column.get("name"), 
            this.headerFilterOptions = this.column.get("headerFilterOptions");
        },
        render: function() {
            var that = this;
            return this.$el.empty().append(this.template({
                name: this.column.get("name"),
                list: this.headerFilterOptions.filterList
            })), this.$el.find("select").select2({
                allowClear: !0,
                closeOnSelect: !1,
                width: this.headerFilterOptions.filterWidth || "100%",
                height: this.headerFilterOptions.filterHeight || "20px"
            }), this.$el.addClass("renderable"), this.$el.find("select").on("click", function(e) {
                that.search(e.currentTarget.value);
            }), this;
        },
        search: function(selectedOptionValue) {
            var query, data = {}, collection = this.collection;
            Backbone.PageableCollection && collection instanceof Backbone.PageableCollection && "server" === collection.mode && (collection.state.currentPage = collection.state.firstPage), 
            "ALL" !== selectedOptionValue && (query = selectedOptionValue), query && (data[this.name] = query), 
            collection.extraSearchParams && _.extend(data, collection.extraSearchParams), collection.fetch({
                data: data,
                reset: !0
            });
        }
    }), HeaderRow = Backgrid.Row.extend({
        requiredOptions: [ "columns", "collection" ],
        initialize: function() {
            Backgrid.Row.prototype.initialize.apply(this, arguments);
        },
        makeCell: function(column, options) {
            var headerCell;
            switch (!0) {
              case column.has("canHeaderSearch") && column.get("canHeaderSearch") === !0:
                headerCell = new HeaderSearchCell({
                    column: column,
                    collection: this.collection
                });
                break;
              case column.has("canHeaderFilter") && column.get("canHeaderFilter") === !0:
                headerCell = new HeaderFilterCell({
                    column: column,
                    collection: this.collection
                });
                break;
              default:
                headerCell = new Backbone.View({
                    tagName: "td"
                });
            }
            return headerCell;
        }
    }), Header = Backgrid.Header.extend({
        initialize: function(options) {
            var args = Array.prototype.slice.apply(arguments);
            Backgrid.Header.prototype.initialize.apply(this, args), this.searchRow = new HeaderRow({
                columns: this.columns,
                collection: this.collection
            });
        },
        render: function() {
            var args = Array.prototype.slice.apply(arguments);
            return Backgrid.Header.prototype.render.apply(this, args), this.$el.append(this.searchRow.render().$el), 
            this;
        },
        remove: function() {
            var args = Array.prototype.slice.apply(arguments);
            return Backgrid.Header.prototype.remove.apply(this, args), this.searchRow.remove.apply(this.searchRow, arguments), 
            Backbone.View.prototype.remove.apply(this, arguments);
        }
    });
    return Header;
});