'use strict'; define( [ 'app', 'marionette', 'backgrid', 'Cells/ToggleCell', 'Cells/EpisodeTitleCell', 'Cells/RelativeDateCell', 'Cells/EpisodeStatusCell', 'Commands/CommandController', 'moment' ], function (App, Marionette, Backgrid, ToggleCell, EpisodeTitleCell, RelativeDateCell, EpisodeStatusCell, CommandController, Moment) { return Marionette.Layout.extend({ template: 'Series/Details/SeasonLayoutTemplate', ui: { seasonSearch : '.x-season-search', seasonMonitored: '.x-season-monitored', seasonRename : '.x-season-rename' }, events: { 'click .x-season-monitored' : '_seasonMonitored', 'click .x-season-search' : '_seasonSearch', 'click .x-season-rename' : '_seasonRename', 'click .x-show-hide-episodes': '_showHideEpisodes', 'dblclick .series-season h2' : '_showHideEpisodes' }, regions: { episodeGrid: '.x-episode-grid' }, columns: [ { name : 'monitored', label : '', cell : ToggleCell, trueClass : 'icon-bookmark', falseClass: 'icon-bookmark-empty', tooltip : 'Toggle monitored status', sortable : false }, { name : 'episodeNumber', label: '#', cell : Backgrid.IntegerCell.extend({ className: 'episode-number-cell' }) }, { name : 'this', label : 'Title', hideSeriesLink: true, cell : EpisodeTitleCell, sortable : false }, { name : 'airDateUtc', label: 'Air Date', cell : RelativeDateCell } , { name : 'status', label : 'Status', cell : EpisodeStatusCell, sortable: false } ], initialize: function (options) { if (!options.episodeCollection) { throw 'episodeCollection is needed'; } this.episodeCollection = options.episodeCollection.bySeason(this.model.get('seasonNumber')); this.series = options.series; this.showingEpisodes = this._shouldShowEpisodes(); this.listenTo(this.model, 'sync', this._afterSeasonMonitored); this.listenTo(this.episodeCollection, 'sync', this.render); }, onRender: function () { if (this.showingEpisodes) { this._showEpisodes(); } this._setSeasonMonitoredState(); CommandController.bindToCommand({ element: this.ui.seasonSearch, command: { name : 'seasonSearch', seriesId : this.series.id, seasonNumber: this.model.get('seasonNumber') } }); CommandController.bindToCommand({ element: this.ui.seasonRename, command: { name : 'renameSeason', seriesId : this.series.id, seasonNumber: this.model.get('seasonNumber') } }); }, _seasonSearch: function () { CommandController.Execute('seasonSearch', { name : 'seasonSearch', seriesId : this.series.id, seasonNumber: this.model.get('seasonNumber') }); }, _seasonRename: function () { CommandController.Execute('renameSeason', { name : 'renameSeason', seriesId : this.series.id, seasonNumber: this.model.get('seasonNumber') }); }, _seasonMonitored: function () { var name = 'monitored'; this.model.set(name, !this.model.get(name)); this.series.setSeasonMonitored(this.model.get('seasonNumber')); var savePromise = this.series.save().always(this._afterSeasonMonitored.bind(this)); this.ui.seasonMonitored.spinForPromise(savePromise); }, _afterSeasonMonitored: function () { var self = this; _.each(this.episodeCollection.models, function (episode) { episode.set({ monitored: self.model.get('monitored') }); }); this.render(); }, _setSeasonMonitoredState: function () { this.ui.seasonMonitored.removeClass('icon-spinner icon-spin'); if (this.model.get('monitored')) { this.ui.seasonMonitored.addClass('icon-bookmark'); this.ui.seasonMonitored.removeClass('icon-bookmark-empty'); } else { this.ui.seasonMonitored.addClass('icon-bookmark-empty'); this.ui.seasonMonitored.removeClass('icon-bookmark'); } }, _afterRename: function () { App.vent.trigger(App.Events.SeasonRenamed, { series: this.series, seasonNumber: this.model.get('seasonNumber') }); }, _showEpisodes: function () { this.episodeGrid.show(new Backgrid.Grid({ columns : this.columns, collection: this.episodeCollection, className : 'table table-hover season-grid' })); }, _shouldShowEpisodes: function () { var startDate = Moment().add('month', -1); var endDate = Moment().add('year', 1); return this.episodeCollection.some(function (episode) { var airDate = episode.get('airDateUtc'); if (airDate) { var airDateMoment = Moment(airDate); if (airDateMoment.isAfter(startDate) && airDateMoment.isBefore(endDate)) { return true; } } return false; }); }, templateHelpers: function () { var episodeCount = this.episodeCollection.filter(function (episode) { return episode.get('hasFile') || (episode.get('monitored') && Moment(episode.get('airDateUtc')).isBefore(Moment())); }).length; var episodeFileCount = this.episodeCollection.where({ hasFile: true }).length; var percentOfEpisodes = 100; if (episodeCount > 0) { percentOfEpisodes = episodeFileCount / episodeCount * 100; } return { showingEpisodes : this.showingEpisodes, episodeCount : episodeCount, episodeFileCount : episodeFileCount, percentOfEpisodes: percentOfEpisodes }; }, _showHideEpisodes: function () { if (this.showingEpisodes) { this.showingEpisodes = false; this.episodeGrid.close(); } else { this.showingEpisodes = true; this._showEpisodes(); } this.templateHelpers.showingEpisodes = this.showingEpisodes; this.render(); } }); });