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 }