define(["js/views/paging", "js/views/asset", "js/views/paging_header", "js/views/paging_footer"],
    function(PagingView, AssetView, PagingHeader, PagingFooter) {

var AssetsView = PagingView.extend({
    // takes AssetCollection as model

    events : {
        "click .column-sort-link": "onToggleColumn"
    },

    initialize : function() {
        PagingView.prototype.initialize.call(this);
        var collection = this.collection;
        this.template = _.template($("#asset-library-tpl").text());
        this.listenTo(collection, 'destroy', this.handleDestroy);
        this.registerSortableColumn('js-asset-name-col', gettext('Name'), 'display_name', 'asc');
        this.registerSortableColumn('js-asset-date-col', gettext('Date Added'), 'date_added', 'desc');
        this.setInitialSortColumn('js-asset-date-col');
    },

    render: function() {
        this.$el.html(this.template());
        this.tableBody = this.$('#asset-table-body');
        this.pagingHeader = new PagingHeader({view: this, el: $('#asset-paging-header')});
        this.pagingFooter = new PagingFooter({view: this, el: $('#asset-paging-footer')});
        this.pagingHeader.render();
        this.pagingFooter.render();

        // Hide the contents until the collection has loaded the first time
        this.$('.asset-library').hide();
        this.$('.no-asset-content').hide();

        return this;
    },

    renderPageItems: function() {
        var self = this,
            assets = this.collection,
            hasAssets = assets.length > 0;
        self.tableBody.empty();
        if (hasAssets) {
            assets.each(
                function(asset) {
                    var view = new AssetView({model: asset});
                    self.tableBody.append(view.render().el);
                });
        }
        self.$('.asset-library').toggle(hasAssets);
        self.$('.no-asset-content').toggle(!hasAssets);
        return this;
    },

    handleDestroy: function(model, collection, options) {
        this.collection.fetch({reset: true}); // reload the collection to get a fresh page full of items
        analytics.track('Deleted Asset', {
            'course': course_location_analytics,
            'id': model.get('url')
        });
    },

    addAsset: function (model) {
        // Switch the sort column back to the default (most recent date added) and show the first page
        // so that the new asset is shown at the top of the page.
        this.setInitialSortColumn('js-asset-date-col');
        this.setPage(0);

        analytics.track('Uploaded a File', {
            'course': course_location_analytics,
            'asset_url': model.get('url')
        });
    },

    onToggleColumn: function(event) {
        var columnName = event.target.id;
        this.toggleSortOrder(columnName);
    }
});

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