define(["underscore", "js/views/baseview", "js/views/feedback_alert", "gettext"],
    function(_, BaseView, AlertView, gettext) {

        var PagingView = BaseView.extend({
            // takes a Backbone Paginator as a model

            sortableColumns: {},

            initialize: function() {
                BaseView.prototype.initialize.call(this);
                var collection = this.collection;
                collection.bind('add', _.bind(this.onPageRefresh, this));
                collection.bind('remove', _.bind(this.onPageRefresh, this));
                collection.bind('reset', _.bind(this.onPageRefresh, this));
            },

            onPageRefresh: function() {
                var sortColumn = this.sortColumn;
                this.renderPageItems();
                this.$('.column-sort-link').removeClass('current-sort');
                this.$('#' + sortColumn).addClass('current-sort');
            },

            setPage: function(page) {
                var self = this,
                    collection = self.collection,
                    oldPage = collection.currentPage;
                collection.goTo(page, {
                    reset: true,
                    success: function() {
                        window.scrollTo(0, 0);
                    },
                    error: function(collection) {
                        collection.currentPage = oldPage;
                        self.onError();
                    }
                });
            },

            onError: function() {
                // Do nothing by default
            },

            nextPage: function() {
                var collection = this.collection,
                    currentPage = collection.currentPage,
                    lastPage = collection.totalPages - 1;
                if (currentPage < lastPage) {
                    this.setPage(currentPage + 1);
                }
            },

            previousPage: function() {
                var collection = this.collection,
                    currentPage = collection.currentPage;
                if (currentPage > 0) {
                    this.setPage(currentPage - 1);
                }
            },

            /**
             * Registers information about a column that can be sorted.
             * @param columnName The element name of the column.
             * @param displayName The display name for the column in the current locale.
             * @param fieldName The database field name that is represented by this column.
             * @param defaultSortDirection The default sort direction for the column
             */
            registerSortableColumn: function(columnName, displayName, fieldName, defaultSortDirection) {
                this.sortableColumns[columnName] = {
                    displayName: displayName,
                    fieldName: fieldName,
                    defaultSortDirection: defaultSortDirection
                };
            },

            sortableColumnInfo: function(sortColumn) {
                var sortInfo = this.sortableColumns[sortColumn];
                if (!sortInfo) {
                    throw "Unregistered sort column '" + sortColumn + '"';
                }
                return sortInfo;
            },

            sortDisplayName: function() {
                var sortColumn = this.sortColumn,
                    sortInfo = this.sortableColumnInfo(sortColumn);
                return sortInfo.displayName;
            },

            sortDirectionName: function() {
                var collection = this.collection,
                    ascending = collection.sortDirection === 'asc';
                return ascending ? gettext("ascending") : gettext("descending");
            },

            setInitialSortColumn: function(sortColumn) {
                var collection = this.collection,
                    sortInfo = this.sortableColumns[sortColumn];
                collection.sortField = sortInfo.fieldName;
                collection.sortDirection = sortInfo.defaultSortDirection;
                this.sortColumn = sortColumn;
            },

            toggleSortOrder: function(sortColumn) {
                var collection = this.collection,
                    sortInfo = this.sortableColumnInfo(sortColumn),
                    sortField = sortInfo.fieldName,
                    defaultSortDirection = sortInfo.defaultSortDirection;
                if (collection.sortField === sortField) {
                    collection.sortDirection = collection.sortDirection === 'asc' ? 'desc' : 'asc';
                } else {
                    collection.sortField = sortField;
                    collection.sortDirection = defaultSortDirection;
                }
                this.sortColumn = sortColumn;
                this.setPage(0);
            }
        });

        return PagingView;
    }); // end define();