/// <summary>
    /// Gets and bulk updates subscribers. Called when the "Get and bulk update subscribers" button is pressed.
    /// Expects the CreateSubscriber method to be run first.
    /// </summary>
    private bool GetAndBulkUpdateSubscribers()
    {
        // Prepare the parameters
        string where = "SubscriberEmail LIKE N'[email protected]%'";

        // Get the data
        DataSet subscribers = SubscriberInfoProvider.GetSubscribers(where, null);

        if (!DataHelper.DataSourceIsEmpty(subscribers))
        {
            // Loop through the individual items
            foreach (DataRow subscriberDr in subscribers.Tables[0].Rows)
            {
                // Create object from DataRow
                SubscriberInfo modifySubscriber = new SubscriberInfo(subscriberDr);

                // Update the properties
                modifySubscriber.SubscriberFullName = modifySubscriber.SubscriberFullName.ToUpper();

                // Save the changes
                SubscriberInfoProvider.SetSubscriberInfo(modifySubscriber);
            }

            return(true);
        }

        return(false);
    }
    /// <summary>
    /// Creates and sends unsubscription e-mail.
    /// </summary>
    /// <param name="subscriber">Subscriber object</param>
    /// <param name="news">Newsletter object</param>
    /// <param name="subscription">Subscription object</param>
    /// <param name="siteName">Site name</param>
    protected void SendUnsubscriptionRequest(SubscriberInfo subscriber, NewsletterInfo news, SubscriberNewsletterInfo subscription, string siteName)
    {
        // Get global e-mail template with unsubscription request
        EmailTemplateInfo et = EmailTemplateProvider.GetEmailTemplate("newsletter.unsubscriptionrequest", siteName);

        if (et != null)
        {
            // Get subscriber member
            SortedDictionary <int, SubscriberInfo> subscribers = SubscriberInfoProvider.GetSubscribers(subscriber, 1, 0);
            foreach (KeyValuePair <int, SubscriberInfo> item in subscribers)
            {
                // Get 1st subscriber's member
                SubscriberInfo sb = item.Value;

                string body      = et.TemplateText;
                string plainBody = et.TemplatePlainText;

                // Resolve newsletter macros (first name, last name etc.)
                IssueHelper ih = new IssueHelper();
                if (ih.LoadDynamicFields(sb, news, subscription, null, false, siteName, null, null, null))
                {
                    body      = ih.ResolveDynamicFieldMacros(body);
                    plainBody = ih.ResolveDynamicFieldMacros(plainBody);
                }

                // Create e-mail
                EmailMessage msg = new EmailMessage();
                msg.EmailFormat   = EmailFormatEnum.Default;
                msg.From          = EmailHelper.GetSender(et, news.NewsletterSenderEmail);
                msg.Recipients    = sb.SubscriberEmail;
                msg.BccRecipients = et.TemplateBcc;
                msg.CcRecipients  = et.TemplateCc;
                msg.Subject       = ResHelper.LocalizeString(et.TemplateSubject);
                msg.Body          = URLHelper.MakeLinksAbsolute(body);
                msg.PlainTextBody = URLHelper.MakeLinksAbsolute(plainBody);

                // Add attachments and send e-mail
                MetaFileInfoProvider.ResolveMetaFileImages(msg, et.TemplateID, EmailObjectType.EMAILTEMPLATE, MetaFileInfoProvider.OBJECT_CATEGORY_TEMPLATE);

                EmailSender.SendEmail(siteName, msg);
            }
        }
        else
        {
            // Log missing template
            EventLogProvider ev = new EventLogProvider();
            ev.LogEvent(EventLogProvider.EVENT_TYPE_ERROR, DateTime.Now, "UnsubscriptionRequest", "Unsubscription request e-mail template is missing.");
        }
    }
    private void InitializeSubscribersForNewsletter(IssueInfo issue, NewsletterInfo newsletter)
    {
        var subscribers = SubscriberInfoProvider
                          .GetSubscribers()
                          .TopN(MAX_PREVIEW_SUBSCRIBERS)
                          .WhereIn("SubscriberID", new IDQuery(SubscriberNewsletterInfo.OBJECT_TYPE, "SubscriberID")
                                   .WhereEquals("NewsletterID", issue.IssueNewsletterID)
                                   .Where(w => w.WhereTrue("SubscriptionApproved")
                                          .Or()
                                          .WhereNull("SubscriptionApproved")));

        int subscriberIndex = 0;

        foreach (var subscriber in subscribers)
        {
            var member = SubscriberInfoProvider.GetSubscribers(subscriber, 1).FirstOrDefault();
            if (member == null)
            {
                continue;
            }

            var emailViewer = new EmailViewer(issue, newsletter, member, true);

            var identifier = GetSubscriberIdentifier(member, subscriber.SubscriberType);
            var subject    = GetEncodedSubscriberSubject(emailViewer);
            var preheader  = GetEncodedSubscriberPreheader(emailViewer);

            subjects.Add(subject);
            preheaders.Add(preheader);
            emails.Add(HttpUtility.UrlEncode(member.SubscriberEmail));

            drpSubscribers.Items.Add(new ListItem(identifier, subscriberIndex.ToString()));
            subscriberIndex++;
        }

        if (!SubscriberExists())
        {
            DisableSubscribersDropDownList();

            var emailViewer = new EmailViewer(issue, newsletter, null, true);

            InitializeZeroSubscribers(emailViewer.GetSubject(), emailViewer.GetPreheader());
        }
    }
    /// <summary>
    /// Builds where condition with subscriber IDs from main DB who meet base filter condition.
    /// </summary>
    /// <param name="baseCondition">Base condition</param>
    /// <param name="subscriberCondition">Condition for subscribers from main DB</param>
    /// <param name="useView">Indicates if subscriber view should be used</param>
    protected string BuildCondition(string baseCondition, string subscriberCondition, bool useView)
    {
        string result = string.Empty;

        // Get IDs of subscribers from current site who meet the original condition
        string  tempWhere = SqlHelper.AddWhereCondition("SubscriberSiteID=" + SiteContext.CurrentSiteID, subscriberCondition);
        DataSet ds        = null;

        if (useView)
        {
            ds = SubscriberInfoProvider.GetSubscribersFromView().Where(tempWhere).Column("SubscriberID");
        }
        else
        {
            ds = SubscriberInfoProvider.GetSubscribers().Where(tempWhere).Column("SubscriberID");
        }

        if (!DataHelper.DataSourceIsEmpty(ds))
        {
            List <string> subscriberIDs = DataHelper.GetStringValues(ds.Tables[0], "SubscriberID");

            string subscriberIDCond = string.Empty;
            int    maxItems         = 10000;
            int    maxToProcess     = 0;
            do
            {
                maxToProcess = (subscriberIDs.Count > maxItems) ? maxItems : subscriberIDs.Count;

                // Get condition in form 'SubscriberID IN (....)' with maximally 10.000 items
                subscriberIDCond = SqlHelper.AddWhereCondition(subscriberIDCond, SqlHelper.GetWhereCondition <string>("SubscriberID", subscriberIDs.GetRange(0, maxToProcess), false), "OR");

                subscriberIDs.RemoveRange(0, maxToProcess);
            }while (subscriberIDs.Count > 0);

            // Add the condition that only clasic subscribers should be filtered with the IDs condition
            result = SqlHelper.AddWhereCondition("SubscriberID>0", subscriberIDCond);
        }

        // Add original condition for contact group members
        return(SqlHelper.AddWhereCondition(result, string.Format("(SubscriberID=0 AND {0})", baseCondition), "OR"));
    }
示例#5
0
    /// <summary>
    /// Gets and bulk updates subscribers. Called when the "Get and bulk update subscribers" button is pressed.
    /// Expects the CreateSubscriber method to be run first.
    /// </summary>
    private bool GetAndBulkUpdateSubscribers()
    {
        // Get the data
        var subscribers = SubscriberInfoProvider.GetSubscribers().Where("SubscriberEmail", QueryOperator.Like, "[email protected]%");

        if (subscribers.Any())
        {
            // Loop through the individual items
            foreach (var subscriber in subscribers)
            {
                // Update the properties
                subscriber.SubscriberFullName = subscriber.SubscriberFullName.ToUpper();

                // Save the changes
                SubscriberInfoProvider.SetSubscriberInfo(subscriber);
            }

            return(true);
        }

        return(false);
    }
    private string GetPreviewScriptForNewsletter(IssueInfo issue, NewsletterInfo newsletter, IssueHelper issueHelper)
    {
        string script;
        string siteName = SiteContext.CurrentSiteName;

        // Get specific number of subscribers subscribed to the newsletter
        DataSet subscribers = SubscriberInfoProvider
                              .GetSubscribers()
                              .TopN(MAX_PREVIEW_SUBSCRIBERS)
                              .WhereIn("SubscriberID", new IDQuery(SubscriberNewsletterInfo.OBJECT_TYPE, "SubscriberID")
                                       .WhereEquals("NewsletterID", issue.IssueNewsletterID)
                                       .Where(w => w.WhereTrue("SubscriptionApproved")
                                              .Or()
                                              .WhereNull("SubscriptionApproved")));

        if (!DataHelper.DataSourceIsEmpty(subscribers))
        {
            // Limit max subscribers count to number of rows
            int maxCount = subscribers.Tables[0].Rows.Count;

            // Generate javascript based on subscribers
            script = InitializePreviewScript(issue, maxCount);

            for (int i = 0; i < maxCount; i++)
            {
                // Get subscriber
                SubscriberInfo subscriber = new SubscriberInfo(subscribers.Tables[0].Rows[i]);
                // Insert subscriber GUID
                script = string.Format("{0} guid[{1}] = '{2}'; \n ", script, i, subscriber.SubscriberGUID);

                // Get subscriber's member
                SortedDictionary <int, SubscriberInfo> subMembers = SubscriberInfoProvider.GetSubscribers(subscriber, 1);
                if ((subMembers != null) && (subMembers.Count > 0))
                {
                    foreach (KeyValuePair <int, SubscriberInfo> item in subMembers)
                    {
                        // Get 1st subscriber's member
                        SubscriberInfo sbMember = item.Value;
                        if (sbMember != null)
                        {
                            // Create information line
                            string infoLine = ScriptHelper.GetString(sbMember.SubscriberEmail, false);

                            // Add info about subscriber type
                            if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true))
                            {
                                infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contactgroup").ToLowerCSafe());
                            }
                            else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACT, true))
                            {
                                infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contact").ToLowerCSafe());
                            }

                            script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, HTMLHelper.HTMLEncode(infoLine));

                            // Create resolved subject
                            script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(GetPreviewSubject(issue, newsletter, issueHelper, sbMember, siteName))));
                        }
                    }
                }
                else
                {
                    // Get generic name for external subscribers
                    var related = BaseAbstractInfoProvider.GetInfoById(subscriber.SubscriberType, subscriber.SubscriberRelatedID);
                    script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, HTMLHelper.HTMLEncode(TypeHelper.GetNiceObjectTypeName(subscriber.SubscriberType) + " \"" + HTMLHelper.HTMLEncode(related.Generalized.ObjectDisplayName) + "\""));

                    // Create resolved subject
                    return(string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(GetPreviewSubject(issue, newsletter, issueHelper, null, siteName)))));
                }
            }
        }
        else
        {
            return(InitializePreviewScriptForZeroSubscribers(issue, GetPreviewSubject(issue, newsletter, issueHelper, null, siteName)));
        }
        return(script);
    }
示例#7
0
    protected void Page_Load(object sender, EventArgs e)
    {
        // Get Issue object
        IssueInfo issue = (IssueInfo)UIContext.EditedObject;

        if ((issue == null) || (issue.IssueSiteID != SiteContext.CurrentSiteID))
        {
            return;
        }

        // Get newsletter object
        NewsletterInfo news = NewsletterInfoProvider.GetNewsletterInfo(issue.IssueNewsletterID);

        string      subject  = null;
        IssueHelper ih       = new IssueHelper();
        string      siteName = SiteContext.CurrentSiteName;

        // Get specific number of subscribers subscribed to the newsletter
        DataSet subscribers = SubscriberInfoProvider
                              .GetSubscribers()
                              .TopN(MAX_PREVIEW_SUBSCRIBERS)
                              .WhereIn("SubscriberID", new IDQuery(SubscriberNewsletterInfo.OBJECT_TYPE, "SubscriberID")
                                       .WhereEquals("NewsletterID", issue.IssueNewsletterID)
                                       .Where(w => w.WhereTrue("SubscriptionApproved")
                                              .Or()
                                              .WhereNull("SubscriptionApproved"))
                                       .Where(w => w.WhereTrue("SubscriptionEnabled")
                                              .Or()
                                              .WhereNull("SubscriptionEnabled"))
                                       );

        string script;

        if (!DataHelper.DataSourceIsEmpty(subscribers))
        {
            // Limit max subscribers count to number of rows
            int maxCount = subscribers.Tables[0].Rows.Count;

            // Generate javascript based on subscribers
            script = string.Format(
                @"var currentSubscriberIndex = 0;
var newsletterIssueId ={0};
var guid = new Array({1});
var email = new Array({1});
var subject = new Array({1});
var subscribers = new Array(guid, email);", issue.IssueID, maxCount);

            for (int i = 0; i < maxCount; i++)
            {
                // Get subscriber
                SubscriberInfo subscriber = new SubscriberInfo(subscribers.Tables[0].Rows[i]);
                // Insert subscriber GUID
                script = string.Format("{0} guid[{1}] = '{2}'; \n ", script, i, subscriber.SubscriberGUID);

                // Get subscriber's member (different for user, role or contact group subscribers)
                SortedDictionary <int, SubscriberInfo> subMembers = SubscriberInfoProvider.GetSubscribers(subscriber, 1, 0, issue.IssueNewsletterID);
                if ((subMembers != null) && (subMembers.Count > 0))
                {
                    foreach (KeyValuePair <int, SubscriberInfo> item in subMembers)
                    {
                        // Get 1st subscriber's member
                        SubscriberInfo sbMember = item.Value;
                        if (sbMember != null)
                        {
                            // Create information line
                            string infoLine = ScriptHelper.GetString(sbMember.SubscriberEmail, false);

                            // Add info about subscriber type
                            if (sbMember.SubscriberType.EqualsCSafe(UserInfo.OBJECT_TYPE, true))
                            {
                                infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.cms_user").ToLowerCSafe());
                            }
                            else if (sbMember.SubscriberType.EqualsCSafe(RoleInfo.OBJECT_TYPE, true))
                            {
                                infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.cms_role").ToLowerCSafe());
                            }
                            else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true))
                            {
                                infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contactgroup").ToLowerCSafe());
                            }
                            else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.PERSONA, true))
                            {
                                infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.personas_persona").ToLowerCSafe());
                            }
                            else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACT, true))
                            {
                                infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contact").ToLowerCSafe());
                            }

                            script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, HTMLHelper.HTMLEncode(infoLine));

                            // Resolve dynamic field macros ({%FirstName%}, {%LastName%}, {%Email%})
                            if (ih.LoadDynamicFields(sbMember, news, null, issue, true, siteName, null, null, null))
                            {
                                subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject, news, issue);
                            }

                            // Create resolved subject
                            script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(subject)));
                        }
                    }
                }
                else
                {
                    // Get generic name for external subscribers
                    var related = BaseAbstractInfoProvider.GetInfoById(subscriber.SubscriberType, subscriber.SubscriberRelatedID);
                    script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, HTMLHelper.HTMLEncode(TypeHelper.GetNiceObjectTypeName(subscriber.SubscriberType) + " \"" + HTMLHelper.HTMLEncode(related.Generalized.ObjectDisplayName) + "\""));

                    // Resolve dynamic field macros (newsletter and issue)
                    if (ih.LoadDynamicFields(null, news, null, issue, true, siteName, null, null, null))
                    {
                        subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject, news, issue);
                    }

                    // Create resolved subject
                    script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(subject)));
                }
            }
        }
        else
        {
            // Resolve dynamic field macros ({%FirstName%}, {%LastName%}, {%Email%}) in subject
            if (ih.LoadDynamicFields(null, news, null, issue, true, siteName, null, null, null))
            {
                subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject, news, issue);
            }

            // Generate void javascript
            script = string.Format(
                @"var currentSubscriberIndex = 0;
var newsletterIssueId ={0};
var guid = new Array(1);
var email = new Array(1);
var subject = new Array(1);
subject[0] = '{1}';
var subscribers = new Array(guid, email);
guid[0] = 0;
email[0] = '(N/A)';", issue.IssueID, HTMLHelper.HTMLEncode(subject));
        }
        ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "PreviewData", ScriptHelper.GetScript(script));

        if (!RequestHelper.IsPostBack())
        {
            ScriptHelper.RegisterStartupScript(this, typeof(string), "LoadPreview" + ClientID, ScriptHelper.GetScript("pageLoad();"));
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        Guid subscriberGuid    = QueryHelper.GetGuid("subscriberguid", Guid.Empty);
        int  newsletterIssueId = QueryHelper.GetInteger("issueid", 0);

        // Get newsletter issue
        IssueInfo issue = IssueInfoProvider.GetIssueInfo(newsletterIssueId);

        if (issue == null)
        {
            return;
        }

        // Get subscriber
        SubscriberInfo subscriber = SubscriberInfoProvider.GetSubscriberInfo(subscriberGuid, CMSContext.CurrentSiteID);

        // Get the newsletter
        NewsletterInfo news = NewsletterInfoProvider.GetNewsletterInfo(issue.IssueNewsletterID);

        if (news == null)
        {
            return;
        }

        // Get site default culture
        string culture = CultureHelper.GetDefaultCulture(CMSContext.CurrentSiteName);

        // Ensure preview in default site culture
        // Keep old culture
        CultureInfo oldUICulture = Thread.CurrentThread.CurrentUICulture;

        // Set current culture
        Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

        string htmlPage = String.Empty;

        try
        {
            if (subscriber != null)
            {
                // Get subscriber's member (different for user or role subscribers)
                SortedDictionary <int, SubscriberInfo> subscribers = SubscriberInfoProvider.GetSubscribers(subscriber, 1, 0, news.NewsletterID);
                foreach (KeyValuePair <int, SubscriberInfo> item in subscribers)
                {
                    // Get 1st subscriber's member
                    SubscriberInfo sb = item.Value;

                    htmlPage = IssueInfoProvider.GetEmailBody(issue, news, null, sb, true, CMSContext.CurrentSiteName, null, null, null);
                }
            }

            if (string.IsNullOrEmpty(htmlPage))
            {
                htmlPage = IssueInfoProvider.GetEmailBody(issue, news, null, null, true, CMSContext.CurrentSiteName, null, null, null);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            // Set back to old culture
            Thread.CurrentThread.CurrentUICulture = oldUICulture;
        }

        Response.Clear();
        Response.Write(htmlPage);

        RequestHelper.EndResponse();
    }
示例#9
0
    protected void Page_Load(object sender, EventArgs e)
    {
        // Get Issue object
        IssueInfo issue = (IssueInfo)CMSContext.EditedObject;

        if ((issue == null) || (issue.IssueSiteID != CMSContext.CurrentSiteID))
        {
            return;
        }

        // Get newsletter object
        NewsletterInfo news = NewsletterInfoProvider.GetNewsletterInfo(issue.IssueNewsletterID);

        string      subject  = null;
        IssueHelper ih       = new IssueHelper();
        string      siteName = CMSContext.CurrentSiteName;

        InitGUI();

        // Get specific number of subscribers subscribed to the newsletter
        string where = "SubscriberID IN (SELECT SubscriberID FROM Newsletter_SubscriberNewsletter WHERE NewsletterID=" + issue.IssueNewsletterID + " AND (SubscriptionApproved=1 OR SubscriptionApproved IS NULL) AND (SubscriptionEnabled=1 OR SubscriptionEnabled IS NULL))";
        DataSet subscribers = SubscriberInfoProvider.GetSubscribers(where, null, MAX_PREVIEW_SUBSCRIBERS, null);

        string script;

        if (!DataHelper.DataSourceIsEmpty(subscribers))
        {
            // Limit max subscribers count to number of rows
            int maxCount = subscribers.Tables[0].Rows.Count;

            // Generate javascript based on subscribers
            script = string.Format(
                @"var currentSubscriberIndex = 0;
var newsletterIssueId ={0};
var guid = new Array({1});
var email = new Array({1});
var subject = new Array({1});
var subscribers = new Array(guid, email);", issue.IssueID, maxCount);

            SubscriberInfo subscriber = null;
            SubscriberInfo sbMember   = null;
            SortedDictionary <int, SubscriberInfo> subMembers = null;
            string infoLine = null;

            for (int i = 0; i < maxCount; i++)
            {
                // Get subscriber
                subscriber = new SubscriberInfo(subscribers.Tables[0].Rows[i]);
                if (subscriber != null)
                {
                    // Insert subscriber GUID
                    script = string.Format("{0} guid[{1}] = '{2}'; \n ", script, i, subscriber.SubscriberGUID);

                    // Get subscriber's member (different for user, role or contact group subscribers)
                    subMembers = SubscriberInfoProvider.GetSubscribers(subscriber, 1, 0, issue.IssueNewsletterID);
                    if ((subMembers != null) && (subMembers.Count > 0))
                    {
                        foreach (KeyValuePair <int, SubscriberInfo> item in subMembers)
                        {
                            // Get 1st subscriber's member
                            sbMember = item.Value;
                            if (sbMember != null)
                            {
                                // Create information line
                                infoLine = ScriptHelper.GetString(sbMember.SubscriberEmail, false);

                                // Add info about subscriber type
                                if (sbMember.SubscriberType.EqualsCSafe(SiteObjectType.USER, true))
                                {
                                    infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.cms_user").ToLowerCSafe());
                                }
                                else if (sbMember.SubscriberType.EqualsCSafe(SiteObjectType.ROLE, true))
                                {
                                    infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.cms_role").ToLowerCSafe());
                                }
                                else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACTGROUP, true))
                                {
                                    infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contactgroup").ToLowerCSafe());
                                }
                                else if (sbMember.SubscriberType.EqualsCSafe(PredefinedObjectType.CONTACT, true))
                                {
                                    infoLine = string.Format("{0} ({1})", infoLine, GetString("objecttype.om_contact").ToLowerCSafe());
                                }

                                script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, infoLine);

                                // Resolve dynamic field macros ({%FirstName%}, {%LastName%}, {%Email%})
                                if (ih.LoadDynamicFields(sbMember, news, null, issue, true, siteName, null, null, null))
                                {
                                    subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject);
                                }

                                // Create resolved subject
                                script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(subject)));
                            }
                        }
                    }
                    else
                    {
                        script = string.Format("{0}email[{1}] = '{2}'; \n ", script, i, "(N/A)");

                        // Resolve dynamic field macros (newsletter and issue)
                        if (ih.LoadDynamicFields(null, news, null, issue, true, siteName, null, null, null))
                        {
                            subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject);
                        }

                        // Create resolved subject
                        script = string.Format("{0}subject[{1}] = {2}; \n ", script, i, ScriptHelper.GetString(HTMLHelper.HTMLEncode(subject)));
                    }
                }
            }
        }
        else
        {
            // Resolve dynamic field macros ({%FirstName%}, {%LastName%}, {%Email%}) in subject
            if (ih.LoadDynamicFields(null, news, null, issue, true, siteName, null, null, null))
            {
                subject = ih.ResolveDynamicFieldMacros(issue.IssueSubject);
            }

            // Generate void javascript
            script = string.Format(
                @"var currentSubscriberIndex = 0;
var newsletterIssueId ={0};
var guid = new Array(1);
var email = new Array(1);
var subject = new Array(1);
subject[0] = '{1}';
var subscribers = new Array(guid, email);
guid[0] = 0;
email[0] = '(N/A)';", issue.IssueID, subject);
        }
        ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "PreviewData", ScriptHelper.GetScript(script));

        if (!RequestHelper.IsPostBack())
        {
            ScriptHelper.RegisterStartupScript(this, typeof(string), "LoadPreview" + ClientID, ScriptHelper.GetScript("pageLoad();"));
        }
    }