using System;
using System.Data;
using System.Data.SqlTypes;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.Newsletter;
using CMS.UIControls;
public partial class CMSModules_Newsletters_Controls_SendIssue : CMSAdminControl
{
#region "Properties"
///
/// ID of newsletter issue that should be sent, required for template based newsletters.
///
public int IssueID
{
get;
set;
}
///
/// Newsletter ID, required for dynamic newsletters.
///
public int NewsletterID
{
get;
set;
}
///
/// Indicates if 'Schedule newsletter mail-out' option should be displayed.
///
public bool ShowScheduler
{
get;
set;
}
///
/// Indicates if 'Send draft' option should be displayed.
///
public bool ShowSendDraft
{
get;
set;
}
///
/// Indicates if 'Send later' option should be displayed.
///
public bool ShowSendLater
{
get;
set;
}
#endregion
#region "Page events"
protected void Page_Load(object sender, EventArgs e)
{
if (StopProcessing || ((IssueID <= 0) && (NewsletterID <= 0)))
{
return;
}
if (!RequestHelper.IsPostBack())
{
int newsletterId = NewsletterID;
if (newsletterId <= 0)
{
IssueInfo issue = IssueInfoProvider.GetIssueInfo(IssueID);
if (issue != null)
{
newsletterId = issue.IssueNewsletterID;
}
else
{
StopProcessing = true;
return;
}
}
// Fill draft emails box
NewsletterInfo newsletter = NewsletterInfoProvider.GetNewsletterInfo(newsletterId);
if (newsletter != null)
{
txtSendDraft.Text = newsletter.NewsletterDraftEmails;
}
else
{
StopProcessing = true;
}
}
calendarControl.DateTimeTextBox.CssClass = "EditingFormCalendarTextBox";
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
// Show/hide specific send options
plcSendScheduled.Visible = ShowScheduler;
plcSendDraft.Visible = ShowSendDraft;
plcSendLater.Visible = ShowSendLater;
}
protected void radGroupSend_CheckedChanged(object sender, EventArgs e)
{
calendarControl.Enabled = radSchedule.Checked;
txtSendDraft.Enabled = radSendDraft.Checked;
}
#endregion
#region "Methods"
///
/// Sends the issue according to sending options.
///
public bool SendIssue()
{
bool result = radSendLater.Checked;
if (IssueID > 0)
{
// Depending on action chosen, send the issue
if (radSendNow.Checked)
{
result = SendNow();
}
else if (radSchedule.Checked)
{
result = SendScheduled();
}
else if (radSendDraft.Checked)
{
result = SendDraft();
}
}
return result;
}
///
/// Sends issue immediately.
///
private bool SendNow()
{
RemovePreviousTaskAndSendIssue(IssueID, DateTime.Now);
return true;
}
///
/// Schedules mail-out of the issue to the future.
///
private bool SendScheduled()
{
if (IsValidDate(calendarControl.SelectedDateTime))
{
RemovePreviousTaskAndSendIssue(IssueID, calendarControl.SelectedDateTime);
}
else
{
ErrorMessage = GetString("newsletter.incorrectdate");
}
return String.IsNullOrEmpty(ErrorMessage);
}
///
/// Sends issue to testing email addresses.
///
/// True when everything went ok
private bool SendDraft()
{
string draftEmails = txtSendDraft.Text.Trim();
if (String.IsNullOrEmpty(draftEmails))
{
ErrorMessage = GetString("newsletter.recipientsmissing");
}
else if (!ValidationHelper.AreEmails(draftEmails))
{
ErrorMessage = GetString("newsletter.wrongemailformat");
}
else
{
IssueInfoProvider.SendIssue(IssueID, draftEmails);
}
return String.IsNullOrEmpty(ErrorMessage);
}
///
/// Removes all scheduled tasks for the given issue.
///
/// Issue ID
/// DateTime when to send
private void RemovePreviousTaskAndSendIssue(int issueId, DateTime when)
{
IssueInfo issue = IssueInfoProvider.GetIssueInfo(IssueID);
if (issue != null)
{
// Remove all previously scheduled tasks (if any)
IssueInfoProvider.DeleteMailoutTask(issue.IssueGUID, issue.IssueSiteID);
// Schedule new task for new mailout time
IssueInfoProvider.SendIssue(issue, when);
}
}
///
/// Decides about DateTime validity.
///
/// DateTime to valid
/// True when DateTime is valid
private static bool IsValidDate(DateTime date)
{
return (date > SqlDateTime.MinValue.Value) && (date < SqlDateTime.MaxValue.Value);
}
#endregion
}