'use strict'; define( [ 'app', 'marionette', 'Series/EpisodeCollection', 'Series/EpisodeFileCollection', 'Series/SeasonCollection', 'Series/Details/SeasonCollectionView', 'Series/Details/InfoView', 'Commands/CommandController', 'Shared/LoadingView', 'Shared/Actioneer', 'backstrech', 'Mixins/backbone.signalr.mixin' ], function (App, Marionette, EpisodeCollection, EpisodeFileCollection, SeasonCollection, SeasonCollectionView, InfoView, CommandController, LoadingView, Actioneer) { return Marionette.Layout.extend({ itemViewContainer: '.x-series-seasons', template : 'Series/Details/SeriesDetailsTemplate', regions: { seasons: '#seasons', info : '#info' }, ui: { header : '.x-header', monitored: '.x-monitored', edit : '.x-edit', refresh : '.x-refresh', rename : '.x-rename', search : '.x-search' }, events: { 'click .x-monitored': '_toggleMonitored', 'click .x-edit' : '_editSeries', 'click .x-refresh' : '_refreshSeries', 'click .x-rename' : '_renameSeries', 'click .x-search' : '_seriesSearch' }, initialize: function () { $('body').addClass('backdrop'); this.listenTo(this.model, 'change:monitored', this._setMonitoredState); this.listenTo(App.vent, App.Events.SeriesDeleted, this._onSeriesDeleted); this.listenTo(App.vent, App.Events.SeasonRenamed, this._onSeasonRenamed); }, onShow: function () { var fanArt = this._getFanArt(); if (fanArt) { this._backstrech = $.backstretch(fanArt); } else { $('body').removeClass('backdrop'); } this._showSeasons(); this._setMonitoredState(); this._showInfo(); }, onRender: function () { Actioneer.bindToCommand({ element: this.ui.refresh, command: { name: 'refreshSeries' } }); Actioneer.bindToCommand({ element: this.ui.search, command: { name: 'seriesSearch' } }); Actioneer.bindToCommand({ element: this.ui.rename, command: { name: 'renameSeries' } }); }, _getFanArt: function () { var fanArt = _.where(this.model.get('images'), {coverType: 'fanart'}); if (fanArt && fanArt[0]) { return fanArt[0].url; } return undefined; }, onClose: function () { if (this._backstrech) { this._backstrech.destroy(); delete this._backstrech; } $('body').removeClass('backdrop'); App.reqres.removeHandler(App.Reqres.GetEpisodeFileById); }, _toggleMonitored: function () { var savePromise = this.model.save('monitored', !this.model.get('monitored'), { wait: true }); this.ui.monitored.spinForPromise(savePromise); }, _setMonitoredState: function () { var monitored = this.model.get('monitored'); this.ui.monitored.removeAttr('data-idle-icon'); if (monitored) { this.ui.monitored.addClass('icon-nd-monitored'); this.ui.monitored.removeClass('icon-nd-unmonitored'); } else { this.ui.monitored.addClass('icon-nd-unmonitored'); this.ui.monitored.removeClass('icon-nd-monitored'); } }, _editSeries: function () { App.vent.trigger(App.Commands.EditSeriesCommand, {series: this.model}); }, _refreshSeries: function () { CommandController.Execute('refreshSeries', { name : 'refreshSeries', seriesId: this.model.id }); }, _onSeriesDeleted: function (event) { if (this.model.get('id') === event.series.get('id')) { App.Router.navigate('/', { trigger: true }); } }, _renameSeries: function () { CommandController.Execute('renameSeries', { name : 'renameSeries', seriesId: this.model.id }); }, _seriesSearch: function () { CommandController.Execute('seriesSearch', { name : 'seriesSearch', seriesId: this.model.id }); }, _showSeasons: function () { var self = this; this.seasons.show(new LoadingView()); this.seasonCollection = new SeasonCollection(this.model.get('seasons')); this.episodeCollection = new EpisodeCollection({ seriesId: this.model.id }); this.episodeFileCollection = new EpisodeFileCollection({ seriesId: this.model.id }); $.when(this.episodeCollection.fetch(), this.episodeFileCollection.fetch()).done(function () { var seasonCollectionView = new SeasonCollectionView({ collection : self.seasonCollection, episodeCollection: self.episodeCollection, series : self.model }); App.reqres.setHandler(App.Reqres.GetEpisodeFileById, function (episodeFileId) { return self.episodeFileCollection.get(episodeFileId); }); self.seasons.show(seasonCollectionView); }); }, _showInfo: function () { this.info.show(new InfoView({ model: this.model })); }, _refetchEpisodeFiles: function () { this.episodeFileCollection.fetch(); }, _onSeasonRenamed: function (event) { if (this.model.get('id') === event.series.get('id')) { this._refetchEpisodeFiles(); } } }); });