using System;
using System.Data;
using System.Collections;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.Messaging;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.ExtendedControls;
using TimeZoneInfo = CMS.SiteProvider.TimeZoneInfo;
public partial class CMSModules_Messaging_Controls_Outbox : CMSUserControl
{
#region "Variables & enums"
private string mZeroRowsText = null;
private int mPageSize = 10;
private bool mShowOriginalMessage = true;
private bool mMarkReadMessage = false;
protected string currentViewButtonClientId = null;
private TimeZoneInfo usedTimeZone = null;
private UserInfo currentUserInfo = null;
private SiteInfo currentSiteInfo = null;
private MessageInfo mMessage = null;
protected enum What
{
SelectedMessages = 0,
AllMessages = 1
}
protected enum Action
{
SelectAction = 0,
Delete = 1
}
#endregion
#region "Private properties"
///
/// Current message id.
///
protected int CurrentMessageId
{
get
{
return ValidationHelper.GetInteger(ViewState["CurrentMessageId"], 0);
}
set
{
ViewState["CurrentMessageId"] = value;
}
}
#endregion
#region "Public properties"
///
/// Messages placeholder
///
public override MessagesPlaceHolder MessagesPlaceHolder
{
get
{
return plcMess;
}
}
///
/// Indicates if control is used on live site.
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
plcMess.IsLiveSite = value;
ucSendMessage.IsLiveSite = value;
base.IsLiveSite = value;
}
}
///
/// Zero rows text.
///
public string ZeroRowsText
{
get
{
return mZeroRowsText;
}
set
{
mZeroRowsText = value;
EnsureChildControls();
outboxGrid.ZeroRowsText = value;
}
}
///
/// Inner grid control.
///
public UniGrid Grid
{
get
{
EnsureChildControls();
return outboxGrid;
}
}
///
/// Size of the page.
///
public int PageSize
{
get
{
return mPageSize;
}
set
{
mPageSize = value;
EnsureChildControls();
outboxGrid.PageSize = value.ToString();
}
}
///
/// True if original message should be shown.
///
public bool ShowOriginalMessage
{
get
{
return mShowOriginalMessage;
}
set
{
mShowOriginalMessage = value;
}
}
///
/// Mark read messages.
///
public bool MarkReadMessage
{
get
{
return mMarkReadMessage;
}
set
{
mMarkReadMessage = value;
}
}
///
/// Current message.
///
protected MessageInfo Message
{
get
{
if ((mMessage == null) && (CurrentMessageId > 0))
{
mMessage = MessageInfoProvider.GetMessageInfo(CurrentMessageId);
}
return mMessage;
}
}
#endregion
#region "Page events"
protected override void EnsureChildControls()
{
base.EnsureChildControls();
if (outboxGrid == null)
{
pnlOutbox.LoadContainer();
}
}
///
/// Page load.
///
/// Sender
/// Event arguments
protected void Page_Load(object sender, EventArgs e)
{
// Set pager links text on live site
if (IsLiveSite)
{
outboxGrid.Pager.FirstPageText = "<<";
outboxGrid.Pager.LastPageText = ">>";
outboxGrid.Pager.PreviousPageText = "<";
outboxGrid.Pager.NextPageText = ">";
outboxGrid.Pager.PreviousGroupText = "...";
outboxGrid.Pager.NextGroupText = "...";
}
SetupControls();
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
// Set info message
if (ucViewMessage.InformationText != string.Empty)
{
ShowInformation(ucViewMessage.InformationText);
}
// Set error message
if (ucViewMessage.ErrorText != string.Empty)
{
ShowError(ucViewMessage.ErrorText);
}
// Hide footer action panel
pnlAction.Visible = outboxGrid.Visible && (outboxGrid.GridView.Rows.Count > 0);
}
#endregion
#region "Public methods"
///
/// Sets up controls.
///
public void SetupControls()
{
if (StopProcessing)
{
// Do nothing
ucSendMessage.StopProcessing = true;
ucViewMessage.StopProcessing = true;
outboxGrid.StopProcessing = true;
}
else
{
bool isPostBack = RequestHelper.IsPostBack();
if (!isPostBack)
{
outboxGrid.DelayedReload = false;
}
else
{
// Find postback invoker
if (!RequestHelper.CausedPostback(outboxGrid, btnNewMessage, ucSendMessage.SendButton, ucSendMessage.CancelButton, btnBackToList, btnForward, btnDelete, btnOk))
{
outboxGrid.DelayedReload = false;
}
SetupLabels();
}
// Show content only for authenticated users
if (CMSContext.CurrentUser.IsAuthenticated())
{
// Show control
Visible = true;
// Initialize unigrid
outboxGrid.OnExternalDataBound += outboxGrid_OnExternalDataBound;
outboxGrid.GridView.RowDataBound += GridView_RowDataBound;
outboxGrid.OnAction += outboxGrid_OnAction;
// Set where condition clause
outboxGrid.WhereCondition = "MessageSenderUserID=" + CMSContext.CurrentUser.UserID + " AND (MessageSenderDeleted=0 OR MessageSenderDeleted IS NULL)";
outboxGrid.GridView.DataBound += GridView_DataBound;
outboxGrid.GridView.PageSize = PageSize;
outboxGrid.OnBeforeDataReload += outboxGrid_OnBeforeDataReload;
outboxGrid.OnBeforeSorting += outboxGrid_OnBeforeSorting;
outboxGrid.OnShowButtonClick += outboxGrid_OnShowButtonClick;
outboxGrid.OnPageSizeChanged += outboxGrid_OnPageSizeChanged;
outboxGrid.IsLiveSite = IsLiveSite;
// Setup inner controls
ucSendMessage.IsLiveSite = IsLiveSite;
ucViewMessage.IsLiveSite = IsLiveSite;
ucViewMessage.MessageMode = MessageModeEnum.Outbox;
ucViewMessage.Message = Message;
// Create and assign javascripts confirmation
btnDelete.OnClientClick = "return confirm(" + ScriptHelper.GetString(GetString("Messsaging.DeletionConfirmation")) + ");";
;
// Set images
imgDelete.ImageUrl = UIHelper.GetImageUrl(Page, "Design/Controls/UniGrid/Actions/delete.png", IsLiveSite);
imgDelete.ToolTip = GetString("Messaging.Delete");
imgDelete.AlternateText = GetString("Messaging.Delete");
imgForward.ImageUrl = UIHelper.GetImageUrl(Page, "Design/Controls/UniGrid/Actions/forward.png", IsLiveSite);
imgForward.ToolTip = GetString("Messaging.Forward");
imgForward.AlternateText = GetString("Messaging.Forward");
imgNew.ImageUrl = UIHelper.GetImageUrl(Page, "CMSModules/CMS_Messaging/newmessage.png", IsLiveSite);
imgNew.ToolTip = GetString("Messaging.NewMessage");
imgNew.AlternateText = GetString("Messaging.NewMessage");
// Register events
ucSendMessage.SendButtonClick += ucSendMessage_SendButtonClick;
btnNewMessage.Click += btnNewMessage_Click;
btnForward.Click += btnForward_Click;
btnDelete.Click += btnDelete_Click;
btnBackToList.Click += btnBackToList_Click;
StringBuilder actionScript = new StringBuilder();
actionScript.Append(
@"function PerformAction_", ClientID, @"(selectionFunction, actionId, actionLabel, whatId) {
var confirmation = null;
var label = document.getElementById(actionLabel);
var action = document.getElementById(actionId).value;
var whatDrp = document.getElementById(whatId);
if (action == '", (int)Action.SelectAction, @"') {
label.innerHTML = '", GetString("MassAction.SelectSomeAction"), @"';
}
else if (eval(selectionFunction) && (whatDrp.value == '", (int)What.SelectedMessages, @"')) {
label.innerHTML = '", GetString("Messaging.SelectMessages"), @"';
}
else if (action == '", (int)Action.Delete, @"') {
confirmation = ", ScriptHelper.GetString(GetString("Messaging.ConfirmDelete")), @";
}
if (confirmation != null) {
return confirm(confirmation);
}
return false;
}
");
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "actionScript", ScriptHelper.GetScript(actionScript.ToString()));
// Add action to button
btnOk.OnClientClick = "return PerformAction_" + ClientID + "('" + outboxGrid.GetCheckSelectionScript() + "','" + drpAction.ClientID + "','" + lblActionInfo.ClientID + "','" + drpWhat.ClientID + "');";
btnOk.Click += btnOk_Click;
if (!isPostBack)
{
// Initialize dropdown lists
drpWhat.Items.Add(new ListItem(GetString("Messaging." + What.SelectedMessages), Convert.ToInt32(What.SelectedMessages).ToString()));
drpWhat.Items.Add(new ListItem(GetString("Messaging." + What.AllMessages), Convert.ToInt32(What.AllMessages).ToString()));
drpAction.Items.Add(new ListItem(GetString("general." + Action.SelectAction), Convert.ToInt32(Action.SelectAction).ToString()));
drpAction.Items.Add(new ListItem(GetString("Messaging.Action." + Action.Delete), Convert.ToInt32(Action.Delete).ToString()));
}
}
else
{
Visible = false;
}
}
}
#endregion
#region "Message actions"
///
/// New message.
///
private void NewMessage()
{
// Initialize new message control
pnlBackToList.Visible = true;
lblBackToList.ResourceString = "messaging.newmessage";
pnlList.Visible = false;
pnlNew.Visible = true;
pnlActions.Visible = false;
// Initialize new and view message
ucSendMessage.StopProcessing = false;
ucSendMessage.SendMessageMode = MessageActionEnum.New;
ucSendMessage.MessageId = 0;
ucSendMessage.Message = null;
ucSendMessage.ReloadData();
}
///
/// View message.
///
private void ViewMessage()
{
pnlActions.Visible = true;
pnlList.Visible = false;
pnlNew.Visible = false;
pnlView.Visible = true;
pnlBackToList.Visible = true;
lblBackToList.ResourceString = "messaging.viewmessage";
// Initialize view message control
ucViewMessage.StopProcessing = false;
ucViewMessage.Message = Message;
ucViewMessage.ReloadData();
}
///
/// Forward message.
///
private void ForwardMesssage()
{
pnlBackToList.Visible = true;
lblBackToList.ResourceString = "messaging.forwardmessage";
pnlList.Visible = false;
pnlNew.Visible = true;
pnlView.Visible = ShowOriginalMessage;
pnlActions.Visible = false;
// Initialize new and view message
ucSendMessage.StopProcessing = false;
ucSendMessage.Message = Message;
ucSendMessage.MessageSubject = GetString("Messaging.ForwardSign");
ucSendMessage.SendMessageMode = MessageActionEnum.Forward;
ucSendMessage.ReloadData();
ucViewMessage.StopProcessing = false;
ucViewMessage.Message = Message;
ucViewMessage.ReloadData();
lblNewMessageHeader.ResourceString = "Messaging.Forward";
lblViewMessageHeader.ResourceString = "Messaging.OriginalMessage";
}
///
/// Delete message.
///
private void DeleteMessage()
{
try
{
MessageInfoProvider.DeleteSentMessage(CurrentMessageId);
ShowConfirmation(GetString("Messsaging.MessageDeleted"));
pnlList.Visible = true;
pnlNew.Visible = false;
pnlView.Visible = false;
pnlBackToList.Visible = false;
outboxGrid.DelayedReload = false;
}
catch (Exception ex)
{
ShowError(ex.Message);
}
}
///
/// Perform selected action (Delete).
///
private void PerformAction()
{
string resultMessage = string.Empty;
Action action = (Action)ValidationHelper.GetInteger(drpAction.SelectedItem.Value, 0);
What what = (What)ValidationHelper.GetInteger(drpWhat.SelectedItem.Value, 0);
string where = null;
// All messages
if (what == What.AllMessages)
{
resultMessage = GetString("Messaging." + What.AllMessages);
}
// Selected messages
else if (what == What.SelectedMessages)
{
where = SqlHelperClass.GetWhereCondition("MessageID", outboxGrid.SelectedItems, false);
resultMessage = GetString("Messaging." + What.SelectedMessages);
}
else
{
return;
}
// Action 'Delete'
if ((action == Action.Delete))
{
// Delete selected messages
MessageInfoProvider.DeleteSentMessages(CMSContext.CurrentUser.UserID, where);
resultMessage += " " + GetString("Messaging.Action.Result.Deleted");
ShowConfirmation(resultMessage);
outboxGrid.ClearSelectedItems();
outboxGrid.ReloadData();
}
}
#endregion
#region "Buttons actions"
protected void outboxGrid_OnShowButtonClick(object sender, EventArgs e)
{
outboxGrid.DelayedReload = false;
}
protected void btnBackToList_Click(object sender, EventArgs e)
{
pnlList.Visible = true;
pnlNew.Visible = false;
pnlView.Visible = false;
pnlBackToList.Visible = false;
ucSendMessage.SendMessageMode = MessageActionEnum.None;
outboxGrid.ReloadData();
}
protected void btnDelete_Click(object sender, EventArgs e)
{
DeleteMessage();
outboxGrid.ReloadData();
}
protected void btnForward_Click(object sender, EventArgs e)
{
ForwardMesssage();
}
protected void btnNewMessage_Click(object sender, EventArgs e)
{
NewMessage();
}
protected void ucSendMessage_SendButtonClick(object sender, EventArgs e)
{
// If no error, inform user
if (String.IsNullOrEmpty(ucSendMessage.ErrorText))
{
ShowConfirmation(ucSendMessage.InformationText);
btnBackToList_Click(sender, e);
}
else
{
ucViewMessage.StopProcessing = false;
SetupLabels();
ucViewMessage.ReloadData();
pnlActions.Visible = false;
}
}
protected void btnOk_Click(object sender, EventArgs e)
{
PerformAction();
}
#endregion
#region "Grid methods"
protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
DataRowView rowView = ((DataRowView)e.Row.DataItem);
if (e.Row.RowType == DataControlRowType.DataRow)
{
// Mark read message
if (MarkReadMessage)
{
DateTime messageRead = ValidationHelper.GetDateTime(DataHelper.GetDataRowValue(rowView.Row, "MessageRead"), DateTimeHelper.ZERO_TIME);
if (messageRead == DateTimeHelper.ZERO_TIME)
{
e.Row.CssClass += " Unread";
}
}
}
}
protected void outboxGrid_OnBeforeDataReload()
{
// Bind footer
BindFooter();
}
protected void outboxGrid_OnPageSizeChanged()
{
outboxGrid.ReloadData();
}
protected void outboxGrid_OnBeforeSorting(object sender, EventArgs e)
{
outboxGrid.ReloadData();
}
protected object outboxGrid_OnExternalDataBound(object sender, string sourceName, object parameter)
{
switch (sourceName.ToLowerCSafe())
{
case "messagerecipientnickname":
case "messagesubject":
// Avoid XSS
return HTMLHelper.HTMLEncode(Convert.ToString(parameter));
case "messagesent":
if (currentUserInfo == null)
{
currentUserInfo = CMSContext.CurrentUser;
}
if (currentSiteInfo == null)
{
currentSiteInfo = CMSContext.CurrentSite;
}
DateTime currentDateTime = ValidationHelper.GetDateTime(parameter, DateTimeHelper.ZERO_TIME);
if (IsLiveSite)
{
return CMSContext.ConvertDateTime(currentDateTime, this);
}
else
{
return TimeZoneHelper.GetCurrentTimeZoneDateTimeString(currentDateTime, currentUserInfo, currentSiteInfo, out usedTimeZone);
}
case "messageread":
// Get date read
return GetDateRead(parameter);
}
return parameter;
}
protected void GridView_DataBound(object sender, EventArgs e)
{
// Setup column styles
if (!MarkReadMessage)
{
outboxGrid.GridView.Columns[4].Visible = false;
}
}
protected void outboxGrid_OnAction(string actionName, object actionArgument)
{
CurrentMessageId = ValidationHelper.GetInteger(actionArgument, 0);
switch (actionName)
{
// Delete message
case "delete":
DeleteMessage();
break;
// View message
case "view":
ViewMessage();
break;
// Forward message
case "forward":
ForwardMesssage();
break;
}
}
#endregion
#region "Protected methods"
///
/// Bind the data.
///
private void BindFooter()
{
lblFooter.Text = string.Format(GetString("Messaging.NumOfMessages"), MessageInfoProvider.GetSentMessagesCount(CMSContext.CurrentUser.UserID));
}
protected string GetDateRead(object messageReadDate)
{
DateTime messageRead = ValidationHelper.GetDateTime(messageReadDate, DateTimeHelper.ZERO_TIME);
if (currentUserInfo == null)
{
currentUserInfo = CMSContext.CurrentUser;
}
if (currentSiteInfo == null)
{
currentSiteInfo = CMSContext.CurrentSite;
}
DateTime currentDateTime = ValidationHelper.GetDateTime(messageReadDate, DateTimeHelper.ZERO_TIME);
if (messageRead != DateTimeHelper.ZERO_TIME)
{
if (IsLiveSite)
{
return CMSContext.ConvertDateTime(currentDateTime, this).ToString();
}
else
{
return TimeZoneHelper.GetCurrentTimeZoneDateTimeString(currentDateTime, currentUserInfo, currentSiteInfo, out usedTimeZone);
}
}
else
{
return GetString("Messaging.OutboxMessageUnread");
}
}
///
/// Set label values.
///
protected void SetupLabels()
{
if (pnlNew.Visible)
{
switch (ucSendMessage.SendMessageMode)
{
case MessageActionEnum.New:
lblBackToList.ResourceString = "messaging.newmessage";
break;
case MessageActionEnum.Forward:
lblBackToList.ResourceString = "messaging.forwardmessage";
lblNewMessageHeader.ResourceString = "Messaging.Forward";
lblViewMessageHeader.ResourceString = "Messaging.OriginalMessage";
break;
}
pnlActions.Visible = false;
}
else
{
if (pnlView.Visible)
{
lblBackToList.ResourceString = "messaging.viewmessage";
}
}
ucViewMessage.StopProcessing = !pnlView.Visible;
}
#endregion
}