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.ExtendedControls; using CMS.GlobalHelper; using CMS.Messaging; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.UIControls; using TimeZoneInfo = CMS.SiteProvider.TimeZoneInfo; public partial class CMSModules_Messaging_Controls_Inbox : CMSUserControl { #region "Variables & enums" private string mZeroRowsText = null; private int mPageSize = 10; private bool mPasteOriginalMessage = true; private bool mShowOriginalMessage = true; 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, MarkAsRead = 1, MarkAsUnread = 2, Delete = 3 } #endregion #region "Private properties" /// /// Current message ID. /// protected int CurrentMessageId { get { return ValidationHelper.GetInteger(ViewState["CurrentMessageId"], 0); } set { ViewState["CurrentMessageId"] = value; if (value <= 0) { mMessage = null; } } } /// /// Current message. /// protected MessageInfo Message { get { if ((mMessage == null) && (CurrentMessageId > 0)) { mMessage = MessageInfoProvider.GetMessageInfo(CurrentMessageId); } return mMessage; } } #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 { ucSendMessage.IsLiveSite = value; plcMess.IsLiveSite = value; base.IsLiveSite = value; } } /// /// Zero rows text. /// public string ZeroRowsText { get { return mZeroRowsText; } set { mZeroRowsText = value; EnsureChildControls(); inboxGrid.ZeroRowsText = value; } } /// /// Size of the page. /// public int PageSize { get { return mPageSize; } set { mPageSize = value; EnsureChildControls(); inboxGrid.PageSize = value.ToString(); } } /// /// Inner grid control. /// public UniGrid Grid { get { EnsureChildControls(); return inboxGrid; } } /// /// True if original message should be pasted to the current. /// public bool PasteOriginalMessage { get { return mPasteOriginalMessage; } set { mPasteOriginalMessage = value; EnsureChildControls(); ucSendMessage.PasteOriginalMessage = value; } } /// /// True if original message should be shown. /// public bool ShowOriginalMessage { get { return mShowOriginalMessage; } set { mShowOriginalMessage = value; } } #endregion #region "Page events" protected override void EnsureChildControls() { base.EnsureChildControls(); if (inboxGrid == null) { pnlInbox.LoadContainer(); } } /// /// Page load. /// /// Sender /// Event arguments protected void Page_Load(object sender, EventArgs e) { // Set pager links text on live site if (IsLiveSite) { inboxGrid.Pager.FirstPageText = "<<"; inboxGrid.Pager.LastPageText = ">>"; inboxGrid.Pager.PreviousPageText = "<"; inboxGrid.Pager.NextPageText = ">"; inboxGrid.Pager.PreviousGroupText = "..."; inboxGrid.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 = inboxGrid.Visible && (inboxGrid.GridView.Rows.Count > 0); } #endregion #region "Public methods" /// /// Sets up controls. /// public void SetupControls() { if (StopProcessing) { // Do nothing ucSendMessage.StopProcessing = true; ucViewMessage.StopProcessing = true; inboxGrid.StopProcessing = true; } else { bool isPostBack = RequestHelper.IsPostBack(); if (!isPostBack) { inboxGrid.DelayedReload = false; } else { // Find postback invoker if (!RequestHelper.CausedPostback(inboxGrid, btnNewMessage, ucSendMessage.SendButton, ucSendMessage.CancelButton, btnBackToList, btnReply, btnHidden, btnForward, btnDelete, btnOk)) { inboxGrid.DelayedReload = false; } SetupLabels(); } // Show content only for authenticated users if (CMSContext.CurrentUser.IsAuthenticated()) { // Show control Visible = true; // Initialize unigrid inboxGrid.OnExternalDataBound += inboxGrid_OnExternalDataBound; inboxGrid.GridView.RowDataBound += GridView_RowDataBound; inboxGrid.OnAction += inboxGrid_OnAction; // Set where condition clause inboxGrid.WhereCondition = "MessageRecipientUserID=" + CMSContext.CurrentUser.UserID + " AND (MessageRecipientDeleted=0 OR MessageRecipientDeleted IS NULL)"; inboxGrid.GridView.PageSize = PageSize; inboxGrid.OnBeforeDataReload += inboxGrid_OnBeforeDataReload; inboxGrid.OnBeforeSorting += inboxGrid_OnBeforeSorting; inboxGrid.OnShowButtonClick += inboxGrid_OnShowButtonClick; inboxGrid.OnPageSizeChanged += inboxGrid_OnPageSizeChanged; inboxGrid.IsLiveSite = IsLiveSite; // Setup inner controls ucSendMessage.IsLiveSite = IsLiveSite; ucViewMessage.IsLiveSite = IsLiveSite; ucViewMessage.MessageMode = MessageModeEnum.Inbox; ucViewMessage.Message = Message; // Create and assign javascript 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"); imgReply.ImageUrl = UIHelper.GetImageUrl(Page, "Design/Controls/UniGrid/Actions/reply.png", IsLiveSite); imgReply.ToolTip = GetString("Messaging.Reply"); imgReply.AlternateText = GetString("Messaging.Reply"); 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; btnReply.Click += btnReply_Click; btnForward.Click += btnForward_Click; btnDelete.Click += btnDelete_Click; btnBackToList.Click += btnBackToList_Click; btnHidden.Click += new EventHandler(btnHidden_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 { switch(action) { case '", (int)Action.MarkAsRead, @"': confirmation = ", ScriptHelper.GetString(GetString("Messaging.ConfirmMarkAsRead")), @"; break; case '", (int)Action.MarkAsUnread, @"': confirmation = ", ScriptHelper.GetString(GetString("Messaging.ConfirmMarkAsUnread")), @"; break; case '", (int)Action.Delete, @"': confirmation = ", ScriptHelper.GetString(GetString("Messaging.ConfirmDelete")), @"; break; default: confirmation = null; break; } if (confirmation != null) { return confirm(confirmation) } } return false; } "); ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "actionScript", ScriptHelper.GetScript(actionScript.ToString())); string messageActionScript = @" function ContextMessageAction_" + inboxGrid.ClientID + @"(action, messageId) { document.getElementById('" + hdnValue.ClientID + @"').value = action + ';' + messageId;" + ControlsHelper.GetPostBackEventReference(btnHidden, null) + @"; }"; ScriptHelper.RegisterStartupScript(this, typeof(string), "messageAction_" + ClientID + new Random(DateTime.Now.Millisecond).Next(), ScriptHelper.GetScript(messageActionScript)); // Add action to button btnOk.OnClientClick = "return PerformAction_" + ClientID + "('" + inboxGrid.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.MarkAsRead), Convert.ToInt32(Action.MarkAsRead).ToString())); drpAction.Items.Add(new ListItem(GetString("Messaging.Action." + Action.MarkAsUnread), Convert.ToInt32(Action.MarkAsUnread).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; // Initilaize new and view message ucSendMessage.StopProcessing = false; ucSendMessage.SendMessageMode = MessageActionEnum.New; ucSendMessage.MessageId = 0; ucSendMessage.Message = null; ucSendMessage.ReloadData(); } /// /// Reply message. /// private void ReplyMessage() { pnlBackToList.Visible = true; lblBackToList.ResourceString = "messaging.replytomessage"; pnlList.Visible = false; pnlNew.Visible = true; pnlView.Visible = ShowOriginalMessage; pnlActions.Visible = false; // Initilaize new and view message ucSendMessage.StopProcessing = false; ucSendMessage.Message = Message; ucSendMessage.MessageSubject = GetString("Messaging.ReSign"); ucSendMessage.SendMessageMode = MessageActionEnum.Reply; ucSendMessage.ReloadData(); ucViewMessage.StopProcessing = false; ucViewMessage.Message = Message; ucViewMessage.ReloadData(); lblNewMessageHeader.ResourceString = "Messaging.Reply"; lblViewMessageHeader.ResourceString = "Messaging.OriginalMessage"; } /// /// Forward message. /// private void ForwardMesssage() { pnlBackToList.Visible = true; lblBackToList.ResourceString = "messaging.forwardmessage"; pnlList.Visible = false; pnlNew.Visible = true; pnlView.Visible = ShowOriginalMessage; pnlActions.Visible = false; // Initilaize 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"; } /// /// 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(); } /// /// Sets message to read message. /// private void ReadMessage() { if (Message != null) { bool updateMessage = false; // Check message read date if (Message.MessageRead == DateTimeHelper.ZERO_TIME) { Message.MessageRead = DateTime.Now; updateMessage = true; } // Check message read flag if (!Message.MessageIsRead) { Message.MessageIsRead = true; updateMessage = true; } // Update message if (updateMessage) { MessageInfoProvider.SetMessageInfo(Message); } } } /// /// Delete message. /// private void DeleteMessage() { try { inboxGrid.DelayedReload = false; MessageInfoProvider.DeleteReceivedMessage(CurrentMessageId); ShowConfirmation(GetString("Messsaging.MessageDeleted")); pnlList.Visible = true; pnlNew.Visible = false; pnlView.Visible = false; pnlBackToList.Visible = false; } catch (Exception ex) { ShowError(ex.Message); } } /// /// Mark message as read. /// private void MarkAsRead() { if (Message != null) { // Mark as read if ((Message.MessageRead == DateTimeHelper.ZERO_TIME) || !Message.MessageIsRead) { Message.MessageIsRead = true; if (Message.MessageRead == DateTimeHelper.ZERO_TIME) { Message.MessageRead = DateTime.Now; } MessageInfoProvider.SetMessageInfo(Message); } } inboxGrid.DelayedReload = false; } /// /// Mark message as unread. /// private void MarkAsUnread() { if (Message != null) { // Mark as unread if (Message.MessageIsRead) { Message.MessageIsRead = false; MessageInfoProvider.SetMessageInfo(Message); } } inboxGrid.DelayedReload = false; } /// /// Perform selected action (Mark as read, Mark as unread, 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", inboxGrid.SelectedItems, false); resultMessage = GetString("Messaging." + What.SelectedMessages); } else { return; } // Action 'Delete' if ((action == Action.Delete)) { MessageInfoProvider.DeleteReceivedMessages(CMSContext.CurrentUser.UserID, where); resultMessage += " " + GetString("Messaging.Action.Result.Deleted"); } // Action 'Mark as read' else if ((action == Action.MarkAsRead)) { MessageInfoProvider.MarkReadReceivedMessages(CMSContext.CurrentUser.UserID, where, DateTime.Now); resultMessage += " " + GetString("Messaging.Action.Result.MarkAsRead"); } // Action 'Mark as unread' else if (action == Action.MarkAsUnread) { MessageInfoProvider.MarkUnreadReceivedMessages(CMSContext.CurrentUser.UserID, where); resultMessage += " " + GetString("Messaging.Action.Result.MarkAsUnread"); } else { return; } if (!string.IsNullOrEmpty(resultMessage)) { ShowConfirmation(resultMessage); } inboxGrid.ClearSelectedItems(); inboxGrid.ReloadData(); } #endregion #region "Buttons actions" private void btnHidden_Click(object sender, EventArgs e) { // Process message action string[] args = hdnValue.Value.Split(';'); if (args.Length == 2) { inboxGrid_OnAction(args[0], args[1]); inboxGrid.ReloadData(); } } protected void inboxGrid_OnShowButtonClick(object sender, EventArgs e) { inboxGrid.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; inboxGrid.ReloadData(); } protected void btnDelete_Click(object sender, EventArgs e) { DeleteMessage(); inboxGrid.ReloadData(); } protected void btnForward_Click(object sender, EventArgs e) { ForwardMesssage(); } protected void btnReply_Click(object sender, EventArgs e) { ReplyMessage(); } 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 unread message DateTime messageRead = ValidationHelper.GetDateTime(DataHelper.GetDataRowViewValue(rowView, "MessageRead"), DateTimeHelper.ZERO_TIME); bool messageIsRead = ValidationHelper.GetBoolean(DataHelper.GetDataRowViewValue(rowView, "MessageIsRead"), true); if ((messageRead == DateTimeHelper.ZERO_TIME) || !messageIsRead) { e.Row.CssClass += " Unread"; } } } protected void inboxGrid_OnBeforeSorting(object sender, EventArgs e) { inboxGrid.ReloadData(); } protected void inboxGrid_OnPageSizeChanged() { inboxGrid.ReloadData(); } protected void inboxGrid_OnBeforeDataReload() { // Bind grid footer BindFooter(); } protected object inboxGrid_OnExternalDataBound(object sender, string sourceName, object parameter) { switch (sourceName.ToLowerCSafe()) { case "messagesendernickname": 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); } } return parameter; } protected void inboxGrid_OnAction(string actionName, object actionArgument) { CurrentMessageId = ValidationHelper.GetInteger(actionArgument, 0); // Force reinitialization of message object if differs from currently processed message if ((Message != null) && (Message.MessageID != CurrentMessageId)) { mMessage = null; } switch (actionName) { // Delete message case "delete": DeleteMessage(); break; // Reply message case "reply": ReadMessage(); ReplyMessage(); break; // View message case "view": ReadMessage(); ViewMessage(); break; // Forward message case "forward": ReadMessage(); ForwardMesssage(); break; // Mark message as read case "markread": MarkAsRead(); break; // Mark message as unread case "markunread": MarkAsUnread(); break; } } #endregion #region "Protected methods" /// /// Bind the data. /// protected void BindFooter() { int userId = CMSContext.CurrentUser.UserID; lblFooter.Text = string.Format(GetString("Messaging.UnreadOfAll"), MessageInfoProvider.GetUnreadMessagesCount(userId), MessageInfoProvider.GetMessagesCount(userId)); } /// /// Sel 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; case MessageActionEnum.Reply: lblBackToList.ResourceString = "messaging.replytomessage"; lblNewMessageHeader.ResourceString = "Messaging.Reply"; lblViewMessageHeader.ResourceString = "Messaging.OriginalMessage"; break; } pnlActions.Visible = false; } else { if (pnlView.Visible) { lblBackToList.ResourceString = "messaging.viewmessage"; } } ucViewMessage.StopProcessing = !pnlView.Visible; } #endregion }