public frmEnterLeagueResults(League league)
        {
            InitializeComponent();

            League = league;
            this.Text = League.Name + " -- Enter League Results";
            this.Tag = League.Name;

            foreach (PlayerRecord player in Config.Settings.Players)
                cmbName.Items.Add(player.Name);

            lstAchievements.BeginUpdate();
            lstAchievements.ListViewItemSorter = new AchievementListComparer();
            foreach (Achievement achievement in League.Achievements)
            {
                ListViewItem item = new ListViewItem();
                item.Text = achievement.Name;
                item.Tag = achievement;
                item.SubItems.Add(achievement.Category);
                item.SubItems.Add("0");
                lstAchievements.Items.Add(item);
            }
            lstAchievements.Sort();
            lstAchievements.EndUpdate();
        }
        public frmLeagueOptions(League ToEdit = null, bool isNew = false)
        {
            InitializeComponent();

            if (ToEdit != null) _League = ToEdit;
            IsNew = isNew;

            txtName.Text = League.Name;
            txtLocation.Text = League.Location;
            txtForumURL.Text = League.ForumURL;
            dtStartDate.MinDate = League.StartDate > DateTime.Now ? DateTime.Now : League.StartDate;
            dtStartDate.Value = League.StartDate;
            dtEndDate.MinDate = League.EndDate > DateTime.Now ? DateTime.Now : League.EndDate;
            dtEndDate.Value = League.EndDate;

            lstAchievements.ListViewItemSorter = new AchievementListComparer();
            lstAchievements.BeginUpdate();
            foreach (Achievement achievement in League.Achievements)
            {
                ListViewItem item = new ListViewItem();
                item.Name = achievement.ToString();
                item.Text = achievement.Name;
                item.Tag = achievement;
                item.SubItems.Add(achievement.Category);
                item.SubItems.Add(achievement.MaxAllowed.ToString());
                item.SubItems.Add(achievement.Points.ToString());
                item.SubItems.Add(achievement.PointsEarnedEachTime ? "Yes" : "No");
                item.SubItems.Add(achievement.MustEarnAllToGetPoints ? "Yes" : "No");
                lstAchievements.Items.Add(item);
            }
            lstAchievements.Sort();
            lstAchievements.EndUpdate();

            FillComboBoxes();
            cmbFormat.SelectedItem = League.Format.ToString();
        }
        private void btnImport_Click(object sender, EventArgs e)
        {
            var targets = new Queue<string>();
            using (var dialog = new OpenFileDialog())
            {
                dialog.CheckFileExists = true;
                dialog.CheckPathExists = true;
                dialog.DefaultExt = ".export";
                dialog.ValidateNames = true;
                dialog.Title = "Select the file or files to Import...";
                dialog.RestoreDirectory = true;
                dialog.Multiselect = true;
                dialog.Filter = "Export Files (*.export)|*.export|All Files (*.*)|*.*";
                if (dialog.ShowDialog() == DialogResult.Cancel) return;

                foreach (string filename in dialog.FileNames)
                    targets.Enqueue(filename);
            }

            while (targets.Count > 0)
            {
                string target = targets.Dequeue();
                var xml = new XmlDocument();
                try
                {
                    xml.Load(target);
                }
                catch
                {
                    MessageBox.Show("An error occurred while trying to import " + Path.GetFileName(target) +
                                    ", it may not be an export or it is corrupted.", "Failed to Import",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                    continue;
                }

                XmlNode exportNode = xml.SelectSingleNode("//Export");
                if (exportNode == null)
                {
                    MessageBox.Show("An error occurred while trying to import " + Path.GetFileName(target) +
                                    ", it does not contain an exported Event.", "Failed to Import", MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                    continue;
                }

                XmlNodeList playerNodes = exportNode.SelectNodes("Players/Player");
                var newPlayers = new List<PlayerRecord>();
                if (playerNodes != null)
                {
                    foreach (XmlNode playerNode in playerNodes)
                    {
                        var record = new PlayerRecord(playerNode);
                        if (Config.Settings.GetPlayer(record.ID) == null)
                            newPlayers.Add(record);
                    }
                }

                XmlNode tournamentNode = exportNode.SelectSingleNode("Tournament");
                XmlNode leagueNode = exportNode.SelectSingleNode("League");
                if (tournamentNode != null)
                {
                    Tournament tournament = null;
                    try
                    {
                        tournament = new Tournament(tournamentNode);
                    }
                    catch
                    {
                        MessageBox.Show("An error occurred while trying to import " + Path.GetFileName(target) +
                                        ", found a Tournament record but failed to parse it.", "Failed to Import",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error);
                        continue;
                    }
                    Tournament tempTournament = Config.Settings.GetTournament(tournament.Name);
                    bool alreadyExists = false;
                    string prefix = "";
                    while (tempTournament != null)
                    {
                        alreadyExists = true;
                        prefix += "!";
                        tempTournament = Config.Settings.GetTournament(prefix + " " + tournament.Name);
                    }

                    string message = "The following information will be imported:\r\n";
                    message += "Tournament: " + tournament.Name + "\r\n";
                    if (alreadyExists)
                        message += "(A Tournament already exists with this name, adding \"" + prefix +
                                   "\" to the name.)\r\n";
                    if (newPlayers.Count > 0)
                        message += "New Players: " + newPlayers.Count.ToString() + " (out of " +
                                   playerNodes.Count.ToString() + " found.)\r\n";
                    message += "\r\nPress OK to import this Event.";

                    if (MessageBox.Show(message, "Confirm Import", MessageBoxButtons.OKCancel,
                                        MessageBoxIcon.Information,
                                        MessageBoxDefaultButton.Button1) == DialogResult.Cancel)
                        continue;

                    foreach (PlayerRecord record in newPlayers)
                        Config.Settings.Players.Add(record);

                    if (prefix.Length > 0) tournament.Name = prefix + " " + tournament.Name;
                    Config.Settings.Tournaments.Add(tournament);
                    Config.Settings.SaveEvents();

                    lstEvents.BeginUpdate();
                    var item = new ListViewItem();
                    item.Name = tournament.Name;
                    item.Text = tournament.Name;
                    item.SubItems.Add("Tournament");
                    item.SubItems.Add(tournament.Location);
                    item.SubItems.Add(tournament.Date.ToShortDateString());
                    item.SubItems.Add(tournament.Players.Count.ToString());
                    if (tournament.Rounds.Count == 0)
                        item.SubItems.Add("Not Started");
                    else if (tournament.Rounds.Count == tournament.TotalRounds &&
                             tournament.Rounds[tournament.TotalRounds - 1].Completed)
                        item.SubItems.Add("Finished");
                    else
                    {
                        int roundNum = tournament.Rounds.Count;
                        if (tournament.Rounds[roundNum - 1].Completed)
                            item.SubItems.Add("Round " + roundNum.ToString() + " of " +
                                              tournament.TotalRounds.ToString() + " Done");
                        else
                            item.SubItems.Add("Round " + roundNum.ToString() + " of " +
                                              tournament.TotalRounds.ToString() + " Active");
                    }
                    lstEvents.Items.Add(item);
                    lstEvents.Sort();
                    lstEvents.EndUpdate();
                }
                else if (leagueNode != null)
                {
                    var pastReference = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
                    League league = null;
                    try
                    {
                        league = new League(leagueNode);
                    }
                    catch
                    {
                        MessageBox.Show("An error occurred while trying to import " + Path.GetFileName(target) +
                                        ", found a League record but failed to parse it.", "Failed to Import",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error);
                        continue;
                    }
                    League tempLeague = Config.Settings.GetLeague(league.Name);
                    bool alreadyExists = false;
                    string prefix = "";
                    while (tempLeague != null)
                    {
                        alreadyExists = true;
                        prefix += "!";
                        tempLeague = Config.Settings.GetLeague(prefix + " " + league.Name);
                    }

                    string message = "The following information will be imported:\r\n";
                    message += "League: " + league.Name + "\r\n";
                    if (alreadyExists)
                        message += "(A League already exists with this name, adding \"" + prefix +
                                   "\" to the name.)\r\n";
                    if (newPlayers.Count > 0)
                        message += "New Players: " + newPlayers.Count.ToString() + " (out of " +
                                   playerNodes.Count.ToString() + " found.)\r\n";
                    message += "\r\nPress OK to import this Event.";

                    if (MessageBox.Show(message, "Confirm Import", MessageBoxButtons.OKCancel,
                                        MessageBoxIcon.Information,
                                        MessageBoxDefaultButton.Button1) == DialogResult.Cancel)
                        continue;

                    foreach (PlayerRecord record in newPlayers)
                        Config.Settings.Players.Add(record);

                    if (prefix.Length > 0) league.Name = prefix + " " + league.Name;
                    Config.Settings.Leagues.Add(league);
                    Config.Settings.SaveEvents();

                    lstEvents.BeginUpdate();

                    var item = new ListViewItem();
                    item.Name = league.Name;
                    item.Text = league.Name;
                    item.SubItems.Add("League");
                    item.SubItems.Add(league.Location);
                    item.SubItems.Add(league.StartDate.ToShortDateString());
                    item.SubItems.Add(league.Players.Count.ToString());
                    if (league.MatchesPlayed.Count == 0)
                        item.SubItems.Add("Not Started");
                    else if (league.EndDate < pastReference)
                        item.SubItems.Add("Finished");
                    else
                    {
                        item.SubItems.Add(league.MatchesPlayed.Count.ToString() + " Result" +
                                          (league.MatchesPlayed.Count == 1 ? "" : "s") + " Entered");
                    }
                    lstEvents.Items.Add(item);
                    lstEvents.Sort();
                    lstEvents.EndUpdate();
                }
                else
                {
                    MessageBox.Show("An error occurred while trying to import " + Path.GetFileName(target) +
                                    ", the Event information was not found.", "Failed to Import", MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                    continue;
                }
            }
        }
        /// <summary>
        ///     Load all available data from the drive.
        /// </summary>
        public void Load()
        {
            Players.Clear();
            Tournaments.Clear();
            Leagues.Clear();

            var xml = new XmlDocument();
            if (File.Exists(Path.Combine(Program.BasePath, "LuciusIncidentLogbook.dat")))
            {
                xml.Load(Path.Combine(Program.BasePath, "LuciusIncidentLogbook.dat"));
                var baseNode = xml.SelectSingleNode("//Settings");

                if (baseNode != null)
                {
                    var node = baseNode.SelectSingleNode("SeparateTournamentFiles");
                    if (node != null)
                        SeparateEventFiles = Convert.ToBoolean(node.InnerText);
                    node = baseNode.SelectSingleNode("ArchivePath");
                    if (node != null)
                        ArchivePath = node.InnerText;
                    node = baseNode.SelectSingleNode("ConfirmNewRounds");
                    if (node != null)
                        ConfirmNewRounds = Convert.ToBoolean(node.InnerText);
                    node = baseNode.SelectSingleNode("OpenAfterPlayersAdded");
                    if (node != null)
                        OpenAfterPlayersAdded = Convert.ToBoolean(node.InnerText);
                    node = baseNode.SelectSingleNode("AssignTablesRandomly");
                    if (node != null)
                        AssignTablesRandomly = Convert.ToBoolean(node.InnerText);
                    node = baseNode.SelectSingleNode("AutoEnableWebServer");
                    if (node != null)
                        AutoEnableWebServer = Convert.ToBoolean(node.InnerText);
                    node = baseNode.SelectSingleNode("WebServerPassword");
                    if (node != null)
                        WebServerPassword = node.InnerText;
                    node = baseNode.SelectSingleNode("WebServerPort");
                    if (node != null)
                        WebServerPort = Convert.ToInt32(node.InnerText);
                    node = baseNode.SelectSingleNode("AutoCheckForUpdates");
                    if (node != null)
                        AutoCheckForUpdates = Convert.ToBoolean(node.InnerText);
                    node = baseNode.SelectSingleNode("BackupsToKeep");
                    if (node != null)
                        BackupsToKeep = Convert.ToInt32(node.InnerText);
                    node = baseNode.SelectSingleNode("BackupPath");
                    if (node != null)
                        BackupPath = node.InnerText;
                    node = baseNode.SelectSingleNode("Notes");
                    if (node != null)
                        Notes = node.InnerText;
                    node = baseNode.SelectSingleNode("SkipTiedRanks");
                    if (node != null)
                        SkipTiedRanks = Convert.ToBoolean(node.InnerText);
                    node = baseNode.SelectSingleNode("ForumName");
                    if (node != null)
                        ForumName = node.InnerText;
                    node = baseNode.SelectSingleNode("DisableReportIfSent");
                    if (node != null)
                        DisableReportIfSent = Convert.ToBoolean(node.InnerText);
                    node = baseNode.SelectSingleNode("Email/FromName");
                    if (node != null)
                        SMTPFromName = node.InnerText;
                    node = baseNode.SelectSingleNode("Email/FromAddress");
                    if (node != null)
                        SMTPFromAddress = node.InnerText;
                    node = baseNode.SelectSingleNode("Email/Server");
                    if (node != null)
                        SMTPServer = node.InnerText;
                    node = baseNode.SelectSingleNode("Email/Port");
                    if (node != null)
                        SMTPPort = Convert.ToInt32(node.InnerText);
                    node = baseNode.SelectSingleNode("Email/Username");
                    if (node != null)
                        SMTPUsername = node.InnerText;
                    node = baseNode.SelectSingleNode("Email/Password");
                    if (node != null)
                        SMTPPassword = Encryption.DecryptString(node.InnerText);
                }
            }
            if (!Directory.Exists(ArchivePath)) Directory.CreateDirectory(ArchivePath);
            if (!Directory.Exists(BackupPath)) Directory.CreateDirectory(BackupPath);

            if (File.Exists(Path.Combine(Program.BasePath, "Players.dat")))
            {
                xml.Load(Path.Combine(Program.BasePath, "Players.dat"));
                XmlNode baseNode = xml.SelectSingleNode("//Players");
                if (baseNode != null)
                {
                    XmlNodeList playerNodes = xml.SelectNodes("//Players/Player");
                    if (playerNodes != null)
                    {
                        foreach (XmlNode playerNode in playerNodes)
                        {
                            var record = new PlayerRecord(playerNode);
                            Players.Add(record);
                        }
                    }
                }
            }

            var needsSave = false;
            if (SeparateEventFiles)
            {
                string targetPath = Path.Combine(Program.BasePath, "Events");
                if (!Directory.Exists(targetPath)) Directory.CreateDirectory(targetPath);
                string[] tournamentFiles = Directory.GetFiles(targetPath, "*.tournament.dat",
                                                              SearchOption.TopDirectoryOnly);
                foreach (string tournamentFile in tournamentFiles)
                {
                    try
                    {
                        xml.Load(tournamentFile);
                        XmlNode tournamentNode = xml.SelectSingleNode("//Tournament");
                        if (tournamentNode != null)
                        {
                            var tournament = new Tournament(tournamentNode);
                            Tournaments.Add(tournament);
                            if (tournament.NeedsSave) needsSave = true;
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Unexpected error while parsing tournaments in '" + tournamentFile +
                                        ": " + ex.Message, "Exception", MessageBoxButtons.OK);
                    }
                }

                string[] leagueFiles = Directory.GetFiles(targetPath, "*.league.dat",
                                                          SearchOption.TopDirectoryOnly);
                foreach (string leagueFile in leagueFiles)
                {
                    try
                    {
                        xml.Load(leagueFile);
                        XmlNode leagueNode = xml.SelectSingleNode("//League");
                        if (leagueNode != null)
                        {
                            var league = new League(leagueNode);
                            Leagues.Add(league);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Unexpected error while parsing leagues in '" + leagueFile +
                                        ": " + ex.Message, "Exception", MessageBoxButtons.OK);
                    }
                }
            }
            else
            {
                if (File.Exists(Path.Combine(Program.BasePath, "Events.dat")))
                {
                    xml.Load(Path.Combine(Program.BasePath, "Events.dat"));
                    XmlNodeList tournamentNodes = xml.SelectNodes("//Events/Tournaments/Tournament");
                    if (tournamentNodes != null)
                        foreach (XmlNode tournamentNode in tournamentNodes)
                        {
                            var tournament = new Tournament(tournamentNode);
                            Tournaments.Add(tournament);
                            if (tournament.NeedsSave) needsSave = true;
                        }

                    XmlNodeList leagueNodes = xml.SelectNodes("//Events/Leagues/League");
                    if (leagueNodes != null)
                        foreach (XmlNode leagueNode in leagueNodes)
                            Leagues.Add(new League(leagueNode));
                }
            }
            if (needsSave) SaveEvents();
        }