public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            FrameworkElement element = container as FrameworkElement;

            if (element != null && item != null)
            {
                if (item.GetType() == typeof(AnimeEpisodeDisplayVM))
                {
                    AnimeEpisodeDisplayVM ep = item as AnimeEpisodeDisplayVM;

                    if (ep.EpisodeOrder == 0)
                    {
                        return(element.FindResource("AnimeEpisodePrevious") as DataTemplate);
                    }

                    if (ep.EpisodeOrder == 1)
                    {
                        return(element.FindResource("AnimeEpisodeCurrent") as DataTemplate);
                    }

                    return(element.FindResource("AnimeEpisodeOther") as DataTemplate);
                }
            }

            return(null);
        }
        void episodesWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                AnimeSeriesVM ser = e.Argument as AnimeSeriesVM;

                List <JMMServerBinary.Contract_AnimeEpisode> rawEps = JMMServerVM.Instance.clientBinaryHTTP.GetAllUnwatchedEpisodes(ser.AnimeSeriesID.Value,
                                                                                                                                    JMMServerVM.Instance.CurrentUser.JMMUserID.Value);

                // find the last watched episode
                JMMServerBinary.Contract_AnimeEpisode rawLastEp = JMMServerVM.Instance.clientBinaryHTTP.GetLastWatchedEpisodeForSeries(ser.AnimeSeriesID.Value,
                                                                                                                                       JMMServerVM.Instance.CurrentUser.JMMUserID.Value);

                if (rawLastEp != null)
                {
                    AnimeEpisodeDisplayVM ep = new AnimeEpisodeDisplayVM(rawLastEp);
                    ep.SetTvDBInfo();
                    //if (JMMServerVM.Instance.Trakt_IsEnabled)
                    //    ep.SetTraktInfo();
                    ep.EpisodeOrder = 0;
                    System.Windows.Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action) delegate()
                    {
                        UnwatchedEpisodes.Add(ep);
                    });
                }

                int i = 0;
                foreach (JMMServerBinary.Contract_AnimeEpisode raw in rawEps)
                {
                    i++;
                    AnimeEpisodeDisplayVM ep = new AnimeEpisodeDisplayVM(raw);
                    ep.SetTvDBInfo();
                    //if (i == 1 && JMMServerVM.Instance.Trakt_IsEnabled) ep.SetTraktInfo();
                    ep.EpisodeOrder = i;
                    System.Windows.Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action) delegate()
                    {
                        UnwatchedEpisodes.Add(ep);
                    });

                    if (i == 5)
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                logger.ErrorException(ex.ToString(), ex);
            }
        }
        private void CommandBinding_PlayEpisode(object sender, ExecutedRoutedEventArgs e)
        {
            Window parentWindow = Window.GetWindow(this);

            object obj = e.Parameter;

            if (obj == null)
            {
                return;
            }

            try
            {
                if (obj.GetType() == typeof(AnimeEpisodeDisplayVM))
                {
                    AnimeEpisodeDisplayVM ep = obj as AnimeEpisodeDisplayVM;

                    if (ep.FilesForEpisode.Count == 1)
                    {
                        MainWindow.videoHandler.PlayVideo(ep.FilesForEpisode[0]);
                    }
                    else if (ep.FilesForEpisode.Count > 1)
                    {
                        if (AppSettings.AutoFileSingleEpisode)
                        {
                            VideoDetailedVM vid = MainWindow.videoHandler.GetAutoFileForEpisode(ep);
                            if (vid != null)
                            {
                                MainWindow.videoHandler.PlayVideo(vid);
                            }
                        }
                        else
                        {
                            PlayVideosForEpisodeForm frm = new PlayVideosForEpisodeForm();
                            frm.Owner = parentWindow;
                            frm.Init(ep);
                            bool?result = frm.ShowDialog();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Utils.ShowErrorMessage(ex);
            }
        }
        private void CommandBinding_ToggleWatchedStatus(object sender, ExecutedRoutedEventArgs e)
        {
            object obj = e.Parameter;

            if (obj == null)
            {
                return;
            }

            this.Cursor = Cursors.Wait;

            try
            {
                Window        parentWindow = Window.GetWindow(this);
                AnimeSeriesVM ser          = null;
                bool          newStatus    = false;

                if (obj.GetType() == typeof(VideoDetailedVM))
                {
                    VideoDetailedVM vid = obj as VideoDetailedVM;
                    newStatus = !vid.Watched;
                    JMMServerVM.Instance.clientBinaryHTTP.ToggleWatchedStatusOnVideo(vid.VideoLocalID, newStatus, JMMServerVM.Instance.CurrentUser.JMMUserID.Value);

                    MainListHelperVM.Instance.UpdateHeirarchy(vid);

                    ser = MainListHelperVM.Instance.GetSeriesForVideo(vid.VideoLocalID);
                }

                if (obj.GetType() == typeof(AnimeEpisodeDisplayVM))
                {
                    AnimeEpisodeDisplayVM ep = obj as AnimeEpisodeDisplayVM;
                    newStatus = !ep.Watched;

                    JMMServerBinary.Contract_ToggleWatchedStatusOnEpisode_Response response = JMMServerVM.Instance.clientBinaryHTTP.ToggleWatchedStatusOnEpisode(ep.AnimeEpisodeID,
                                                                                                                                                                 newStatus, JMMServerVM.Instance.CurrentUser.JMMUserID.Value);
                    if (!string.IsNullOrEmpty(response.ErrorMessage))
                    {
                        MessageBox.Show(response.ErrorMessage, Properties.Resources.Error, MessageBoxButton.OK, MessageBoxImage.Error);
                        return;
                    }

                    MainListHelperVM.Instance.UpdateHeirarchy(response.AnimeEpisode);

                    ser = MainListHelperVM.Instance.GetSeriesForEpisode(ep);
                }

                RefreshData();
                if (newStatus == true && ser != null)
                {
                    Utils.PromptToRateSeries(ser, parentWindow);
                }
            }
            catch (Exception ex)
            {
                Utils.ShowErrorMessage(ex);
            }
            finally
            {
                this.Cursor = Cursors.Arrow;
            }
        }