Beispiel #1
0
    /// <summary>
    /// Creates static newsletter. Called when the "Create newsletter" button is pressed.
    /// </summary>
    private bool CreateStaticNewsletter()
    {
        EmailTemplateInfo subscriptionTemplate   = EmailTemplateInfoProvider.GetEmailTemplateInfo("MyNewSubscriptionTemplate", SiteContext.CurrentSiteID);
        EmailTemplateInfo unsubscriptionTemplate = EmailTemplateInfoProvider.GetEmailTemplateInfo("MyNewUnsubscriptionTemplate", SiteContext.CurrentSiteID);
        EmailTemplateInfo myNewIssueTemplate     = EmailTemplateInfoProvider.GetEmailTemplateInfo("MyNewIssueTemplate", SiteContext.CurrentSiteID);

        if ((subscriptionTemplate != null) && (unsubscriptionTemplate != null) && (myNewIssueTemplate != null))
        {
            // Create new static newsletter object
            NewsletterInfo newNewsletter = new NewsletterInfo();

            // Set the properties
            newNewsletter.NewsletterDisplayName              = "My new static newsletter";
            newNewsletter.NewsletterName                     = "MyNewStaticNewsletter";
            newNewsletter.NewsletterType                     = NewsletterType.TemplateBased;
            newNewsletter.NewsletterSubscriptionTemplateID   = subscriptionTemplate.TemplateID;
            newNewsletter.NewsletterUnsubscriptionTemplateID = unsubscriptionTemplate.TemplateID;
            newNewsletter.NewsletterTemplateID               = myNewIssueTemplate.TemplateID;
            newNewsletter.NewsletterSenderName               = "Sender name";
            newNewsletter.NewsletterSenderEmail              = "*****@*****.**";
            newNewsletter.NewsletterSiteID                   = SiteContext.CurrentSiteID;

            // Save the static newsletter
            NewsletterInfoProvider.SetNewsletterInfo(newNewsletter);

            return(true);
        }

        return(false);
    }
    /// <summary>
    /// Generates HTML text to be used in description area.
    /// </summary>
    ///<param name="selectedValue">Selected item for which generate description</param>
    private string ShowInDescriptionArea(string selectedValue)
    {
        string description = String.Empty;

        if (!String.IsNullOrEmpty(selectedValue))
        {
            int templateId = ValidationHelper.GetInteger(selectedValue, 0);
            var template   = EmailTemplateInfoProvider.GetEmailTemplates()
                             .WhereEquals("TemplateID", templateId)
                             .Columns("TemplateDisplayName", "TemplateSubject")
                             .TopN(1)
                             .FirstOrDefault();
            if (template != null)
            {
                description = template.TemplateSubject;
            }
        }

        if (!String.IsNullOrEmpty(description))
        {
            return("<div class=\"Description\">" + HTMLHelper.HTMLEncode(description) + "</div>");
        }

        return(String.Empty);
    }
    /// <summary>
    /// Generates HTML text to be used in description area.
    /// </summary>
    ///<param name="selectedValue">Selected item for which generate description</param>
    private string ShowInDescriptionArea(string selectedValue)
    {
        string name        = String.Empty;
        string description = String.Empty;

        if (!String.IsNullOrEmpty(selectedValue))
        {
            int     templateId = ValidationHelper.GetInteger(selectedValue, 0);
            DataSet ds         = EmailTemplateInfoProvider.GetEmailTemplates("TemplateID=" + templateId, null, 1, "TemplateDisplayName, TemplateSubject");
            if (!DataHelper.DataSourceIsEmpty(ds))
            {
                name        = ResHelper.LocalizeString(ValidationHelper.GetString(ds.Tables[0].Rows[0]["TemplateDisplayName"], string.Empty));
                description = ValidationHelper.GetString(ds.Tables[0].Rows[0]["TemplateSubject"], string.Empty);
            }
        }
        else
        {
            name = GetString("newslettertemplate.selectitem");
        }

        string text = "<div class=\"ItemName\">" + HTMLHelper.HTMLEncode(name) + "</div>";

        if (description != null)
        {
            text += "<div class=\"Description\">" + HTMLHelper.HTMLEncode(description) + "</div>";
        }

        return(text);
    }
Beispiel #4
0
    /// <summary>
    /// Creates dynamic newsletter. Called when the "Create newsletter" button is pressed.
    /// </summary>
    private bool CreateDynamicNewsletter()
    {
        EmailTemplateInfo subscriptionTemplate   = EmailTemplateInfoProvider.GetEmailTemplateInfo("MyNewSubscriptionTemplate", SiteContext.CurrentSiteID);
        EmailTemplateInfo unsubscriptionTemplate = EmailTemplateInfoProvider.GetEmailTemplateInfo("MyNewUnsubscriptionTemplate", SiteContext.CurrentSiteID);

        if ((subscriptionTemplate != null) && (unsubscriptionTemplate != null))
        {
            // Create new dynamic newsletter object
            NewsletterInfo newNewsletter = new NewsletterInfo();

            // Set the properties
            newNewsletter.NewsletterDisplayName              = "My new dynamic newsletter";
            newNewsletter.NewsletterName                     = "MyNewDynamicNewsletter";
            newNewsletter.NewsletterType                     = NewsletterType.Dynamic;
            newNewsletter.NewsletterSubscriptionTemplateID   = subscriptionTemplate.TemplateID;
            newNewsletter.NewsletterUnsubscriptionTemplateID = unsubscriptionTemplate.TemplateID;
            newNewsletter.NewsletterSenderName               = "Sender name";
            newNewsletter.NewsletterSenderEmail              = "*****@*****.**";
            newNewsletter.NewsletterDynamicURL               = "http://www.google.com";
            newNewsletter.NewsletterDynamicSubject           = "My new dynamic issue";
            newNewsletter.NewsletterSiteID                   = SiteContext.CurrentSiteID;

            // Save the dynamic newsletter
            NewsletterInfoProvider.SetNewsletterInfo(newNewsletter);

            return(true);
        }

        return(false);
    }
    /// <summary>
    /// Gets and bulk updates issue templates. Called when the "Get and bulk update templates" button is pressed.
    /// Expects the CreateIssueTemplate method to be run first.
    /// </summary>
    private bool GetAndBulkUpdateIssueTemplates()
    {
        // Prepare the parameters
        string where = "TemplateName LIKE N'MyNewIssueTemplate%'";

        // Get the data
        DataSet templates = EmailTemplateInfoProvider.GetEmailTemplates(where, null);

        if (!DataHelper.DataSourceIsEmpty(templates))
        {
            // Loop through the individual items
            foreach (DataRow templateDr in templates.Tables[0].Rows)
            {
                // Create object from DataRow
                EmailTemplateInfo modifyTemplate = new EmailTemplateInfo(templateDr);

                // Update the properties
                modifyTemplate.TemplateDisplayName = modifyTemplate.TemplateDisplayName.ToUpper();

                // Save the changes
                EmailTemplateInfoProvider.SetEmailTemplateInfo(modifyTemplate);
            }

            return(true);
        }

        return(false);
    }
 private static ObjectQuery <EmailTemplateInfo> LoadAvailableEmailTemplates()
 {
     return(EmailTemplateInfoProvider.GetEmailTemplates()
            .Columns("TemplateID", "TemplateDisplayName", "TemplateDescription", "TemplateThumbnailGUID", "TemplateIconClass")
            .WhereEquals("TemplateType", EmailTemplateTypeEnum.Issue.ToStringRepresentation())
            .Where(GetAssignedTemplatesWhere()));
 }
Beispiel #7
0
    /// <summary>
    /// Gets and bulk updates issue templates. Called when the "Get and bulk update templates" button is pressed.
    /// Expects the CreateIssueTemplate method to be run first.
    /// </summary>
    private bool GetAndBulkUpdateIssueTemplates()
    {
        // Prepare the condition
        IWhereCondition whereCondition = new WhereCondition().Where("TemplateName", QueryOperator.Like, "MyNewIssueTemplate%");

        // Get the data
        var templates = EmailTemplateInfoProvider.GetEmailTemplates().Where(whereCondition);

        if (templates.Any())
        {
            // Loop through the individual items
            foreach (var template in templates)
            {
                // Update the properties
                template.TemplateDisplayName = template.TemplateDisplayName.ToUpper();

                // Save the changes
                EmailTemplateInfoProvider.SetEmailTemplateInfo(template);
            }

            return(true);
        }

        return(false);
    }
Beispiel #8
0
    private void InitPreheaderTooltip()
    {
        var template = EmailTemplateInfoProvider.GetEmailTemplateInfo(TemplateID);

        if (!template.ContainsPreheaderMacro())
        {
            iconHelpPreheader.Visible = lblScreenReaderPreheader.Visible = true;
            iconHelpPreheader.ToolTip = lblScreenReaderPreheader.Text = GetString("newsletterissue.preheader.tooltip");
        }
    }
Beispiel #9
0
    /// <summary>
    /// Deletes unsubscription template. Called when the "Delete template" button is pressed.
    /// Expects the CreateUnsubscriptionTemplate method to be run first.
    /// </summary>
    private bool DeleteUnsubscriptionTemplate()
    {
        // Get the unsubscription template
        EmailTemplateInfo deleteTemplate = EmailTemplateInfoProvider.GetEmailTemplateInfo("MyNewUnsubscriptionTemplate", SiteContext.CurrentSiteID);

        // Delete the unsubscription template
        EmailTemplateInfoProvider.DeleteEmailTemplateInfo(deleteTemplate);

        return(deleteTemplate != null);
    }
Beispiel #10
0
    /// <summary>
    /// Deletes issue template. Called when the "Delete template" button is pressed.
    /// Expects the CreateIssueTemplate method to be run first.
    /// </summary>
    private bool DeleteIssueTemplate()
    {
        // Get the issue template
        EmailTemplateInfo deleteTemplate = EmailTemplateInfoProvider.GetEmailTemplateInfo("MyNewIssueTemplate", SiteContext.CurrentSiteID);

        // Delete the issue template
        EmailTemplateInfoProvider.DeleteEmailTemplateInfo(deleteTemplate);

        return(deleteTemplate != null);
    }
    private void InitPreheaderTooltip(IssueInfo issue)
    {
        var template = EmailTemplateInfoProvider.GetEmailTemplateInfo(issue.IssueTemplateID);

        if (!template.ContainsPreheaderMacro() && !string.IsNullOrEmpty(issue.IssuePreheader))
        {
            lblPreheaderAlert.Visible = iconPreheaderAlert.Visible = true;
            lblPreheaderAlert.Text    = iconPreheaderAlert.ToolTip = GetString("newsletterissue.preheader.tooltip");
        }
    }
Beispiel #12
0
            public void SetUp()
            {
                mSite = CreateSiteInfo();
                SiteInfoProvider.SetSiteInfo(mSite);

                var emailTemplate = CreateEmailTemplateInfo(mSite.SiteID);

                EmailTemplateInfoProvider.SetEmailTemplateInfo(emailTemplate);

                mNewsletter = CreateNewsletterInfo(mSite.SiteID, emailTemplate.TemplateID);
                NewsletterInfoProvider.SetNewsletterInfo(mNewsletter);

                mNewsletterSubscriptionSettings = CreateNewsletterSubscriptionSettings(false);
                mNewsletterSubscriptionService  = new NewsletterSubscriptionService();
                Service.Use <IActivityLogService, ActivityLogServiceInMemoryFake>();

                SiteContext.CurrentSite = mSite;
            }
Beispiel #13
0
    /// <summary>
    /// Gets and updates issue template. Called when the "Get and update template" button is pressed.
    /// Expects the CreateIssueTemplate method to be run first.
    /// </summary>
    private bool GetAndUpdateIssueTemplate()
    {
        // Get the issue template
        EmailTemplateInfo updateTemplate = EmailTemplateInfoProvider.GetEmailTemplateInfo("MyNewIssueTemplate", SiteContext.CurrentSiteID);

        if (updateTemplate != null)
        {
            // Update the properties
            updateTemplate.TemplateDisplayName = updateTemplate.TemplateDisplayName.ToLower();

            // Save the changes
            EmailTemplateInfoProvider.SetEmailTemplateInfo(updateTemplate);

            return(true);
        }

        return(false);
    }
Beispiel #14
0
    /// <summary>
    /// Handles the UniGrid's OnAction event.
    /// </summary>
    /// <param name="actionName">Name of item (button) that throws event</param>
    /// <param name="actionArgument">ID (value of Primary key) of corresponding data row</param>
    protected void uniGrid_OnAction(string actionName, object actionArgument)
    {
        string templateId = actionArgument.ToString();

        switch (actionName.ToLowerCSafe())
        {
        // Edit the template
        case "edit":
            URLHelper.Redirect("NewsletterTemplate_Edit.aspx?templateid=" + templateId);
            break;

        // Delete the template
        case "delete":
            // Check 'Manage templates' permission
            if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.newsletter", "managetemplates"))
            {
                RedirectToCMSDeskAccessDenied("cms.newsletter", "managetemplates");
            }

            // Check if the template is used in a newsletter
            string where = string.Format("(NewsletterTemplateID={0}) OR (NewsletterSubscriptionTemplateID={0}) OR (NewsletterUnsubscriptionTemplateID={0}) OR (NewsletterOptInTemplateID={0})", templateId);

            DataSet newsByEmailtempl = NewsletterInfoProvider.GetNewsletters(where, null, 1, "NewsletterID");
            if (DataHelper.DataSourceIsEmpty(newsByEmailtempl))
            {
                // Check if the template is used in an issue
                DataSet newsletterIssues = IssueInfoProvider.GetIssues("IssueTemplateID = " + templateId, null, 1, "IssueID");
                if (DataHelper.DataSourceIsEmpty(newsletterIssues))
                {
                    // Delete EmailTemplate object from database
                    EmailTemplateInfoProvider.DeleteEmailTemplateInfo(ValidationHelper.GetInteger(templateId, 0));
                }
                else
                {
                    ShowError(GetString("NewsletterTemplate_List.TemplateInUseByNewsletterIssue"));
                }
            }
            else
            {
                ShowError(GetString("NewsletterTemplate_List.TemplateInUseByNewsletter"));
            }
            break;
        }
    }
 /// <summary>
 /// Processes the stylesheet.
 /// </summary>
 protected void ProcessStylesheet()
 {
     // Newsletter template stylesheet
     if (!string.IsNullOrEmpty(newsletterTemplateName))
     {
         // Get the template
         et = EmailTemplateInfoProvider.GetEmailTemplateInfo(newsletterTemplateName, SiteContext.CurrentSiteID);
         if (et != null)
         {
             // Create the output file
             outputFile = new CMSOutputResource()
             {
                 Name = RequestContext.URL.ToString(),
                 Data = HTMLHelper.ResolveCSSUrls(et.TemplateStylesheetText, SystemContext.ApplicationPath),
                 Etag = et.TemplateName
             };
         }
     }
 }
    /// <summary>
    /// Creates unsubscription template. Called when the "Create template" button is pressed.
    /// </summary>
    private bool CreateUnsubscriptionTemplate()
    {
        // Create new unsubscription template object
        EmailTemplateInfo newTemplate = new EmailTemplateInfo();

        // Set the properties
        newTemplate.TemplateDisplayName = "My new unsubscription template";
        newTemplate.TemplateName        = "MyNewUnsubscriptionTemplate";
        newTemplate.TemplateType        = EmailTemplateType.Unsubscription;
        newTemplate.TemplateBody        = "My new unsubscription template body";
        newTemplate.TemplateHeader      = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>Newsletter</title><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" /></head><body>";
        newTemplate.TemplateFooter      = "</body></html>";
        newTemplate.TemplateSiteID      = CMSContext.CurrentSiteID;

        // Save the unsubscription template
        EmailTemplateInfoProvider.SetEmailTemplateInfo(newTemplate);

        return(true);
    }
Beispiel #17
0
    /// <summary>
    /// Creates issue template. Called when the "Create template" button is pressed.
    /// </summary>
    private bool CreateIssueTemplate()
    {
        // Create new issue template object
        EmailTemplateInfo newTemplate = new EmailTemplateInfo();

        // Set the properties
        newTemplate.TemplateDisplayName = "My new issue template";
        newTemplate.TemplateName        = "MyNewIssueTemplate";
        newTemplate.TemplateType        = EmailTemplateType.Issue;
        newTemplate.TemplateBody        = "<p>My new issue template body</p><p>$$content:800:600$$</p>";
        newTemplate.TemplateHeader      = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>Newsletter</title><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" /></head><body>";
        newTemplate.TemplateFooter      = "</body></html>";
        newTemplate.TemplateSiteID      = SiteContext.CurrentSiteID;

        // Save the issue template
        EmailTemplateInfoProvider.SetEmailTemplateInfo(newTemplate);

        return(true);
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        templateId = QueryHelper.GetInteger("templateid", 0);

        if (templateId <= 0)
        {
            pnlAvailability.Visible = false;
            return;
        }

        EditedObject = emailTemplateInfo = EmailTemplateInfoProvider.GetEmailTemplateInfo(templateId);

        // Initialize newsletter selector
        usNewsletters.WhereCondition = String.Format("NewsletterSiteID={0} AND NewsletterType='{1}' AND NewsletterTemplateID<>{2}", CMSContext.CurrentSiteID,
                                                     SqlHelperClass.GetSafeQueryString(NewsletterType.TemplateBased), emailTemplateInfo.TemplateID);

        if (!RequestHelper.IsPostBack())
        {
            LoadSiteBindings();
        }

        usNewsletters.OnSelectionChanged += usSites_OnSelectionChanged;
    }
Beispiel #19
0
    /// <summary>
    /// Sets data to database.
    /// </summary>
    protected void btnOK_Click(object sender, EventArgs e)
    {
        string errorMessage = new Validator().NotEmpty(txtTemplateDisplayName.Text.Trim(), GetString("general.requiresdisplayname"))
                              .NotEmpty(txtTemplateName.Text.Trim(), GetString("NewsletterTemplate_Edit.ErrorEmptyName"))
                              .IsCodeName(txtTemplateName.Text.Trim(), GetString("General.ErrorCodeNameInIdentifierFormat")).Result;

        if (String.IsNullOrEmpty(errorMessage))
        {
            int siteId = CMSContext.CurrentSiteID;
            // TemplateName must to be unique
            EmailTemplateInfo emailTemplateObj = EmailTemplateInfoProvider.GetEmailTemplateInfo(txtTemplateName.Text.Trim(), siteId);

            // If templateName value is unique
            if (emailTemplateObj == null)
            {
                string type;
                int    typeValue = Convert.ToInt32(drpTemplateType.SelectedValue);
                switch (typeValue)
                {
                default:
                case 0:
                    type = "D";     // Double opt-in
                    break;

                case 1:
                    type = "I";     // Issue
                    break;

                case 2:
                    type = "S";     // Subscription
                    break;

                case 3:
                    type = "U";     // Unsubscription
                    break;
                }

                // Create new item -> insert
                emailTemplateObj = new EmailTemplateInfo();
                emailTemplateObj.TemplateType        = type;
                emailTemplateObj.TemplateBody        = string.Empty;
                emailTemplateObj.TemplateName        = txtTemplateName.Text.Trim();
                emailTemplateObj.TemplateHeader      = "<html>\n<head>\n</head>\n<body>";
                emailTemplateObj.TemplateFooter      = "</body>\n</html>";
                emailTemplateObj.TemplateDisplayName = txtTemplateDisplayName.Text.Trim();
                emailTemplateObj.TemplateSiteID      = siteId;

                EmailTemplateInfoProvider.SetEmailTemplateInfo(emailTemplateObj);

                URLHelper.Redirect("NewsletterTemplate_Edit.aspx?templateid=" + Convert.ToString(emailTemplateObj.TemplateID) + "&saved=1");
            }
            else
            {
                lblError.Visible = true;
                lblError.Text    = GetString("NewsletterTemplate_Edit.TemplateNameExists");
            }
        }
        else
        {
            lblError.Visible = true;
            lblError.Text    = errorMessage;
        }
    }
    /// <summary>
    /// Fired when the step is being loaded.
    /// </summary>
    protected void InitStep(object sender, EventArgs e)
    {
        // Drop flag
        stepLoaded = false;

        StepEventArgs args = (StepEventArgs)e;

        switch (args.CurrentStep)
        {
        case 1:
            // TEMPLATE SELECTION
            selectElem.StopProcessing = (newsletterId <= 0);

            // Check if at least one additional template is available for the newsletter
            // ... otherwise skip the first step
            if (newsletterId > 0)
            {
                string where = String.Format("TemplateType='{1}' AND (NOT TemplateID IN (SELECT NewsletterTemplateID FROM Newsletter_Newsletter WHERE NewsletterID={0}))" +
                                             "AND (TemplateID IN (SELECT TemplateID FROM Newsletter_EmailTemplateNewsletter WHERE NewsletterID={0}))", newsletterId, EmailTemplateType.Issue);
                DataSet ds = EmailTemplateInfoProvider.GetEmailTemplates(where, null, 1, "TemplateID");

                if (!DataHelper.DataSourceIsEmpty(ds))
                {
                    // Inicialize template selector
                    selectElem.NewsletterId = newsletterId;

                    // Register JS function for double-click template selection
                    string javascript = "function SelectTemplate(value, skipDialog){" + Page.ClientScript.GetPostBackEventReference(btnTemplateNext, null) + "; return false;}";
                    ScriptHelper.RegisterStartupScript(this, typeof(string), "TemplateSelector", ScriptHelper.GetScript(javascript));

                    selectElem.SelectFunction = "SelectTemplate";
                }
                else
                {
                    // Skip this step
                    args.Skip = SelectionSkipped = true;
                }
            }
            break;

        case 2:
            // CONTENT EDITING
            // Get variant issue ID if A/B testing is ON
            IssueId = InitVariantSlider(IssueId);

            editElem.StopProcessing = (newsletterId <= 0);
            editElem.NewsletterID   = newsletterId;
            editElem.IssueID        = IssueId;
            editElem.TemplateID     = templateId;
            editElem.ReloadData(false);

            // Initialize action menu
            InitHeaderActions();

            sendVariant.ForceReloadNeeded = true;      // control needs to be reloaded in the next step
            break;

        case 3:
            // SENDING CONFIGURATION
            bool isIssueVariant = IssueInfoProvider.IsABTestIssue(IssueId);
            if (!isIssueVariant)
            {
                sendElem.StopProcessing = ((newsletterId <= 0) || (IssueId <= 0));
                sendElem.NewsletterID   = newsletterId;
                sendElem.IssueID        = IssueId;
            }
            else
            {
                sendVariant.StopProcessing = (IssueId <= 0);
                sendVariant.IssueID        = IssueId;
                sendVariant.ReloadData();
            }
            sendElem.Visible    = !isIssueVariant;
            sendVariant.Visible = isIssueVariant;
            break;
        }
    }
Beispiel #21
0
    /// <summary>
    /// Creates new variant and raises "Add" event if specified.
    /// </summary>
    /// <param name="name">Name of new variant</param>
    /// <param name="issueId">ID of source issue on which the new variant will be based</param>
    private void RaiseOnAddEvent(string name, int issueId)
    {
        // Get main issue (original)
        int       currentIssuedId = IssueID;
        IssueInfo parentIssue     = IssueInfoProvider.GetOriginalIssue(currentIssuedId);

        // Allow modifying issues in idle state only
        if ((parentIssue == null) || (parentIssue.IssueStatus != IssueStatusEnum.Idle))
        {
            return;
        }

        // Get issue content specified by ID (if not found use original)
        IssueInfo contentIssue = null;

        if (issueId > 0)
        {
            if (issueId == parentIssue.IssueID)
            {
                contentIssue = parentIssue;
            }
            else
            {
                contentIssue = IssueInfoProvider.GetIssueInfo(issueId);
            }
        }

        NewsletterInfo newsletter = NewsletterInfoProvider.GetNewsletterInfo(parentIssue.IssueNewsletterID);

        // ID of the first child (if new A/B test is being created (i.e. parent and 2 children)
        int origVariantId = 0;

        // Check if current issue is variant issue
        if (!parentIssue.IssueIsABTest)
        {
            // Variant issue has not been created yet => create original and 2 child variants
            parentIssue.IssueIsABTest = true;

            // Create 1st variant based on parent issue, the 2nd variant will be created as ordinary variant below
            IssueInfo issueOrigVariant = parentIssue.Clone(true);
            issueOrigVariant.IssueVariantOfIssueID = parentIssue.IssueID;
            issueOrigVariant.IssueVariantName      = GetString("newsletter.abvariantoriginal");
            issueOrigVariant.IssueScheduledTaskID  = 0;
            IssueInfoProvider.SetIssueInfo(issueOrigVariant);
            // Create scheduled task for variant mail-out and update issue variant
            issueOrigVariant.IssueScheduledTaskID = CreateScheduledTask(issueOrigVariant);
            IssueInfoProvider.SetIssueInfo(issueOrigVariant);
            // Update parent issue
            IssueInfoProvider.SetIssueInfo(parentIssue);
            try
            {
                ObjectVersionManager.DestroyObjectHistory(parentIssue.ObjectType, parentIssue.IssueID);
            }
            catch (Exception ex)
            {
                EventLogProvider.LogException("Newsletter-AddVariant", "EXCEPTION", ex);
            }

            origVariantId = issueOrigVariant.IssueID;
        }

        // Variant issue has been created => create new variant only
        IssueInfo issueVariant = (contentIssue != null ? contentIssue.Clone(true) : parentIssue.Clone(true));

        issueVariant.IssueVariantName      = name;
        issueVariant.IssueVariantOfIssueID = parentIssue.IssueID;

        // Prepare content with empty regions if empty content will be used
        string[] regions = null;
        if ((contentIssue == null) && (newsletter != null))
        {
            EmailTemplateInfo template = EmailTemplateInfoProvider.GetEmailTemplateInfo(newsletter.NewsletterTemplateID);
            if (template != null)
            {
                bool          isValidRegionName;
                List <string> regionNames = new List <string>();
                EmailTemplateHelper.ValidateEditableRegions(template.TemplateBody, out isValidRegionName, out isValidRegionName, regionNames);
                for (int i = regionNames.Count - 1; i >= 0; i--)
                {
                    regionNames[i] = regionNames[i] + "::";
                }
                regions = regionNames.ToArray();
                // Set template ID (i.e. this template with these regions is used for current issue)
                issueVariant.IssueTemplateID = template.TemplateID;
            }
        }

        issueVariant.IssueText            = (contentIssue != null ? contentIssue.IssueText : IssueHelper.GetContentXML(regions));
        issueVariant.IssueScheduledTaskID = 0;
        IssueInfoProvider.SetIssueInfo(issueVariant);

        // Duplicate attachments and replace old guids with new guids in issue text if current variant issue is based on content of another
        if (contentIssue != null)
        {
            List <Guid> guids = new List <Guid>();
            MetaFileInfoProvider.CopyMetaFiles(contentIssue.IssueID, issueVariant.IssueID,
                                               (contentIssue.IssueIsVariant ? IssueInfo.OBJECT_TYPE_VARIANT : IssueInfo.OBJECT_TYPE),
                                               ObjectAttachmentsCategories.ISSUE, IssueInfo.OBJECT_TYPE_VARIANT, ObjectAttachmentsCategories.ISSUE, guids);
            if (guids.Count > 0)
            {
                for (int i = 0; i < guids.Count; i += 2)
                {
                    issueVariant.IssueText = LinkConverter.ReplaceInLink(issueVariant.IssueText, guids[i].ToString(), guids[i + 1].ToString());
                }
            }
        }

        // Create scheduled task for variant mail-out
        issueVariant.IssueScheduledTaskID = CreateScheduledTask(issueVariant);
        // Update issue variant
        IssueInfoProvider.SetIssueInfo(issueVariant);

        if (origVariantId > 0)
        {
            // New A/B test issue created => create new A/B test info
            ABTestInfo abi = new ABTestInfo
            {
                TestIssueID = parentIssue.IssueID, TestSizePercentage = 50, TestWinnerOption = ABTestWinnerSelectionEnum.OpenRate, TestSelectWinnerAfter = 60
            };
            ABTestInfoProvider.SetABTestInfo(abi);

            // Move attachments (meta files) from parent issue to first variant
            MetaFileInfoProvider.MoveMetaFiles(parentIssue.IssueID, origVariantId, IssueInfo.OBJECT_TYPE, ObjectAttachmentsCategories.ISSUE, IssueInfo.OBJECT_TYPE_VARIANT, ObjectAttachmentsCategories.ISSUE);
            MetaFileInfoProvider.MoveMetaFiles(parentIssue.IssueID, origVariantId, IssueInfo.OBJECT_TYPE_VARIANT, ObjectAttachmentsCategories.ISSUE, IssueInfo.OBJECT_TYPE_VARIANT, ObjectAttachmentsCategories.ISSUE);
        }

        if (OnAddVariant != null)
        {
            VariantEventArgs args = new VariantEventArgs(name, issueVariant.IssueID);
            OnAddVariant(this, args);
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        // Get subscriber by its ID and check its existence
        var template = EditedObject as EmailTemplateInfo;

        if (template == null)
        {
            RedirectToAccessDenied(GetString("general.invalidparameters"));
        }

        if (!template.CheckPermissions(PermissionsEnum.Read, CurrentSiteName, CurrentUser))
        {
            RedirectToAccessDenied(template.TypeInfo.ModuleName, "ManageTemplates");
        }

        rfvTemplateDisplayName.ErrorMessage = GetString("general.requiresdisplayname");
        rfvTemplateName.ErrorMessage        = GetString("NewsletterTemplate_Edit.ErrorEmptyName");

        ScriptHelper.RegisterSpellChecker(this);

        // Control initializations
        string varsScript = string.Format("var emptyNameMsg = '{0}'; \nvar emptyWidthMsg = '{1}'; \nvar emptyHeightMsg = '{2}'; \nvar spellURL = '{3}'; \n",
                                          GetString("NewsletterTemplate_Edit.EmptyNameMsg"),
                                          GetString("NewsletterTemplate_Edit.EmptyWidthMsg"),
                                          GetString("NewsletterTemplate_Edit.EmptyHeightMsg"),
                                          AuthenticationHelper.ResolveDialogUrl("~/CMSModules/Content/CMSDesk/Edit/SpellCheck.aspx"));

        ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "Script_" + ClientID, ScriptHelper.GetScript(varsScript));

        // Set fields to be checked by Spell Checker
        string spellCheckScript = string.Format("if (typeof(spellCheckFields)==='undefined') {{var spellCheckFields = new Array();}} spellCheckFields.push('{0}');",
                                                htmlTemplateBody.ClientID);

        ScriptHelper.RegisterStartupScript(this, typeof(string), ClientID, ScriptHelper.GetScript(spellCheckScript));

        // Get edited object and its existence
        EmailTemplateInfo emailTemplateObj = (EmailTemplateInfo)EditedObject;

        templateid = emailTemplateObj.TemplateID;

        // Display editable region section only for e-mail templates of type "Issue template"
        if (emailTemplateObj.TemplateType == EmailTemplateType.Issue)
        {
            pnlEditableRegion.Visible = true;
            plcThumb.Visible          = true;
            ucThumbnail.Visible       = true;
            ucThumbnail.ObjectID      = emailTemplateObj.TemplateID;
            ucThumbnail.ObjectType    = EmailTemplateInfo.OBJECT_TYPE;
            ucThumbnail.Category      = ObjectAttachmentsCategories.THUMBNAIL;
            ucThumbnail.SiteID        = emailTemplateObj.TemplateSiteID;
        }
        else
        {
            plcSubject.Visible = true;
        }

        // Init CSS styles every time during page load
        htmlTemplateBody.EditorAreaCSS = EmailTemplateInfoProvider.GetStylesheetUrl(emailTemplateObj.TemplateName) + "&timestamp=" + DateTime.Now.Millisecond;

        // Initialize header actions
        InitHeaderActions(emailTemplateObj.TemplateID);

        // Initialize HTML editor
        InitHTMLEditor(emailTemplateObj);

        if (!RequestHelper.IsPostBack())
        {
            // Initialize dialog
            LoadData(emailTemplateObj);

            // Show that the emailTemplate was created successfully
            if (QueryHelper.GetBoolean("saved", false))
            {
                ShowChangesSaved();
            }
        }
    }
    /// <summary>
    /// Actions handler.
    /// </summary>
    protected void HeaderActions_ActionPerformed(object sender, CommandEventArgs e)
    {
        switch (e.CommandName.ToLowerCSafe())
        {
        case "save":
            // Check 'Manage templates' permission
            if (!MembershipContext.AuthenticatedUser.IsAuthorizedPerResource("cms.newsletter", "managetemplates"))
            {
                RedirectToAccessDenied("cms.newsletter", "managetemplates");
            }

            string errorMessage;
            // Check template code name
            if (!ValidationHelper.IsCodeName(txtTemplateName.Text))
            {
                errorMessage = GetString("General.ErrorCodeNameInIdentifierFormat");
            }
            else
            {
                // Check code and display name for emptiness
                errorMessage = new Validator().NotEmpty(txtTemplateDisplayName.Text, GetString("general.requiresdisplayname")).NotEmpty(txtTemplateName.Text, GetString("NewsletterTemplate_Edit.ErrorEmptyName")).Result;
            }

            if (string.IsNullOrEmpty(errorMessage))
            {
                // TemplateName must to be unique
                EmailTemplateInfo emailTemplateObj = EmailTemplateInfoProvider.GetEmailTemplateInfo(txtTemplateName.Text.Trim(), SiteContext.CurrentSiteID);

                // If templateName value is unique
                if ((emailTemplateObj == null) || (emailTemplateObj.TemplateID == templateid))
                {
                    // If templateName value is unique -> determine whether it is update or insert
                    if ((emailTemplateObj == null))
                    {
                        // Get EmailTemplate object by primary key
                        emailTemplateObj = EmailTemplateInfoProvider.GetEmailTemplateInfo(templateid) ?? new EmailTemplateInfo();
                    }

                    // Check region names validity
                    bool   isValidRegionName;
                    bool   isValid;
                    string templateBody = htmlTemplateBody.ResolvedValue.Trim();

                    EmailTemplateHelper.ValidateEditableRegions(templateBody, out isValid, out isValidRegionName, null);
                    if (isValid)
                    {
                        if (isValidRegionName)
                        {
                            // Set template object
                            emailTemplateObj.TemplateBody           = templateBody;
                            emailTemplateObj.TemplateName           = txtTemplateName.Text.Trim();
                            emailTemplateObj.TemplateHeader         = ValidationHelper.GetString(txtTemplateHeader.Value, "").Trim();
                            emailTemplateObj.TemplateFooter         = ValidationHelper.GetString(txtTemplateFooter.Value, "").Trim();
                            emailTemplateObj.TemplateDisplayName    = txtTemplateDisplayName.Text.Trim();
                            emailTemplateObj.TemplateStylesheetText = txtTemplateStyleSheetText.Text.Trim();

                            // Set temaplte subject only for 'subscription' and 'unsubscription' template types
                            if (plcSubject.Visible)
                            {
                                emailTemplateObj.TemplateSubject = txtTemplateSubject.Text.Trim();
                            }

                            // Save the template object and display info message
                            EmailTemplateInfoProvider.SetEmailTemplateInfo(emailTemplateObj);
                            ShowChangesSaved();

                            // Reload header if changes were saved
                            ScriptHelper.RefreshTabHeader(Page, emailTemplateObj.TemplateDisplayName);
                        }
                        else
                        {
                            ShowError(GetString("NewsletterTemplate_Edit.EditableRegionNameError"));
                        }
                    }
                    else
                    {
                        ShowError(GetString("NewsletterTemplate_Edit.EditableRegionError"));
                    }
                }
                else
                {
                    ShowError(GetString("NewsletterTemplate_Edit.TemplateNameExists"));
                }
            }
            else
            {
                ShowError(errorMessage);
            }
            break;
        }
    }
    /// <summary>
    /// Handles the UniGrid's OnAction event.
    /// </summary>
    /// <param name="actionName">Name of item (button) that throws event</param>
    /// <param name="actionArgument">ID (value of Primary key) of corresponding data row</param>
    protected void uniGrid_OnAction(string actionName, object actionArgument)
    {
        string templateId = actionArgument.ToString();

        switch (actionName.ToLowerCSafe())
        {
        // Edit the template
        case "edit":

            string url = UIContextHelper.GetElementUrl("cms.newsletter", "TemplateProperties", false, templateId.ToInteger(0));
            URLHelper.Redirect(url);

            break;

        // Delete the template
        case "delete":
            // Check 'Manage templates' permission
            var template = EmailTemplateInfoProvider.GetEmailTemplateInfo(ValidationHelper.GetInteger(actionArgument, 0));
            if (template == null)
            {
                RedirectToAccessDenied(GetString("general.invalidparameters"));
            }

            if (!template.CheckPermissions(PermissionsEnum.Delete, CurrentSiteName, CurrentUser))
            {
                RedirectToAccessDenied("cms.newsletter", "managetemplates");
            }

            // Check if the template is used in a newsletter
            var newsByEmailtempl = NewsletterInfoProvider
                                   .GetNewsletters()
                                   .WhereEquals("NewsletterTemplateID", templateId)
                                   .Or()
                                   .WhereEquals("NewsletterSubscriptionTemplateID", templateId)
                                   .Or()
                                   .WhereEquals("NewsletterUnsubscriptionTemplateID", templateId)
                                   .Or()
                                   .WhereEquals("NewsletterOptInTemplateID", templateId)
                                   .Column("NewsletterID")
                                   .TopN(1);

            if (!newsByEmailtempl.Any())
            {
                // Check if the template is used in an issue
                var newsletterIssuesIDs = IssueInfoProvider.GetIssues().WhereEquals("IssueTemplateID", templateId).TopN(1).Column("IssueID");
                if (!newsletterIssuesIDs.Any())
                {
                    // Delete EmailTemplate object from database
                    EmailTemplateInfoProvider.DeleteEmailTemplateInfo(ValidationHelper.GetInteger(templateId, 0));
                }
                else
                {
                    ShowError(GetString("NewsletterTemplate_List.TemplateInUseByNewsletterIssue"));
                }
            }
            else
            {
                ShowError(GetString("NewsletterTemplate_List.TemplateInUseByNewsletter"));
            }
            break;
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        rfvTemplateDisplayName.ErrorMessage = GetString("general.requiresdisplayname");
        rfvTemplateName.ErrorMessage        = GetString("NewsletterTemplate_Edit.ErrorEmptyName");

        ScriptHelper.RegisterSpellChecker(this);

        // Control initializations
        string varsScript = string.Format("var emptyNameMsg = '{0}'; \nvar emptyWidthMsg = '{1}'; \nvar emptyHeightMsg = '{2}'; \nvar spellURL = '{3}'; \n",
                                          GetString("NewsletterTemplate_Edit.EmptyNameMsg"),
                                          GetString("NewsletterTemplate_Edit.EmptyWidthMsg"),
                                          GetString("NewsletterTemplate_Edit.EmptyHeightMsg"),
                                          CMSContext.ResolveDialogUrl("~/CMSModules/Content/CMSDesk/Edit/SpellCheck.aspx"));

        ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "Script_" + ClientID, ScriptHelper.GetScript(varsScript));

        // Set fields to be checked by Spell Checker
        string spellCheckScript = string.Format("if (typeof(spellCheckFields)==='undefined') {{var spellCheckFields = new Array();}} spellCheckFields.push('{0}');",
                                                htmlTemplateBody.ClientID);

        ScriptHelper.RegisterStartupScript(this, typeof(string), ClientID, ScriptHelper.GetScript(spellCheckScript));

        string currentEmailTemplate = GetString("NewsletterTemplate_Edit.NewItemCaption");

        // Get edited object and its existence
        EmailTemplateInfo emailTemplateObj = (EmailTemplateInfo)EditedObject;

        templateid = emailTemplateObj.TemplateID;

        currentEmailTemplate = emailTemplateObj.TemplateDisplayName;

        // Display editable region section only for e-mail templates of type "Issue template"
        if (emailTemplateObj.TemplateType == EmailTemplateType.Issue)
        {
            pnlEditableRegion.Visible = true;
            plcThumb.Visible          = true;
            ucThumbnail.Visible       = true;
            ucThumbnail.ObjectID      = emailTemplateObj.TemplateID;
            ucThumbnail.ObjectType    = NewsletterObjectType.NEWSLETTERTEMPLATE;
            ucThumbnail.Category      = MetaFileInfoProvider.OBJECT_CATEGORY_THUMBNAIL;
            ucThumbnail.SiteID        = emailTemplateObj.TemplateSiteID;
        }
        else
        {
            plcSubject.Visible = true;
        }

        // Init CSS styles every time during page load
        htmlTemplateBody.EditorAreaCSS = EmailTemplateInfoProvider.GetStylesheetUrl(emailTemplateObj.TemplateName) + "&timestamp=" + DateTime.Now.Millisecond;

        // Initialize header actions
        InitHeaderActions(emailTemplateObj.TemplateID);

        // Initialize HTML editor
        InitHTMLEditor(emailTemplateObj);

        if (!RequestHelper.IsPostBack())
        {
            // Initialize dialog
            LoadData(emailTemplateObj);

            // Show that the emailTemplate was created successfully
            if (QueryHelper.GetBoolean("saved", false))
            {
                ShowChangesSaved();
            }
        }
    }
    /// <summary>
    /// Loads content from specific newsletter template.
    /// </summary>
    private void LoadContent()
    {
        EmailTemplateInfo emailTemplate = EmailTemplateInfoProvider.GetEmailTemplateInfo(mTemplateID);

        if ((emailTemplate == null) || string.IsNullOrEmpty(emailTemplate.TemplateBody))
        {
            return;
        }

        // Remove security parameters from macros
        string templateText = MacroResolver.RemoveSecurityParameters(emailTemplate.TemplateBody, true, null);

        if (!RequestHelper.IsPostBack() && (issue != null))
        {
            // Load content of editable regions
            IssueHelper.LoadRegionsContents(ref regionsContents, issue.IssueText);
        }

        CMSEditableRegion editableRegion = null;
        LiteralControl    before         = null;
        int    count     = 0;
        int    textStart = 0;
        string region    = null;

        string[] parts           = null;
        string   name            = null;
        int      width           = 0;
        int      height          = 0;
        string   toolbarLocation = "Out:CKEditorToolbar";
        string   toolbarSetName  = "Newsletter";

        int editRegStart = templateText.IndexOfCSafe("$$", textStart);
        int editRegEnd   = 0;

        // Apply CSS e-mail template style
        HTMLHelper.AddToHeader(Page, CSSHelper.GetCSSFileLink(EmailTemplateInfoProvider.GetStylesheetUrl(emailTemplate.TemplateName)));

        while (editRegStart >= 0)
        {
            count++;

            before = new LiteralControl();
            // Get template text surrounding editable regions - make links absolute
            before.Text = URLHelper.MakeLinksAbsolute(templateText.Substring(textStart, (editRegStart - textStart)));
            plcContent.Controls.Add(before);

            // End of region
            editRegStart += 2;
            textStart     = editRegStart;
            if (editRegStart < templateText.Length - 1)
            {
                editRegEnd = templateText.IndexOfCSafe("$$", editRegStart);
                if (editRegEnd >= 0)
                {
                    region = templateText.Substring(editRegStart, editRegEnd - editRegStart);
                    parts  = (region + ":" + ":").Split(':');

                    try
                    {
                        name = parts[0];
                        if (!string.IsNullOrEmpty(name.Trim()))
                        {
                            width  = ValidationHelper.GetInteger(parts[1], 0);
                            height = ValidationHelper.GetInteger(parts[2], 0);

                            editableRegion            = new CMSEditableRegion();
                            editableRegion.ID         = name;
                            editableRegion.RegionType = CMSEditableRegionTypeEnum.HtmlEditor;
                            editableRegion.ViewMode   = ViewModeEnum.Edit;

                            editableRegion.DialogHeight = height;
                            editableRegion.DialogWidth  = width;

                            editableRegion.WordWrap = false;
                            editableRegion.HtmlAreaToolbarLocation = toolbarLocation;
                            editableRegion.RegionTitle             = name;
                            editableRegion.UseStylesheet           = false;
                            editableRegion.HTMLEditorCssStylesheet = EmailTemplateInfoProvider.GetStylesheetUrl(emailTemplate.TemplateName);

                            if (!mReadOnly)
                            {
                                editableRegion.HtmlAreaToolbar = toolbarSetName;
                            }
                            else
                            {
                                editableRegion.HtmlAreaToolbar = "Disabled";
                            }

                            CMSHtmlEditor editor = editableRegion.HtmlEditor;
                            editor.AddExtraPlugin("CMSPlugins");
                            editor.AddExtraPlugin("autogrow");
                            editor.AutoGrowMinHeight            = height;
                            editor.LinkDialogConfig.UseFullURL  = true;
                            editor.QuickInsertConfig.UseFullURL = true;
                            editor.ResolverName = "NewsletterResolver";

                            DialogConfiguration dialogConfig = editor.MediaDialogConfig;
                            dialogConfig.UseFullURL         = true;
                            dialogConfig.MetaFileObjectID   = (issue != null) ? issue.IssueID : 0;
                            dialogConfig.MetaFileObjectType = (issue != null) && issue.IssueIsVariant ? NewsletterObjectType.NEWSLETTERISSUEVARIANT : NewsletterObjectType.NEWSLETTERISSUE;
                            dialogConfig.MetaFileCategory   = MetaFileInfoProvider.OBJECT_CATEGORY_ISSUE;
                            dialogConfig.HideAttachments    = false;

                            editableRegion.LoadContent(ValidationHelper.GetString(regionsContents[name.ToLowerCSafe()], string.Empty));

                            plcContent.Controls.Add(editableRegion);

                            textStart = editRegEnd + 2;
                        }
                    }
                    catch
                    {
                    }
                }
            }
            editRegStart = templateText.IndexOfCSafe("$$", textStart);
        }

        before      = new LiteralControl();
        before.Text = URLHelper.MakeLinksAbsolute(templateText.Substring(textStart));

        plcContent.Controls.Add(before);
    }
    /// <summary>
    /// Loads content from specific newsletter template.
    /// </summary>
    private void LoadContent()
    {
        var urlHelper = new URLHelper();

        EmailTemplateInfo emailTemplate = EmailTemplateInfoProvider.GetEmailTemplateInfo(mTemplateID);

        if ((emailTemplate == null) || string.IsNullOrEmpty(emailTemplate.TemplateBody))
        {
            return;
        }

        // Remove security parameters from macros
        string templateText = MacroSecurityProcessor.RemoveSecurityParameters(emailTemplate.TemplateBody, true, null);

        if (!RequestHelper.IsPostBack() && (issue != null))
        {
            // Load content of editable regions
            IssueHelper.LoadRegionsContents(ref regionsContents, issue.IssueText);
        }

        LiteralControl before;
        int            count           = 0;
        int            textStart       = 0;
        string         toolbarLocation = "Out:CKToolbar";
        string         toolbarSetName  = "Newsletter";

        int editRegStart = templateText.IndexOfCSafe("$$", textStart);

        // Apply CSS e-mail template style
        Page.AddToHeader(CssLinkHelper.GetCssFileLink(EmailTemplateInfoProvider.GetStylesheetUrl(emailTemplate.TemplateName)));

        string domainName = SiteContext.CurrentSite.SiteIsContentOnly ? SiteContext.CurrentSite.SitePresentationURL : SiteContext.CurrentSite.DomainName;

        while (editRegStart >= 0)
        {
            count++;
            before = new LiteralControl();
            // Get template text surrounding editable regions - make links absolute
            before.Text = urlHelper.MakeLinksAbsolute(templateText.Substring(textStart, (editRegStart - textStart)), domainName);
            plcContent.Controls.Add(before);

            // End of region
            editRegStart += 2;
            textStart     = editRegStart;
            if (editRegStart < templateText.Length - 1)
            {
                int editRegEnd = templateText.IndexOfCSafe("$$", editRegStart);
                if (editRegEnd >= 0)
                {
                    string   region = templateText.Substring(editRegStart, editRegEnd - editRegStart);
                    string[] parts  = (region + ":" + ":").Split(':');

                    try
                    {
                        string name = parts[0];
                        if (!string.IsNullOrEmpty(name.Trim()))
                        {
                            Regex intNumber = RegexHelper.GetRegex("^[0-9]+");
                            int   width     = ValidationHelper.GetInteger(intNumber.Match(parts[1]).Value, 0);
                            int   height    = ValidationHelper.GetInteger(intNumber.Match(parts[2]).Value, 0);

                            CMSEditableRegion editableRegion = new CMSEditableRegion();
                            editableRegion.ID         = name;
                            editableRegion.RegionType = CMSEditableRegionTypeEnum.HtmlEditor;
                            editableRegion.ViewMode   = ViewModeEnum.Edit;

                            editableRegion.DialogHeight = height;
                            editableRegion.DialogWidth  = width;

                            editableRegion.WordWrap = false;
                            editableRegion.HtmlAreaToolbarLocation = toolbarLocation;
                            editableRegion.RegionTitle             = name;
                            editableRegion.UseStylesheet           = false;
                            editableRegion.HTMLEditorCssStylesheet = EmailTemplateInfoProvider.GetStylesheetUrl(emailTemplate.TemplateName);

                            if (!mReadOnly)
                            {
                                editableRegion.HtmlAreaToolbar = toolbarSetName;
                            }
                            else
                            {
                                editableRegion.HtmlAreaToolbar = "Disabled";
                            }

                            CMSHtmlEditor editor = editableRegion.HtmlEditor;
                            editor.ExtraPlugins.Add("autogrow");
                            editor.AutoGrowMinHeight = height;
                            editor.ResolverName      = "NewsletterResolver";

                            DialogConfiguration dialogConfig = editor.MediaDialogConfig;
                            dialogConfig.MetaFileObjectID   = (issue != null) ? issue.IssueID : 0;
                            dialogConfig.MetaFileObjectType = (issue != null) && issue.IssueIsVariant ? IssueInfo.OBJECT_TYPE_VARIANT : IssueInfo.OBJECT_TYPE;
                            dialogConfig.MetaFileCategory   = ObjectAttachmentsCategories.ISSUE;
                            dialogConfig.HideAttachments    = false;

                            editableRegion.LoadContent(ValidationHelper.GetString(regionsContents[name.ToLowerCSafe()], string.Empty));

                            plcContent.Controls.Add(editableRegion);

                            textStart = editRegEnd + 2;
                        }
                    }
                    catch
                    {
                    }
                }
            }
            editRegStart = templateText.IndexOfCSafe("$$", textStart);
        }

        before      = new LiteralControl();
        before.Text = urlHelper.MakeLinksAbsolute(templateText.Substring(textStart), domainName);

        plcContent.Controls.Add(before);
    }