internal static void showRatingsDialog(DBTable item, bool auto)
        {
            if (item == null) return;
            MPTVSeriesLog.Write("Asking to rate", MPTVSeriesLog.LogLevel.Debug);

            GUIListItem pItem = null;
            Listlevel level = item is DBEpisode ? Listlevel.Episode : Listlevel.Series;

            string value = "0";
            string dlgHeading = (level == Listlevel.Episode ? Translation.RateEpisode : Translation.RateSeries);

            if (System.IO.File.Exists(GUIGraphicsContext.Skin + @"\TVSeries.RatingDialog.xml"))
            {
                GUIUserRating ratingDlg = (GUIUserRating)GUIWindowManager.GetWindow(GUIUserRating.ID);
                ratingDlg.Reset();
                ratingDlg.SetHeading((level == Listlevel.Episode ? Translation.RateEpisode : Translation.RateSeries));
                if (level == Listlevel.Series)
                {
                    ratingDlg.SetLine(1, string.Format(Translation.RateDialogLabel, item.ToString()));
                }
                else
                {
                    ratingDlg.SetLine(1, string.Format(Translation.RateDialogLabel, Translation.Episode));
                    ratingDlg.SetLine(2, item.ToString());
                }

                if (DBOption.GetOptions(DBOption.cRatingDisplayStars) == 10)
                {
                    ratingDlg.DisplayStars = GUIUserRating.StarDisplay.TEN_STARS;
                    ratingDlg.Rating = DBOption.GetOptions(DBOption.cDefaultRating);
                }
                else
                {
                    ratingDlg.DisplayStars = GUIUserRating.StarDisplay.FIVE_STARS;
                    ratingDlg.Rating = (int)(DBOption.GetOptions(DBOption.cDefaultRating) / 2);
                }

                ratingDlg.DoModal(ratingDlg.GetID);
                if (ratingDlg.IsSubmitted)
                {
                    if (ratingDlg.DisplayStars == GUIUserRating.StarDisplay.FIVE_STARS)
                        value = (ratingDlg.Rating * 2).ToString();
                    else
                        value = ratingDlg.Rating.ToString();
                }
                else return;
            }
            else
            {
                IDialogbox dlg = (IDialogbox)GUIWindowManager.GetWindow((int)GUIWindow.Window.WINDOW_DIALOG_MENU);
                dlg.Reset();
                dlg.SetHeading(dlgHeading + ": " + item.ToString());

                // List Rating 1 Star to 10 Stars
                // Re-use existing menu labels to represent star value
                pItem = new GUIListItem(Translation.RatingStar);
                dlg.Add(pItem);
                pItem.ItemId = 1;

                for (int i = 2; i < 11; i++)
                {
                    pItem = new GUIListItem(Translation.RatingStars);
                    dlg.Add(pItem);
                    pItem.ItemId = i;
                }

                // Reset Rating (Rate = 0)
                pItem = new GUIListItem(Translation.ResetRating);
                dlg.Add(pItem);
                pItem.ItemId = 11;

                if (auto)
                {
                    pItem = new GUIListItem(Translation.DontAskToRate);
                    dlg.Add(pItem);
                    pItem.ItemId = 12;
                }

                dlg.DoModal(GUIWindowManager.ActiveWindow);

                if (dlg.SelectedId == -1 || dlg.SelectedId > 12) return; // cancelled
                if (dlg.SelectedLabelText == Translation.DontAskToRate && auto)
                {
                    DBOption.SetOptions(DBOption.cAskToRate, false);
                    return;
                }
                // Get Rating Value
                value = dlg.SelectedId.ToString();
                // Reset rating
                if (dlg.SelectedLabelText == Translation.ResetRating)
                    value = "0";
            }

            new Thread(delegate(object o)
            {
                DBTable tItem = ((KeyValuePair<DBTable, string>)o).Key;
                string tValue = ((KeyValuePair<DBTable, string>)o).Value;

                Listlevel tLevel = tItem is DBEpisode ? Listlevel.Episode : Listlevel.Series;
                string id = tItem[tLevel == Listlevel.Episode ? DBOnlineEpisode.cID : DBOnlineSeries.cID];

                // Submit rating online database
                int rating = -1;
                if (Int32.TryParse(tValue, out rating))
                {
                    Online_Parsing_Classes.OnlineAPI.SubmitRating(tLevel == Listlevel.Episode ? Online_Parsing_Classes.OnlineAPI.RatingType.episode : Online_Parsing_Classes.OnlineAPI.RatingType.series, id, rating);

                    if (level == Listlevel.Episode)
                        FollwitConnector.Rate((DBEpisode)item, rating);
                    else
                        FollwitConnector.Rate((DBSeries)item, rating);
                }

            })
            {
                IsBackground = true,
                Name = "tvdb rating sender"
            }.Start(new KeyValuePair<DBTable, string>(item, value));

            // Apply to local database
            item["myRating"] = value;

            // recalculate rating/votes
            double currRating = string.IsNullOrEmpty(item["Rating"]) ? 0.0 : (double)item["Rating"];
            double currCount = string.IsNullOrEmpty(item["RatingCount"]) ? 0.0 : (double)item["RatingCount"];
            item["Rating"] = ((currRating * currCount) + double.Parse(value)) / (currCount + 1);
            item["RatingCount"] = currCount + 1;

            // tell any listeners that user rated episode/series
            if (RateItem != null)
                RateItem(item, value);

            item.Commit();
        }