private ContextMenuAction ShowLayoutMenu(string previousMenu)
 {
     ContextMenu cmenu = new ContextMenu(Translation.ChangeLayout, previousMenu);
       cmenu.AddAction(Translation.ListPosters, () => groupViewMode = GUIFacadeControl.Layout.List);
       cmenu.AddAction(Translation.WideBanners, () => groupViewMode = GUIFacadeControl.Layout.LargeIcons);
       cmenu.AddAction(Translation.Filmstrip, () => groupViewMode = GUIFacadeControl.Layout.Filmstrip);
       if (!m_Facade.IsNullLayout(GUIFacadeControl.Layout.CoverFlow))
     cmenu.AddAction(Translation.Coverflow, () => groupViewMode = GUIFacadeControl.Layout.CoverFlow);
       ContextMenuAction context = cmenu.Show();
       if (context == ContextMenuAction.Exit)
       {
     History level = GetCurrent();
     if (level.Listing is GroupFilterVM && ((GroupFilterVM)level.Listing).Childs.Count == 0)
     {
       settings.LastGroupViewMode = groupViewMode;
       settings.Save();
     }
     LoadFacade();
       }
       return context;
 }
        private ContextMenuAction ShowContextMenuTVDB(AnimeSeriesVM ser, string previousMenu)
        {
            GUIListItem currentitem = m_Facade.SelectedListItem;
              if (currentitem == null)
            return ContextMenuAction.Exit;

              int tvdbid;
              int season;
              string displayName;

              if (ser.CrossRef_AniDB_TvDBV2.Count > 0 && ser.TvDBSeriesV2.Count > 0 && ser.AniDB_Anime.AniDB_AnimeCrossRefs != null && ser.AniDB_Anime.AniDB_AnimeCrossRefs.TvDBCrossRefExists)
              {
            displayName = ser.AniDB_Anime.AniDB_AnimeCrossRefs.TvDBSeries[0].SeriesName;
            tvdbid = ser.CrossRef_AniDB_TvDBV2[0].TvDBID;
            season = ser.CrossRef_AniDB_TvDBV2[0].TvDBSeasonNumber;
              }
              else
            return ContextMenuAction.PreviousMenu;
              ContextMenu cmenu = new ContextMenu(displayName, previousmenu: previousMenu);
              // ReSharper disable ImplicitlyCapturedClosure
              cmenu.AddAction(Translation.RemoveTVDBAssociation, () => JMMServerVM.Instance.clientBinaryHTTP.RemoveLinkAniDBTvDBForAnime(ser.AniDB_Anime.AnimeID));
              // ReSharper restore ImplicitlyCapturedClosure
              cmenu.Add(string.Format(Translation.SwitchSeason, season.ToString(Globals.Culture)), () =>
              {
            if (ser.CrossRef_AniDB_TvDBV2.Count < 2)
            {
              return ShowSeasonSelectionMenuTvDB(ser, ser.AniDB_Anime.AnimeID, tvdbid, displayName);
            }
            Utils.DialogMsg(Translation.Error, Translation.CannotEditTvDBLink);
            return ContextMenuAction.Continue;
              });
              return cmenu.Show();
        }
        private ContextMenuAction ShowFilterOptions(string previousMenu)
        {
            ContextMenu cmenu = new ContextMenu(Translation.FilterOptions, previousMenu);
              string showEps = String.Format(Translation.OnlyShowAvailableEpisodes,
              settings.ShowOnlyAvailableEpisodes ? Translation.On : Translation.Off);
              string hideWatched = String.Format(Translation.HideWatchedEpisodes,
              settings.HideWatchedFiles ? Translation.On : Translation.Off);

              cmenu.AddAction(showEps, () =>
              {
              settings.ShowOnlyAvailableEpisodes = !settings.ShowOnlyAvailableEpisodes;
              LoadFacade();
              settings.Save();
              });
              cmenu.AddAction(hideWatched, () =>
              {
              settings.HideWatchedFiles = !settings.HideWatchedFiles;
              settings.Save();
              LoadFacade();
              });

              return cmenu.Show();
        }
        private ContextMenuAction ShowContextMenuPostProcessing(string previousMenu)
        {
            GUIListItem currentitem = m_Facade.SelectedListItem;
              if (currentitem == null)
            return ContextMenuAction.Exit;

              AnimeGroupVM grp = currentitem.TVTag as AnimeGroupVM;
              List<AnimeEpisodeVM> episodes = new List<AnimeEpisodeVM>();
              if (grp == null)
              {
            AnimeSeriesVM ser = currentitem.TVTag as AnimeSeriesVM;
            if (ser == null)
            {
              AnimeEpisodeVM ep = currentitem.TVTag as AnimeEpisodeVM;
              episodes.Add(ep);
            }
            else
            {
              foreach (AnimeEpisodeVM ep in ser.AllEpisodes)
              {
            episodes.Add(ep);
              }
            }
              }
              else
              {
            List<AnimeSeriesVM> seriesList = grp.AllSeries;
            foreach (AnimeSeriesVM ser in seriesList)
            {
              foreach (AnimeEpisodeVM ep in ser.AllEpisodes)
              {
            episodes.Add(ep);
              }
            }

              }

              //keep showing the dialog until the user closes it
              string currentMenu = "Associate with a ffdshow raw preset";
              int selectedLabel = 0;
              int intLabel = 0;

              FFDShowHelper ffdshowHelper = new FFDShowHelper();
              List<string> presets = ffdshowHelper.Presets;

              string selectedPreset = ffdshowHelper.findSelectedPresetForMenu(episodes);

              ContextMenu cmenu = new ContextMenu(Translation.AssociateFFDshowPreset, previousmenu: previousMenu);
              cmenu.AddAction(Translation.RemoveOldPresetAssociation, () =>
              {
            ffdshowHelper.deletePreset(episodes);
            Utils.DialogMsg(Translation.Confirmation, Translation.OldPresetRemove);
              });
              foreach (string preset in presets)
              {
            string local = preset;
            cmenu.AddAction(Translation.SetPreset + ": " + preset, () =>
            {
              ffdshowHelper.addPreset(episodes, local);
              Utils.DialogMsg(Translation.Confirmation, string.Format(Translation.PresetAdded, local));
            }, local == selectedPreset);
              }
              return cmenu.Show();
        }
        private ContextMenuAction ShowContextMenuSeries(string previousMenu)
        {
            GUIListItem currentitem = this.m_Facade.SelectedListItem;
              if (currentitem == null)
            return ContextMenuAction.Exit;

              AnimeSeriesVM ser = currentitem.TVTag as AnimeSeriesVM;
              if (ser == null)
            return ContextMenuAction.Exit;

              ContextMenu cmenu = new ContextMenu(ser.SeriesName, previousmenu: previousMenu);
              cmenu.AddAction(Translation.SeriesInformation, () => ShowAnimeInfoWindow(ser));
              cmenu.AddAction(Translation.MarkAllAsWatched, () =>
              {
            if (ser.AnimeSeriesID.HasValue)
            {
              JMMServerHelper.SetWatchedStatusOnSeries(true, Int32.MaxValue, ser.AnimeSeriesID.Value);
              Contract_AnimeSeries contract = JMMServerVM.Instance.clientBinaryHTTP.GetSeries(ser.AnimeSeriesID.Value, JMMServerVM.Instance.CurrentUser.JMMUserID);
              if (contract != null)
              {
            AnimeSeriesVM serTemp = new AnimeSeriesVM(contract);
            if(serTemp != null)
              Utils.PromptToRateSeriesOnCompletion(serTemp);
              }
              LoadFacade();
            }
              });
              cmenu.AddAction(Translation.MarkAllAsUnwatched, () =>
              {
            if (ser.AnimeSeriesID.HasValue)
            {
              JMMServerHelper.SetWatchedStatusOnSeries(false, Int32.MaxValue, ser.AnimeSeriesID.Value);
              LoadFacade();
            }
              });
              cmenu.AddAction(Translation.RateSeries, () =>
              {
              if (ser == null)
              {
              BaseConfig.MyAnimeLog.Write("Error during rating = series was null!");
              }
              if (ser.AnimeSeriesID.HasValue)
              {
              Utils.PromptToRateSeriesMaually(ser);
              }
              });
              cmenu.Add(Translation.Databases + " ...", () => ShowContextMenuDatabases(ser, ser.SeriesName));
              cmenu.Add(Translation.Images + " ...", () => ShowContextMenuImages(ser.SeriesName));
              cmenu.Add(Translation.EditSeries + " ...", () => ShowContextMenuSeriesEdit(ser.SeriesName));
              // ReSharper disable ImplicitlyCapturedClosure
              cmenu.AddAction(Translation.RandomEpisode, () =>
              // ReSharper restore ImplicitlyCapturedClosure
              {
            RandomWindow_CurrentEpisode = null;
            RandomWindow_CurrentSeries = null;
            RandomWindow_LevelObject = ser;
            RandomWindow_RandomLevel = RandomSeriesEpisodeLevel.Series;
            RandomWindow_RandomType = RandomObjectType.Episode;
            GUIWindowManager.ActivateWindow(Constants.WindowIDs.RANDOM);
              });
              cmenu.Add(Translation.PostProcessing + " ...", () => ShowContextMenuPostProcessing(ser.SeriesName));
              return cmenu.Show();
        }
        private ContextMenuAction SearchTheMovieDB(AnimeSeriesVM ser, string searchCriteria, string previousMenu)
        {
            if (searchCriteria.Length == 0)
            return ContextMenuAction.Exit;
              int aniDbid = ser.AniDB_Anime.AnimeID;

              List<MovieDBMovieSearchResultVM> movieDbSeriesSearchResults = new List<MovieDBMovieSearchResultVM>();
              List<Contract_MovieDBMovieSearchResult> movieResults = new List<Contract_MovieDBMovieSearchResult>(JMMServerVM.Instance.clientBinaryHTTP.SearchTheMovieDB(searchCriteria.Trim()));
              foreach (Contract_MovieDBMovieSearchResult movieResult in movieResults)
            movieDbSeriesSearchResults.Add(new MovieDBMovieSearchResultVM(movieResult));

              BaseConfig.MyAnimeLog.Write("Found {0} moviedb results for {1}", movieDbSeriesSearchResults.Count, searchCriteria);

              if (movieDbSeriesSearchResults.Count > 0)
              {
            ContextMenu cmenu = new ContextMenu(Translation.SearchResults, previousmenu: previousMenu);
            foreach (MovieDBMovieSearchResultVM res in movieDbSeriesSearchResults)
            {
              MovieDBMovieSearchResultVM local = res;
              cmenu.AddAction(res.MovieName, () => LinkAniDBToMovieDB(ser, aniDbid, local.MovieID));

            }
            return cmenu.Show();
              }
              this.Alert(Translation.SearchResults, string.Empty, Translation.NoResultsFound);
              return ContextMenuAction.Exit;
        }
        /*
        private ContextMenuAction ShowContextMenuTrakt(AnimeSeriesVM ser, string previousMenu)
        {
        GUIListItem currentitem = m_Facade.SelectedListItem;
        if (currentitem == null)
            return ContextMenuAction.Exit;

        string traktId;
        int season;
        string displayName;

        if (ser.AniDB_Anime.AniDB_AnimeCrossRefs != null && ser.AniDB_Anime.AniDB_AnimeCrossRefs.CrossRef_AniDB_Trakt != null
            && ser.AniDB_Anime.AniDB_AnimeCrossRefs.TraktShow != null)
        {
            displayName = ser.AniDB_Anime.AniDB_AnimeCrossRefs.TraktShow.Title;
            traktId = ser.AniDB_Anime.AniDB_AnimeCrossRefs.CrossRef_AniDB_Trakt.TraktID;
            season = ser.AniDB_Anime.AniDB_AnimeCrossRefs.CrossRef_AniDB_Trakt.TraktSeasonNumber;
        }
        else
            return ContextMenuAction.PreviousMenu;

        ContextMenu cmenu = new ContextMenu(displayName, previousmenu: previousMenu);
        // ReSharper disable ImplicitlyCapturedClosure
        cmenu.AddAction(Translation.RemoveTraktAssociation, () => JMMServerVM.Instance.clientBinaryHTTP.RemoveLinkAniDBTrakt(ser.AniDB_Anime.AnimeID));
        // ReSharper restore ImplicitlyCapturedClosure
        cmenu.Add(string.Format(Translation.SwitchSeason, season.ToString(Globals.Culture)), () => ShowSeasonSelectionMenuTrakt(ser, ser.AniDB_Anime.AnimeID, traktId, displayName));
        return cmenu.Show();
        }
        */
        private ContextMenuAction ShowContextMenuMovieDB(AnimeSeriesVM ser, string previousMenu)
        {
            GUIListItem currentitem = m_Facade.SelectedListItem;
              if (currentitem == null)
            return ContextMenuAction.Exit;

              string displayName;

              if (ser.CrossRef_AniDB_MovieDB != null && ser.AniDB_Anime.AniDB_AnimeCrossRefs != null &&
              ser.AniDB_Anime.AniDB_AnimeCrossRefs.MovieDB_Movie != null)
              {
            displayName = ser.AniDB_Anime.AniDB_AnimeCrossRefs.MovieDB_Movie.MovieName;
              }
              else
            return ContextMenuAction.PreviousMenu;
              ContextMenu cmenu = new ContextMenu(displayName, previousMenu);
              cmenu.AddAction(Translation.RemoveMovieDBAssociation, () => JMMServerVM.Instance.clientBinaryHTTP.RemoveLinkAniDBOther(ser.AniDB_Anime.AnimeID, (int)CrossRefType.MovieDB));
              return cmenu.Show();
        }
        /*
        private bool ShowContextMenuSeriesInfo(string previousMenu)
        {
          GUIListItem currentitem = this.m_Facade.SelectedListItem;
          if (currentitem == null)
        return true;

          GUIDialogMenu dlg = (GUIDialogMenu)GUIWindowManager.GetWindow((int)GUIWindow.Window.WINDOW_DIALOG_MENU);
          if (dlg == null)
        return true;

          //keep showing the dialog until the user closes it
          int selectedLabel = 0;
          string currentMenu = "Series Information";
          while (true)
          {
        dlg.Reset();
        dlg.SetHeading(currentMenu);

        if (previousMenu != string.Empty)
          dlg.Add("<<< " + previousMenu);
        dlg.Add("Characters/Actors");
        dlg.Add("Related Series");

        dlg.SelectedLabel = selectedLabel;
        dlg.DoModal(GUIWindowManager.ActiveWindow);
        selectedLabel = dlg.SelectedLabel;

        int selection = selectedLabel + ((previousMenu == string.Empty) ? 1 : 0);
        switch (selection)
        {
          case 0:
            //show previous
            return true;
          case 1:
            ShowCharacterWindow();
            return false;
          case 2:
            ShowRelationsWindow();
            return false;
          default:
            //close menu
            return false;
        }
          }
        }
        */
        private ContextMenuAction ShowContextMenuGroupFilter(string previousMenu)
        {
            GUIListItem currentitem = this.m_Facade.SelectedListItem;
              if (currentitem == null)
            return ContextMenuAction.Exit;

              GroupFilterVM gf = currentitem.TVTag as GroupFilterVM;
              if (gf == null)
            return ContextMenuAction.Exit;

              ContextMenu cmenu = new ContextMenu(gf.GroupFilterName, previousmenu: previousMenu);
              cmenu.AddAction(Translation.RandomSeries, () =>
              {
            RandomWindow_CurrentEpisode = null;
            RandomWindow_CurrentSeries = null;
            RandomWindow_LevelObject = gf;
            RandomWindow_RandomLevel = RandomSeriesEpisodeLevel.GroupFilter;
            RandomWindow_RandomType = RandomObjectType.Series;
            GUIWindowManager.ActivateWindow(Constants.WindowIDs.RANDOM);
              });
              cmenu.AddAction(Translation.RandomEpisode, () =>
              {
            RandomWindow_CurrentEpisode = null;
            RandomWindow_CurrentSeries = null;
            RandomWindow_LevelObject = gf;
            RandomWindow_RandomLevel = RandomSeriesEpisodeLevel.GroupFilter;
            RandomWindow_RandomType = RandomObjectType.Episode;
            GUIWindowManager.ActivateWindow(Constants.WindowIDs.RANDOM);
              });
              return cmenu.Show();
        }
        private ContextMenuAction ShowContextMenuImages(string previousMenu)
        {
            GUIListItem currentitem = this.m_Facade.SelectedListItem;
              if (currentitem == null)
              return ContextMenuAction.Exit;

              AnimeSeriesVM ser = currentitem.TVTag as AnimeSeriesVM;
              IVM v = GetCurrent().Selected;

              string displayName;
              if (ser == null)
              {
              AnimeGroupVM grp = currentitem.TVTag as AnimeGroupVM;
              if (grp == null)
                  return ContextMenuAction.Exit;

              displayName = grp.GroupName;
              GlobalSeriesID = grp.AllSeries[0].AnimeSeriesID.Value;
              }
              else
              {
              displayName = ser.SeriesName;
              GlobalSeriesID = ser.AnimeSeriesID.Value;
              }

              ContextMenu cmenu = new ContextMenu(displayName, previousmenu: previousMenu);
              cmenu.AddAction(Translation.Fanart, ShowFanartWindow);
              cmenu.AddAction(Translation.Posters, ShowPostersWindow);
              cmenu.AddAction(Translation.WideBanners, ShowWideBannersWindow);
              return cmenu.Show();
        }
        private ContextMenuAction ShowContextMenuEpisode(string previousMenu)
        {
            GUIListItem currentitem = this.m_Facade.SelectedListItem;
              if (currentitem == null)
            return ContextMenuAction.Exit;

              GUIDialogMenu dlg = (GUIDialogMenu)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_MENU);
              if (dlg == null)
            return ContextMenuAction.Exit;

              AnimeEpisodeVM episode = currentitem.TVTag as AnimeEpisodeVM;
              if (episode == null)
            return ContextMenuAction.Exit;
              bool isWatched = (episode.IsWatched == 1);

              ContextMenu cmenu = new ContextMenu(episode.EpisodeNumberAndName, previousmenu: previousMenu);
              cmenu.AddAction(isWatched ? Translation.MarkAsUnwatched : Translation.MarkAsWatched, () =>
              {
            BaseConfig.MyAnimeLog.Write("Toggle watched status: {0} - {1}", isWatched, episode);
            episode.ToggleWatchedStatus(!isWatched);
            LoadFacade();
              });
              AnimeSeriesVM ser = GetTopSerie();
              AnimeEpisodeTypeVM e = GetTopEpType();
              enEpisodeType ept = enEpisodeType.Episode;
              if (e != null)
            ept = e.EpisodeType;
              cmenu.AddAction(Translation.MarkAllAsWatched, () =>
              {
              if (ser == null)
              {
              // If we can't get a top series we fallback on what the episode tells us
              BaseConfig.MyAnimeLog.Write("Error during watch state change - series was null!");
              ser = episode.AnimeSeries;
              }

              if (ser?.AnimeSeriesID != null)
              {
              BaseConfig.MyAnimeLog.Write("Marking series as watched: ID -> {0} - Name -> {1}", ser.AnimeSeriesID,
                  ser.SeriesName);

              JMMServerVM.Instance.clientBinaryHTTP.SetWatchedStatusOnSeries(ser.AnimeSeriesID.Value, true,
                  Int32.MaxValue, (int) ept, JMMServerVM.Instance.CurrentUser.JMMUserID);

              if (BaseConfig.Settings.DisplayRatingDialogOnCompletion)
              {
                  Contract_AnimeSeries contract =
                      JMMServerVM.Instance.clientBinaryHTTP.GetSeries(ser.AnimeSeriesID.Value,
                          JMMServerVM.Instance.CurrentUser.JMMUserID);
                  if (contract != null)
                  {
                      ser = new AnimeSeriesVM(contract);
                      if (ser?.AnimeSeriesID != null)
                          ReplaceSerie(ser.AnimeSeriesID.Value, ser);
                      Utils.PromptToRateSeriesOnCompletion(ser);
                  }
              }
              LoadFacade();
              }
              });
              cmenu.AddAction(Translation.MarkAllAsUnwatched, () =>
              {
              if (ser == null)
              {
              // If we can't get a top series we fallback on what the episode tells us
              BaseConfig.MyAnimeLog.Write("Error during watch state change - series was null!");
              ser = episode.AnimeSeries;
              }

              if (ser?.AnimeSeriesID != null)
              {
              BaseConfig.MyAnimeLog.Write("Marking series as un-watched: ID -> {0} - Name -> {1}", ser.AnimeSeriesID,
                  ser.SeriesName);

              JMMServerVM.Instance.clientBinaryHTTP.SetWatchedStatusOnSeries(ser.AnimeSeriesID.Value, false,
                  Int32.MaxValue, (int) ept, JMMServerVM.Instance.CurrentUser.JMMUserID);
              LoadFacade();
              }
              });
              cmenu.AddAction(Translation.MarkAllPreviousAsWatched, () =>
              {
              if (ser == null)
              {
              // If we can't get a top series we fallback on what the episode tells us
              BaseConfig.MyAnimeLog.Write("Error during watch state change - series was null!");
              ser = episode.AnimeSeries;
              }

              if (ser?.AnimeSeriesID != null)
              {
              JMMServerVM.Instance.clientBinaryHTTP.SetWatchedStatusOnSeries(ser.AnimeSeriesID.Value, false,
                  episode.EpisodeNumber - 1, (int)ept, JMMServerVM.Instance.CurrentUser.JMMUserID);

              Contract_AnimeSeries contract =
                  JMMServerVM.Instance.clientBinaryHTTP.GetSeries(ser.AnimeSeriesID.Value,
                      JMMServerVM.Instance.CurrentUser.JMMUserID);
              if (contract != null)
              {
                  ser = new AnimeSeriesVM(contract);
                  if (ser?.AnimeSeriesID != null)
                      ReplaceSerie(ser.AnimeSeriesID.Value, ser);
                  Utils.PromptToRateSeriesOnCompletion(ser);
              }
              LoadFacade();
              }
              });
              cmenu.AddAction(Translation.MarkAllPreviousAsUnwatched, () =>
              {
              if (ser == null)
              {
              // If we can't get a top series we fallback on what the episode tells us
              BaseConfig.MyAnimeLog.Write("Error during watch state change - series was null!");
              ser = episode.AnimeSeries;
              }

              if (ser?.AnimeSeriesID != null)
              {
              JMMServerVM.Instance.clientBinaryHTTP.SetWatchedStatusOnSeries(ser.AnimeSeriesID.Value, true,
                  episode.EpisodeNumber - 1, (int) ept, JMMServerVM.Instance.CurrentUser.JMMUserID);
              LoadFacade();
              }
              });
              cmenu.AddAction(Translation.RateSeries, () =>
              {
              if (ser == null)
              {
              // If we can't get a top series we fallback on what the episode tells us
              BaseConfig.MyAnimeLog.Write("Error during rating = series was null!");
              ser = episode.AnimeSeries;
              }

              if (ser?.AnimeSeriesID != null)
              {
              Utils.PromptToRateSeriesMaually(ser);
              }
              });
              cmenu.Add(Translation.AssociateFileEpisode, () =>
              {
            List<VideoLocalVM> unlinkedVideos = JMMServerHelper.GetUnlinkedVideos();
            if (unlinkedVideos.Count == 0)
            {
              this.Alert(Translation.Error, string.Empty, Translation.NoUnlinkedFilesToSelect);
              return ContextMenuAction.Continue;
            }
            ContextMenu cfmenu = new ContextMenu(Translation.SelectFile);
            foreach (VideoLocalVM fl in unlinkedVideos)
            {
              VideoLocalVM local = fl;
              cfmenu.AddAction(fl.FileName + " - " + fl.ImportFolder.ImportFolderLocation, () =>
              {
            JMMServerHelper.LinkedFileToEpisode(local.VideoLocalID, episode.AnimeEpisodeID);
            LoadFacade();
              });
            }
            cfmenu.Show();
            return ContextMenuAction.Exit;
              });
              cmenu.Add(Translation.RemoveFileFromEpisode, () =>
              {
            List<VideoDetailedVM> vidList = episode.FilesForEpisode;
            if (vidList.Count == 0)
            {
              this.Alert(Translation.Error, string.Empty, Translation.ThisEpisodeHasNoAssociatedFiles);
              return ContextMenuAction.Continue;
            }
            ContextMenu cfmenu = new ContextMenu(Translation.SelectFile);
            foreach (VideoDetailedVM fl in vidList)
            {
              VideoDetailedVM local = fl;
              cfmenu.AddAction(Path.GetFileName(fl.FileName), () =>
              {
            string res = JMMServerVM.Instance.clientBinaryHTTP.RemoveAssociationOnFile(local.VideoLocalID, episode.AniDB_EpisodeID);
            if (!String.IsNullOrEmpty(res))
              Utils.DialogMsg(Translation.Error, res);
            LoadFacade();
              });
            }
            cfmenu.Show();
            return ContextMenuAction.Exit;
              });
              cmenu.AddAction(Translation.DownloadThisEpisode, () => DownloadHelper.SearchEpisode(episode));
              cmenu.Add(Translation.PostProcessing + " ...", () => ShowContextMenuPostProcessing(episode.EpisodeNumberAndName));

              return cmenu.Show();
        }
        private ContextMenuAction ShowContextMenuGroup(string previousMenu)
        {
            GUIListItem currentitem = m_Facade.SelectedListItem;
              if (currentitem == null)
              return ContextMenuAction.Exit;
              AnimeGroupVM grp = currentitem.TVTag as AnimeGroupVM;
              if (grp == null)
              return ContextMenuAction.Exit;

              ContextMenu cmenu = new ContextMenu(grp.GroupName, previousmenu: previousMenu);

              if (grp.SubGroups.Count == 0)
              {
              cmenu.AddAction(grp.IsFave == 1 ? Translation.RemoveFromFavorites : Translation.AddToFavorites, () =>
              {
                  grp.IsFave = grp.IsFave == 1 ? 0 : 1;
                  grp.Save();
                  EvaluateVisibility();
              });
              }

              cmenu.AddAction(Translation.MarkAllAsWatched, () =>
              {
              foreach (AnimeSeriesVM ser in grp.AllSeries)
              {
                  if (ser.AnimeSeriesID.HasValue)
                      JMMServerHelper.SetWatchedStatusOnSeries(true, Int32.MaxValue, ser.AnimeSeriesID.Value);
              }
              LoadFacade();
              });
              cmenu.AddAction(Translation.MarkAllAsUnwatched, () =>
              {
              foreach (AnimeSeriesVM ser in grp.AllSeries)
              {
                  if (ser.AnimeSeriesID.HasValue)
                      JMMServerHelper.SetWatchedStatusOnSeries(false, Int32.MaxValue, ser.AnimeSeriesID.Value);
              }
              LoadFacade();
              });
              if (grp.AllSeries.Count == 1)
              {
              cmenu.AddAction(Translation.SeriesInformation, () => ShowAnimeInfoWindow(grp.AllSeries[0]));
              }
              History h = GetCurrent();
              if (h.Listing is GroupFilterVM)
              {
              GroupFilterVM gf = (GroupFilterVM) h.Listing;
              cmenu.Add(Translation.QuickSort + " ...", () =>
              {
                  string sortType = "";
                  GroupFilterSortDirection sortDirection = GroupFilterSortDirection.Asc;
                  if (gf.GroupFilterID.HasValue)
                  {
                      if (GroupFilterQuickSorts.ContainsKey(gf.GroupFilterID.Value))
                          sortDirection = GroupFilterQuickSorts[gf.GroupFilterID.Value].SortDirection;
                      if (!Utils.DialogSelectGFQuickSort(ref sortType, ref sortDirection, gf.GroupFilterName))
                      {
                          if (!GroupFilterQuickSorts.ContainsKey(gf.GroupFilterID.Value))
                              GroupFilterQuickSorts[gf.GroupFilterID.Value] = new QuickSort();
                          GroupFilterQuickSorts[gf.GroupFilterID.Value].SortType = sortType;
                          GroupFilterQuickSorts[gf.GroupFilterID.Value].SortDirection = sortDirection;
                          LoadFacade();
                          return ContextMenuAction.Exit;
                      }
                  }
                  return ContextMenuAction.Continue;
              });
              if ((gf.GroupFilterID.HasValue) && (GroupFilterQuickSorts.ContainsKey(gf.GroupFilterID.Value)))
              {
                  cmenu.AddAction(Translation.RemoveQuickSort, () =>
                  {
                      GroupFilterQuickSorts.Remove(gf.GroupFilterID.Value);
                      LoadFacade();
                  });
              }
              }

              // ReSharper disable ImplicitlyCapturedClosure
              cmenu.AddAction(Translation.RandomSeries, () =>
              // ReSharper restore ImplicitlyCapturedClosure
              {
              RandomWindow_CurrentEpisode = null;
              RandomWindow_CurrentSeries = null;
              RandomWindow_LevelObject = grp;
              RandomWindow_RandomLevel = RandomSeriesEpisodeLevel.Group;
              RandomWindow_RandomType = RandomObjectType.Series;
              GUIWindowManager.ActivateWindow(Constants.WindowIDs.RANDOM);
              });
              // ReSharper disable ImplicitlyCapturedClosure
              cmenu.AddAction(Translation.RandomEpisode, () =>
              // ReSharper restore ImplicitlyCapturedClosure
              {
              RandomWindow_CurrentEpisode = null;
              RandomWindow_CurrentSeries = null;
              RandomWindow_LevelObject = grp;
              RandomWindow_RandomLevel = RandomSeriesEpisodeLevel.Group;
              RandomWindow_RandomType = RandomObjectType.Episode;
              GUIWindowManager.ActivateWindow(Constants.WindowIDs.RANDOM);
              });

              cmenu.Add(Translation.AdvancedOptions + " ...", () => ShowContextMenuAdvancedOptionsGroup(grp.GroupName));

              return cmenu.Show();
        }
        private ContextMenuAction SearchTheTvDBMenu(AnimeSeriesVM ser, string previousMenu)
        {
            //string searchCriteria = "";
              int aniDBID = ser.AniDB_Anime.AnimeID;
              ContextMenu cmenu = new ContextMenu(Translation.SearchTheTvDB, previousMenu);
              cmenu.Add(Translation.SearchUsing + ": " + ser.AniDB_Anime.FormattedTitle, () => SearchTheTvDB(ser, ser.AniDB_Anime.FormattedTitle, Translation.SearchTheTvDB));
              cmenu.Add(Translation.ManualSearch, () =>
              {
            if (Utils.DialogText(ref searchText, GetID))
              return SearchTheTvDB(ser, searchText, Translation.SearchTheTvDB);
            return ContextMenuAction.Continue;
              });

              List<CrossRef_AniDB_TvDBVMV2> CrossRef_AniDB_TvDBResult = new List<CrossRef_AniDB_TvDBVMV2>();
              List<JMMServerBinary.Contract_Azure_CrossRef_AniDB_TvDB> xrefs = new List<Contract_Azure_CrossRef_AniDB_TvDB>(JMMServerVM.Instance.clientBinaryHTTP.GetTVDBCrossRefWebCache(aniDBID, false));
              if (xrefs != null && xrefs.Count > 0)
              {
            string xrefSummary = string.Empty;
            foreach (JMMServerBinary.Contract_Azure_CrossRef_AniDB_TvDB xref in xrefs)
            {

              CrossRef_AniDB_TvDBVMV2 xrefAzure = new CrossRef_AniDB_TvDBVMV2(xref);
              CrossRef_AniDB_TvDBResult.Add(xrefAzure);
              xrefSummary += Environment.NewLine;
              xrefSummary += string.Format("AniDB {0}:{1} -- TvDB {2}: {3}:{4}",
            xref.AniDBStartEpisodeType, xref.AniDBStartEpisodeNumber, xref.TvDBTitle, xref.TvDBSeasonNumber, xref.TvDBStartEpisodeNumber);
            }

            cmenu.AddAction(Translation.CommunitySays + ": " + xrefSummary, () =>
            {
              string res = JMMServerVM.Instance.clientBinaryHTTP.RemoveLinkAniDBTvDBForAnime(aniDBID);
              if (res.Length > 0)
            Utils.DialogMsg(Translation.Error, res);
              else
              {
            foreach (CrossRef_AniDB_TvDBVMV2 xref in CrossRef_AniDB_TvDBResult)
            {
              LinkAniDBToTVDB(ser, xref.AnimeID, (enEpisodeType)xref.AniDBStartEpisodeType,
                              xref.AniDBStartEpisodeNumber, xref.TvDBID,
                              xref.TvDBSeasonNumber, xref.TvDBStartEpisodeNumber);
            }
              }
            });
              }
              return cmenu.Show();
        }
        private ContextMenuAction SearchTheTvDB(AnimeSeriesVM ser, string searchCriteria, string previousMenu)
        {
            if (searchCriteria.Length == 0)
            return ContextMenuAction.Exit;

              int aniDBID = ser.AniDB_Anime.AnimeID;

              List<TVDBSeriesSearchResultVM> TVDBSeriesSearchResults = new List<TVDBSeriesSearchResultVM>();
              List<JMMServerBinary.Contract_TVDBSeriesSearchResult> tvResults = new List<Contract_TVDBSeriesSearchResult>(JMMServerVM.Instance.clientBinaryHTTP.SearchTheTvDB(searchCriteria.Trim()));
              foreach (JMMServerBinary.Contract_TVDBSeriesSearchResult tvResult in tvResults)
            TVDBSeriesSearchResults.Add(new TVDBSeriesSearchResultVM(tvResult));

              BaseConfig.MyAnimeLog.Write("Found {0} tvdb results for {1}", TVDBSeriesSearchResults.Count, searchCriteria);
              if (TVDBSeriesSearchResults.Count > 0)
              {
            ContextMenu cmenu = new ContextMenu(Translation.TVDBSearchResults, previousmenu: previousMenu);
            foreach (TVDBSeriesSearchResultVM res in TVDBSeriesSearchResults)
            {
              TVDBSeriesSearchResultVM local = res;
              string disp = String.Format("{0} ({1}) / {2}", res.SeriesName, res.Language, res.Id);
              cmenu.AddAction(disp, () => LinkAniDBToTVDB(ser, aniDBID, enEpisodeType.Episode, 1, local.SeriesID, 1, 1));
            }
            return cmenu.Show();
              }
              this.Alert(Translation.SearchResults, string.Empty, Translation.NoResultsFound);
              return ContextMenuAction.Exit;
        }
        private ContextMenuAction SearchTheMovieDBMenu(AnimeSeriesVM ser, string previousMenu)
        {
            int aniDBID = ser.AniDB_Anime.AnimeID;
              ContextMenu cmenu = new ContextMenu(Translation.SearchTheMovieDB, previousMenu);
              cmenu.Add(Translation.SearchUsing + ": " + ser.AniDB_Anime.FormattedTitle, () => SearchTheMovieDB(ser, ser.AniDB_Anime.FormattedTitle, Translation.SearchTheMovieDB));
              cmenu.Add(Translation.ManualSearch, () =>
              {
            searchText = ser.AniDB_Anime.FormattedTitle;
            if (Utils.DialogText(ref searchText, GetID))
              return SearchTheMovieDB(ser, ser.AniDB_Anime.FormattedTitle, Translation.SearchTheMovieDB);
            return ContextMenuAction.Continue;
              });
              Contract_CrossRef_AniDB_OtherResult xref = JMMServerVM.Instance.clientBinaryHTTP.GetOtherAnimeCrossRefWebCache(aniDBID, (int)CrossRefType.MovieDB);
              if (xref != null)
              {

            CrossRef_AniDB_OtherResultVM crossrossRefAniDbOtherResult = new CrossRef_AniDB_OtherResultVM(xref);
            cmenu.AddAction(Translation.CommunitySays + ": " + crossrossRefAniDbOtherResult.CrossRefID, () => LinkAniDBToMovieDB(ser, crossrossRefAniDbOtherResult.AnimeID, Int32.Parse(crossrossRefAniDbOtherResult.CrossRefID)));
              }
              return cmenu.Show();
        }
        /*
        private bool ShowOptionsMenu(string previousMenu)
        {
          GUIDialogMenu dlg = (GUIDialogMenu)GUIWindowManager.GetWindow((int)GUIWindow.Window.WINDOW_DIALOG_MENU);
          if (dlg == null)
        return true;

          //keep showing the dialog until the user closes it
          int selectedLabel = 0;
          string currentMenu = "Options";
          while (true)
          {
        dlg.Reset();
        dlg.SetHeading(currentMenu);

        if (previousMenu != string.Empty)
          dlg.Add("<<< " + previousMenu);
        dlg.Add("AniDB >>>");
        dlg.Add("Display >>>");

        dlg.SelectedLabel = selectedLabel;
        dlg.DoModal(GUIWindowManager.ActiveWindow);
        selectedLabel = dlg.SelectedLabel;

        int selection = selectedLabel + ((previousMenu == string.Empty) ? 1 : 0);
        switch (selection)
        {
          case 0:
        //show previous
        return true;
          case 1:
        //if (!ShowOptionsAniDBMenu(currentMenu))
        //	return false;
        break;
          case 2:
        if (!ShowOptionsDisplayMenu(currentMenu))
          return false;
        break;
          default:
        //close menu
        return false;
        }
          }
        }
        */
        private ContextMenuAction ShowOptionsDisplayMenu(string previousMenu)
        {
            string findFilter = String.Format(Translation.FindOnlyShowMatches,
              settings.FindFilter ? Translation.On : Translation.Off);
              ContextMenu cmenu = new ContextMenu(Translation.DisplayOptions, previousmenu: previousMenu);
              string askBeforeStreaming = String.Format(Translation.AskBeforeStartStreamingPlaybackDialogText,
              settings.AskBeforeStartStreamingPlayback ? Translation.On : Translation.Off);

              cmenu.AddAction(findFilter, () =>
              {
              settings.FindFilter = !settings.FindFilter;
              if (searchTimer.Enabled)
              {
                  SaveOrRestoreFacadeItems(false);
                  DoSearch(m_Facade.SelectedListItemIndex);
              }
              settings.Save();
              });

              cmenu.AddAction(askBeforeStreaming, () =>
              {
              settings.AskBeforeStartStreamingPlayback = !settings.AskBeforeStartStreamingPlayback;
              settings.Save();
              });

              return cmenu.Show();
        }
        private ContextMenuAction ShowContextMenuMAL(AnimeSeriesVM ser, string previousMenu)
        {
            GUIListItem currentitem = m_Facade.SelectedListItem;
              if (currentitem == null)
            return ContextMenuAction.Exit;
              string displayName;

              if (ser.CrossRef_AniDB_MAL != null && ser.CrossRef_AniDB_MAL.Count > 0)
            displayName = ser.CrossRef_AniDB_MAL.Count == 1
            ? ser.CrossRef_AniDB_MAL[0].MALTitle
            : Translation.MultipleLinks;
              else
            return ContextMenuAction.PreviousMenu;
              ContextMenu cmenu = new ContextMenu(displayName, previousmenu: previousMenu);
              cmenu.AddAction(Translation.RemoveMALAssociation, () =>
              {
            foreach (CrossRef_AniDB_MALVM xref in ser.CrossRef_AniDB_MAL)
            {
              JMMServerVM.Instance.clientBinaryHTTP.RemoveLinkAniDBMAL(xref.AnimeID, xref.StartEpisodeType, xref.StartEpisodeNumber);
            }
              });
              return cmenu.Show();
        }
        private ContextMenuAction ShowSeasonSelectionMenuTvDB(AnimeSeriesVM ser, int animeID, int tvdbid, string previousMenu)
        {
            try
              {
            List<int> seasons = new List<int>(JMMServerVM.Instance.clientBinaryHTTP.GetSeasonNumbersForSeries(tvdbid));
            if (seasons.Count == 0)
            {
              this.Alert(Translation.SeasonResults, string.Empty, Translation.NoSeasonsFound);
              return ContextMenuAction.Exit;
            }
            ContextMenu cmenu = new ContextMenu(Translation.SelectSeason, previousmenu: previousMenu);
            foreach (int season in seasons)
            {
              int local = season;
              cmenu.AddAction(Translation.Season + " " + season.ToString(Globals.Culture), () =>
              {
            JMMServerVM.Instance.clientBinaryHTTP.RemoveLinkAniDBTvDBForAnime(animeID);
            LinkAniDBToTVDB(ser, animeID, enEpisodeType.Episode, 1, tvdbid, local, 1);
              });
            }
            return cmenu.Show();
              }
              catch (Exception ex)
              {
            BaseConfig.MyAnimeLog.Write("Error in ShowSeasonSelectionMenu:: {0}", ex);
              }

              return ContextMenuAction.Exit;
        }
        private ContextMenuAction SearchMAL(AnimeSeriesVM ser, string searchCriteria, string previousMenu)
        {
            if (searchCriteria.Length == 0)
            return ContextMenuAction.Exit;

              int aniDbid = ser.AniDB_Anime.AnimeID;

              List<MALSearchResultVM> malSearchResults = new List<MALSearchResultVM>();
              List<Contract_MALAnimeResponse> malResults = new List<Contract_MALAnimeResponse>(JMMServerVM.Instance.clientBinaryHTTP.SearchMAL(searchCriteria.Trim()));
              foreach (Contract_MALAnimeResponse malResult in malResults)
            malSearchResults.Add(new MALSearchResultVM(malResult));

              BaseConfig.MyAnimeLog.Write("Found {0} MAL results for {1}", malSearchResults.Count, searchCriteria);

              if (malSearchResults.Count > 0)
              {
            ContextMenu cmenu = new ContextMenu(Translation.SearchResults, previousmenu: previousMenu);
            foreach (MALSearchResultVM res in malSearchResults)
            {
              MALSearchResultVM local = res;
              cmenu.AddAction(String.Format("{0} ({1} {2})", res.title, res.episodes, Translation.EpisodesShort), () => LinkAniDBToMAL(ser, aniDbid, local.id, local.title));

            }
            return cmenu.Show();
              }
              this.Alert(Translation.SearchResults, string.Empty, Translation.NoResultsFound);
              return ContextMenuAction.Exit;
        }