public void LoadData(bool forceRemote = false)
        {
            using (ToolForms.FormProgress form = new ToolForms.FormProgress())
            {
                System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate()
                {
                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        form.laProgress.Text = "Loading Programs...";
                        form.TopMost = true;
                        form.Show();
                        Application.DoEvents();
                    });

                    foreach (CoreObjects.Station station in _stations)
                        station.ReleaseResources();
                    _stations.Clear();
                    ListManager.Instance.FCC.Clear();
                    ListManager.Instance.Type.Clear();

                    if (forceRemote)
                    {
                        AppManager.Instance.DeleteFolder(new DirectoryInfo(ConfigurationClasses.SettingsManager.Instance.StationsRootPath));
                        if (!Directory.Exists(ConfigurationClasses.SettingsManager.Instance.StationsRootPath))
                            Directory.CreateDirectory(ConfigurationClasses.SettingsManager.Instance.StationsRootPath);
                    }
                    else
                    {
                        LoadStations();
                        ListManager.Instance.LoadLists();
                    }

                    if (ListManager.Instance.FCC.Count == 0 || ListManager.Instance.Type.Count == 0)
                        ListManager.Instance.LoadRemoteLists();

                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        form.Hide();
                        Application.DoEvents();
                    });
                    if (!this.StationsLoaded && !ConfigurationClasses.SettingsManager.Instance.OfflineMode)
                    {
                        FormMain.Instance.Invoke((MethodInvoker)delegate()
                        {
                            form.laProgress.Text = "Connecting to the server...";
                            form.TopMost = true;
                            form.Show();
                            Application.DoEvents();
                        });

                        string[] availableStations = ServiceManager.GetStationsList();
                        string[] selectedStations = new string[] { };

                        FormMain.Instance.Invoke((MethodInvoker)delegate()
                        {
                            form.Hide();
                            Application.DoEvents();
                        });

                        if (availableStations.Length > 0)
                        {
                            FormMain.Instance.Invoke((MethodInvoker)delegate()
                            {
                                using (ToolForms.FormSelectStations selectForm = new ToolForms.FormSelectStations())
                                {
                                    selectForm.AvailableStations.AddRange(availableStations);
                                    selectForm.ActionName = "Download";
                                    if (selectForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                                    {
                                        selectedStations = selectForm.SelectedStations;
                                    }
                                }

                                form.laProgress.Text = "Downloading Selected Stations...";
                                form.TopMost = true;
                                form.Show();
                                Application.DoEvents();
                            });

                            DownloadStations(selectedStations);

                            FormMain.Instance.Invoke((MethodInvoker)delegate()
                            {
                                form.Hide();
                                Application.DoEvents();
                            });
                        }
                        else
                        {
                            FormMain.Instance.Invoke((MethodInvoker)delegate()
                            {
                                AppManager.Instance.ShowWarning("Server is unavailable");
                                Application.DoEvents();
                            });
                        }
                    }
                    else if (!forceRemote)
                    {
                        List<string> stationsForUpdate = new List<string>();
                        stationsForUpdate.AddRange(_stations.Where(x => x.NeedToUpdate).Select(x => x.Name));
                        if (stationsForUpdate.Count > 0)
                        {
                            if (ConfigurationClasses.SettingsManager.Instance.AlwaysDownload)
                            {
                                FormMain.Instance.Invoke((MethodInvoker)delegate()
                                {
                                    form.laProgress.Text = "Downloading Stations...";
                                    form.TopMost = true;
                                    form.Show();
                                    Application.DoEvents();
                                });

                                DownloadStations(stationsForUpdate.ToArray());

                                FormMain.Instance.Invoke((MethodInvoker)delegate()
                                {
                                    form.Hide();
                                    Application.DoEvents();
                                });
                            }
                            else if (!ConfigurationClasses.SettingsManager.Instance.AlwaysCancelDownload)
                            {
                                DialogResult questionResult = DialogResult.Cancel;
                                FormMain.Instance.Invoke((MethodInvoker)delegate()
                                {
                                    using (ToolForms.FormDownloadWarning downloadwarning = new ToolForms.FormDownloadWarning())
                                    {
                                        questionResult = downloadwarning.ShowDialog();
                                    }
                                });

                                if (questionResult == DialogResult.OK)
                                {
                                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                                    {
                                        form.laProgress.Text = "Downloading Stations...";
                                        form.TopMost = true;
                                        form.Show();
                                        Application.DoEvents();
                                    });

                                    DownloadStations(stationsForUpdate.ToArray());

                                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                                    {
                                        form.Hide();
                                        Application.DoEvents();
                                    });
                                }
                            }
                        }
                    }
                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        FormMain.Instance.TabSchedule.LoadPage();
                        FormMain.Instance.TabSearch.LoadPage();
                    });
                }));
                thread.Start();

                while (thread.IsAlive)
                    Application.DoEvents();

                form.Close();
            }
        }
        public void ReportWeekSchedule(string stationName, CoreObjects.Week[] weeks, bool convertToPDF, bool landscape)
        {
            using (ToolForms.FormProgress form = new ToolForms.FormProgress())
            {
                System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate()
                {
                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        form.laProgress.Text = "Generating Program Schedule...";
                        form.TopMost = true;
                        form.Show();
                        Application.DoEvents();
                    });

                    CoreObjects.Station station = _stations.Where(x => x.Name.Equals(stationName)).FirstOrDefault();
                    if (station != null)
                    {
                        InteropClasses.ExcelHelper excelHelper = new InteropClasses.ExcelHelper();

                        if (!Directory.Exists(ConfigurationClasses.SettingsManager.Instance.OutputCache))
                            Directory.CreateDirectory(ConfigurationClasses.SettingsManager.Instance.OutputCache);

                        string destinationPath = Path.Combine(ConfigurationClasses.SettingsManager.Instance.OutputCache, string.Format("{0}.{1}", new string[] { DateTime.Now.ToString("MMddyy-hhmmtt"), convertToPDF ? "pdf" : "xls" }));

                        List<CoreObjects.Day[]> daysByWeeks = new List<CoreObjects.Day[]>();
                        foreach (CoreObjects.Week week in weeks)
                            daysByWeeks.Add(station.GetDays(week.DateStart, week.DateEnd));

                        excelHelper.ReportWeekSchedule(daysByWeeks.ToArray(), destinationPath, convertToPDF, landscape);

                        if (File.Exists(destinationPath))
                            Process.Start(destinationPath);
                    }

                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        form.Hide();
                        Application.DoEvents();
                    });

                }));
                thread.Start();

                while (thread.IsAlive)
                    Application.DoEvents();

                form.Close();
            }
        }
        public void ReportActivityList(CoreObjects.ProgramActivity[] activities, bool convertToPDF)
        {
            using (ToolForms.FormProgress form = new ToolForms.FormProgress())
            {
                System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate()
                {
                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        form.laProgress.Text = "Generating Program List...";
                        form.TopMost = true;
                        form.Show();
                        Application.DoEvents();
                    });

                    InteropClasses.ExcelHelper excelHelper = new InteropClasses.ExcelHelper();

                    if (!Directory.Exists(ConfigurationClasses.SettingsManager.Instance.OutputCache))
                        Directory.CreateDirectory(ConfigurationClasses.SettingsManager.Instance.OutputCache);

                    string destinationPath = Path.Combine(ConfigurationClasses.SettingsManager.Instance.OutputCache, string.Format("{0}.{1}", new string[] { DateTime.Now.ToString("MMddyy-hhmmtt"), convertToPDF ? "pdf" : "xls" }));

                    excelHelper.ReportActivityList(activities, destinationPath, convertToPDF);

                    if (File.Exists(destinationPath))
                        Process.Start(destinationPath);

                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        form.Hide();
                        Application.DoEvents();
                    });

                }));
                thread.Start();

                while (thread.IsAlive)
                    Application.DoEvents();

                form.Close();
            }
        }
        public void UploadData()
        {
            using (ToolForms.FormProgress form = new ToolForms.FormProgress())
            {
                System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate()
                {
                    List<string> selectedStations = new List<string>();

                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        using (ToolForms.FormSelectStations selectForm = new ToolForms.FormSelectStations())
                        {
                            selectForm.AvailableStations.AddRange(GetStationList());
                            selectForm.ActionName = "Upload";
                            selectForm.DefaultSelectedStation = this.SelectedStation.Name;
                            if (selectForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                                selectedStations.AddRange(selectForm.SelectedStations);
                        }
                        Application.DoEvents();
                    });

                    bool uploadSuccessfully = selectedStations.Count > 0;
                    bool somethingDownloaded = false;
                    foreach (string stationName in selectedStations)
                    {
                        CoreObjects.Station station = _stations.Where(x => x.Name.Equals(stationName)).FirstOrDefault();
                        if (station != null)
                        {
                            FormMain.Instance.Invoke((MethodInvoker)delegate()
                            {
                                form.laProgress.Text = "Getting station information...";
                                form.TopMost = true;
                                form.Show();
                                Application.DoEvents();
                            });


                            CoreObjects.StationInformation stationInformation = ServiceManager.GetStationInfo(station.Name);

                            FormMain.Instance.Invoke((MethodInvoker)delegate()
                            {
                                form.Hide();
                                Application.DoEvents();
                            });

                            DialogResult result = DialogResult.OK;
                            if (stationInformation != null)
                            {
                                if (stationInformation.LastModified > station.LastLoaded)
                                {
                                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                                    {
                                        using (ToolForms.FormUploadWarning warningForm = new ToolForms.FormUploadWarning())
                                        {
                                            result = warningForm.ShowDialog();
                                        }
                                        Application.DoEvents();
                                    });
                                }
                            }
                            if (result == DialogResult.OK)
                            {
                                FormMain.Instance.Invoke((MethodInvoker)delegate()
                                {
                                    form.laProgress.Text = "Uploading station...";
                                    form.TopMost = true;
                                    form.Show();
                                    Application.DoEvents();
                                });

                                uploadSuccessfully &= ServiceManager.UploadStation(station);

                                FormMain.Instance.Invoke((MethodInvoker)delegate()
                                {
                                    form.Hide();
                                    Application.DoEvents();
                                });
                            }
                            else if (result == DialogResult.Cancel)
                            {
                                FormMain.Instance.Invoke((MethodInvoker)delegate()
                                {
                                    form.laProgress.Text = "Downloading station...";
                                    form.TopMost = true;
                                    form.Show();
                                    Application.DoEvents();
                                });

                                DownloadStations(new string[] { stationName });

                                somethingDownloaded = true;

                                FormMain.Instance.Invoke((MethodInvoker)delegate()
                                {
                                    form.Hide();
                                    Application.DoEvents();
                                });
                            }
                        }
                    }
                    FormMain.Instance.Invoke((MethodInvoker)delegate()
                    {
                        if (somethingDownloaded)
                            LoadStation(null, this.SelectedStation.Name);

                        Application.DoEvents();

                        if (uploadSuccessfully)
                        {
                            AppManager.Instance.ShowInformation("Operation completed successfully");
                        }
                        else
                            AppManager.Instance.ShowWarning("Operation was not complited");
                    });
                }));
                thread.Start();

                while (thread.IsAlive)
                    Application.DoEvents();

                form.Close();
            }
        }