void AddWithCustomFields()
        {
            Subscriber subscriber = new Subscriber(listID);

            try
            {
                List<SubscriberCustomField> customFields = new List<SubscriberCustomField>();
                customFields.Add(new SubscriberCustomField() { Key = "CustomFieldKey", Value = "Value" });
                customFields.Add(new SubscriberCustomField() { Key = "CustomFieldKey2", Value = "Value2" });

                string newSubscriberID = subscriber.Add("*****@*****.**", "Test Name", customFields, false);
                Console.WriteLine(newSubscriberID);
            }
            catch (CreatesendException ex)
            {
                ErrorResult error = (ErrorResult)ex.Data["ErrorResult"];
                Console.WriteLine(error.Code);
                Console.WriteLine(error.Message);
            }
            catch (Exception ex)
            {
                // Handle some other failure
                Console.WriteLine(ex.ToString());
            }
        }
        void BatchAdd()
        {
            Subscriber subscriber = new Subscriber(listID);

            List<SubscriberDetail> newSubscribers = new List<SubscriberDetail>();

            SubscriberDetail subscriber1 = new SubscriberDetail("*****@*****.**", "Test Person 1", new List<SubscriberCustomField>());
            subscriber1.CustomFields.Add(new SubscriberCustomField() { Key = "CustomFieldKey", Value = "Value" });
            subscriber1.CustomFields.Add(new SubscriberCustomField() { Key = "CustomFieldKey2", Value = "Value2" });

            newSubscribers.Add(subscriber1);

            SubscriberDetail subscriber2 = new SubscriberDetail("*****@*****.**", "Test Person 2", new List<SubscriberCustomField>());
            subscriber2.CustomFields.Add(new SubscriberCustomField() { Key = "CustomFieldKey", Value = "Value3" });
            subscriber2.CustomFields.Add(new SubscriberCustomField() { Key = "CustomFieldKey2", Value = "Value4" });

            newSubscribers.Add(subscriber2);

            try
            {
                BulkImportResults results = subscriber.Import(newSubscribers, true);
                Console.WriteLine(results.TotalNewSubscribers + " subscribers added");
                Console.WriteLine(results.TotalExistingSubscribers + " total subscribers in list");
            }
            catch (CreatesendException ex)
            {
                ErrorResult<BulkImportResults> error = (ErrorResult<BulkImportResults>)ex.Data["ErrorResult"];

                Console.WriteLine(error.Code);
                Console.WriteLine(error.Message);

                if (error.ResultData != null)
                {
                    //handle the returned data
                    BulkImportResults results = error.ResultData;

                    //success details are here as normal
                    Console.WriteLine(results.TotalNewSubscribers + " subscribers were still added");

                    //but we also have additional failure detail
                    foreach (ImportResult result in results.FailureDetails)
                    {
                        Console.WriteLine("Failed Address");
                        Console.WriteLine(result.Message + " - " + result.EmailAddress);
                    }
                }
            }
            catch (Exception ex)
            {
                // Handle some other failure
                Console.WriteLine(ex.ToString());
            }
        }
        public BulkImportResults Import(List<SubscriberDetail> subscribers, bool resubscribe)
        {
            List<object> reworkedSusbcribers = new List<object>();
            string json = "";
            foreach (SubscriberDetail subscriber in subscribers)
            {
                Dictionary<string, object> subscriberWithoutDate = new Dictionary<string, object>() { { "EmailAddress", subscriber.EmailAddress }, { "Name", subscriber.Name }, { "CustomFields", subscriber.CustomFields } };
                reworkedSusbcribers.Add(subscriberWithoutDate);
            }

            try
            {
                json = HttpHelper.Post(string.Format("/subscribers/{0}/import.json", ListID), null, JavaScriptConvert.SerializeObject(
                    new Dictionary<string, object>() { { "Subscribers", reworkedSusbcribers }, { "Resubscribe", resubscribe } }
                    ));
            }
            catch (CreatesendException ex)
            {
                if (!ex.Data.Contains("ErrorResult") && ex.Data.Contains("ErrorResponse"))
                {
                    ErrorResult<BulkImportResults> result = JavaScriptConvert.DeserializeObject<ErrorResult<BulkImportResults>>(ex.Data["ErrorResponse"].ToString());
                    ex.Data.Add("ErrorResult", result);
                }
                else if(ex.Data.Contains("ErrorResult"))
                {
                    ErrorResult<BulkImportResults> result = new ErrorResult<BulkImportResults>((ErrorResult)ex.Data["ErrorResult"]);
                    ex.Data["ErrorResult"] = result;
                }
                throw ex;
            }
            return JavaScriptConvert.DeserializeObject<BulkImportResults>(json);
        }
        public static List<Subscriber> MapList(List<SubscriberDetail> subscribers)
        {
            var coreSubscriber = new List<Subscriber>();
            foreach (var subscriber in subscribers)
            {
                coreSubscriber.Add(Map(subscriber));
            }

            return coreSubscriber;
        }
        private static string[] GetPairs(NameValueCollection nvc)
        {
            List<string> keyValuePair = new List<string>();

            foreach (string key in nvc.AllKeys)
            {
                string encodedKey = HttpUtility.UrlEncode(key) + "=";

                foreach (string value in nvc.GetValues(key))
                    keyValuePair.Add(encodedKey + HttpUtility.UrlEncode(value));
            }

            return keyValuePair.ToArray();
        }
        public BulkImportResults Import(List<SubscriberDetail> subscribers, bool resubscribe)
        {
            List<object> reworkedSusbcribers = new List<object>();
            foreach (SubscriberDetail subscriber in subscribers)
            {
                Dictionary<string, object> subscriberWithoutDate = new Dictionary<string, object>()
                {
                    { "EmailAddress", subscriber.EmailAddress },
                    { "Name", subscriber.Name },
                    { "CustomFields", subscriber.CustomFields }
                };
                reworkedSusbcribers.Add(subscriberWithoutDate);
            }

            return HttpHelper.Post<Dictionary<string, object>, BulkImportResults, ErrorResult<BulkImportResults>>(
                string.Format("/subscribers/{0}/import.json", ListID), null,
                new Dictionary<string, object>()
                {
                    { "Subscribers", reworkedSusbcribers },
                    { "Resubscribe", resubscribe }
                });
        }
        /// <summary>
        /// Updates the subscriber with current email address of "*****@*****.**" to have the new email
        /// "*****@*****.**", while leaving the name unchanged.
        /// </summary>
        void UpdateWithNewEmailAndUnchangedNameDontResubscribe()
        {
            Subscriber subscriber = new Subscriber(listID);

            try
            {
                List<SubscriberCustomField> customFields = new List<SubscriberCustomField>();
                customFields.Add(new SubscriberCustomField() { Key = "CustomFieldKey", Value = "Value" });
                customFields.Add(new SubscriberCustomField() { Key = "CustomFieldKey2", Value = "Value2" });

                subscriber.Update("*****@*****.**", "*****@*****.**", null, customFields, false);
                Console.WriteLine("Subscriber Updated successfully with new email: [email protected]. Name was unchanged");
            }
            catch (CreatesendException ex)
            {
                ErrorResult error = (ErrorResult)ex.Data["ErrorResult"];
                Console.WriteLine(error.Code);
                Console.WriteLine(error.Message);
            }
            catch (Exception ex)
            {
                //handle some other failure
            }
        }
        public ActionResult AuthorizeNetSimGift(FormCollection post)
        {
            _logger.Info("keys: {0}", string.Join(", ", post.AllKeys));
            var orderId = Convert.ToInt32(post["GiftOrderId"]);
            var userId = Convert.ToInt32(post["UserId"]);
            var order = _giftCardOrderService.FindOrder(orderId, userId);

            _logger.Info("Authorizing SIM...");

            //the URL to redirect to- this MUST be absolute
            var successUrl = Url.RouteUrl("giftconfirmation", new { orderId = order.Id }, SecureProtocol);
            var failureUrl = Url.RouteUrl("billing-giftdetails", new { orderId = order.Id }, SecureProtocol);
            var redirectUrl = successUrl;

            var response = new SIMResponse(post);

            _logger.Info("Approved: {0}", response.Approved);
            _logger.Info("Code: {0}", response.ResponseCode);
            _logger.Info("Message: {0}", response.Message);
            _logger.Info("Authorization Code: {0}", response.AuthorizationCode);
            _logger.Info("Card Number: {0}", response.CardNumber);
            _logger.Info("Card Type: {0}", response.CardType);
            _logger.Info("Invoice Number: {0}", response.InvoiceNumber);
            _logger.Info("MD5 Hash: {0}", response.MD5Hash);
            _logger.Info("Transaction ID: {0}", response.TransactionID);

            //first order of business - validate that it was Authorize.Net that posted this using the
            //MD5 hash that was passed back to us
            var isValid = response.Validate(AuthorizeNetConfig.Md5HashValue, AuthorizeNetConfig.ApiLogin);

            _logger.Info("Valid: {0}", isValid);
            if (isValid && response.Approved)
            {
                _giftorderConfirmationMailer.SendGiftOrderConfirmationEmail(order);
                _giftCardOrderService.CompleteOrder(order, response.TransactionID);

                //Campaign Monitor -Adding subscriber to Gift card recipients List

                AuthenticationDetails auth = new ApiKeyAuthenticationDetails(ConfigurationManager.AppSettings["CampaignMonitorAPI_key"]);
                Subscriber objSubscriber = new Subscriber(auth, ConfigurationManager.AppSettings["CampaignMonitorListID"]);

                for (int i = 0; i < order.GiftOrderDetail.Count; i++)
                {
                    List<SubscriberCustomField> customFields = new List<SubscriberCustomField>();
                    customFields.Add(new SubscriberCustomField() { Key = "Amount", Value = order.GiftOrderDetail[i].Amount.ToString() });
                    customFields.Add(new SubscriberCustomField() { Key = "Your Name", Value = order.GiftOrderDetail[i].YourName.ToString() });
                    customFields.Add(new SubscriberCustomField() { Key = "Gift Code", Value = order.GiftOrderDetail[i].RecipientGiftCode.ToString() });
                    customFields.Add(new SubscriberCustomField() { Key = "Message", Value = order.GiftOrderDetail[i].Message.ToString() });

                    string newSubscriberID = objSubscriber.Add(order.GiftOrderDetail[i].RecipientEmail.ToString(), null, customFields, false);
                }

            }
            else
            {
                _giftCardOrderService.FailOrder(order, response.Message);
                redirectUrl = failureUrl;
            }

            return Content(AuthorizeNet.Helpers.CheckoutFormBuilders.Redirecter(redirectUrl));
        }
        public ActionResult Billing(Britespokes.Services.GiftCards.BillingDetails billingDetails)
        {
            //decimal GiftAmount = 0;
            //int OrderDetailId = 0;

            var order = _giftCardOrderService.FindOrder(billingDetails.GiftOrderId, UserContext.UserId);
            if (!billingDetails.AcceptedTermsAndConditions)
                ModelState.AddModelError("AcceptedTermsAndConditions", "you must accept the terms and conditions to purchase a tour");
            if (order.OrderStatus != _giftCardOrderService.StatusPending())
                ModelState.AddModelError("", "This order is no longer pending");
            if (UserContext.IsGuest && string.IsNullOrEmpty(billingDetails.Password))
                ModelState.AddModelError("Password", "required");

            if (string.CompareOrdinal(billingDetails.Password, billingDetails.ConfirmPassword) != 0)
                ModelState.AddModelError("ConfirmPassword", "doesn't match");

            if (ModelState.IsValid)
            {
                if (UserContext.IsGuest)
                {
                    var user = _userService.Find(UserContext.UserId);
                    _registrationService.PromoteGuest(user, billingDetails.Email, billingDetails.Password);
                    _userMailer.SendWelcomeEmail(UserContext.Organization, user);
                }
                _giftCardOrderService.UpdateBillingDetails(billingDetails);

                //Campaign Monitor -Adding subscriber to Gift card recipients List

                AuthenticationDetails auth = new ApiKeyAuthenticationDetails(ConfigurationManager.AppSettings["CampaignMonitorAPI_key"]);
                Subscriber objSubscriber = new Subscriber(auth, ConfigurationManager.AppSettings["CampaignMonitorListID"]);

                for (int i = 0; i < order.GiftOrderDetail.Count; i++)
                {
                    List<SubscriberCustomField> customFields = new List<SubscriberCustomField>();
                    customFields.Add(new SubscriberCustomField() { Key = "Amount", Value = order.GiftOrderDetail[i].Amount ==null? "":order.GiftOrderDetail[i].Amount.ToString() });
                    customFields.Add(new SubscriberCustomField() { Key = "Your Name", Value = order.GiftOrderDetail[i].YourName == null ? "" : order.GiftOrderDetail[i].YourName.ToString() });
                    customFields.Add(new SubscriberCustomField() { Key = "Gift Code", Value = order.GiftOrderDetail[i].RecipientGiftCode == null ? "" : order.GiftOrderDetail[i].RecipientGiftCode.ToString() });
                    customFields.Add(new SubscriberCustomField() { Key = "Message", Value = order.GiftOrderDetail[i].Message == null ? "" : order.GiftOrderDetail[i].Message.ToString() });

                    string newSubscriberID = objSubscriber.Add(order.GiftOrderDetail[i].RecipientEmail.ToString(), null, customFields, false);
                }

                return Json(new { BillingDetails = billingDetails, Errors = new object[0] });
            }

            billingDetails.BillingOverview = _giftCardOrderService.BuildBillingOverview(order);
            billingDetails.PaymentRequest = new PaymentRequest(order.Total, AuthorizeNetConfig.ApiLogin, AuthorizeNetConfig.TransactionKey, AuthorizeNetConfig.TestMode);
            return Json(new { BillingDetails = billingDetails, Errors = ModelStateErrorsForJson() });
        }
        void CreateFromTemplate()
        {
            try
            {
                List<string> listIDs = new List<string>();
                listIDs.Add("List ID One");
                List<string> segmentIDs = new List<string>();
                segmentIDs.Add("Segment ID One");

                // Prepare the template content
                TemplateContent templateContent = new TemplateContent();

                List<EditableField> singlelines = new List<EditableField>();
                EditableField singleline = new EditableField();
                singleline.Content = "This is a heading";
                singleline.Href = "http://example.com/";
                singlelines.Add(singleline);
                templateContent.Singlelines = singlelines;

                List<EditableField> multilines = new List<EditableField>();
                EditableField multiline = new EditableField();
                multiline.Content = "<p>This is example</p><p>multiline <a href=\"http://example.com\">content</a>...</p>";
                multilines.Add(multiline);
                templateContent.Multilines = multilines;

                List<EditableField> images = new List<EditableField>();
                EditableField image = new EditableField();
                image.Content = "http://example.com/image.png";
                image.Alt = "This is alt text for an image";
                image.Href = "http://example.com/";
                images.Add(image);
                templateContent.Images = images;

                List<Repeater> repeaters = new List<Repeater>();
                Repeater repeater = new Repeater();
                List<RepeaterItem> items = new List<RepeaterItem>();
                RepeaterItem item = new RepeaterItem();
                item.Layout = "My layout";

                // Just using the same data for Singlelines, Multilines,
                // and Images as above in this example.
                item.Singlelines = singlelines;
                item.Multilines = multilines;
                item.Images = images;

                repeater.Items = items;
                repeaters.Add(repeater);
                templateContent.Repeaters = repeaters;

                // templateContent as defined above would be used to fill the content of
                // a template with markup similar to the following:
                // <html>
                // <head><title>My Template</title></head>
                // <body>
                //     <p><singleline>Enter heading...</singleline></p>
                //     <div><multiline>Enter description...</multiline></div>
                //     <img id="header-image" editable="true" width="500" />
                //     <repeater>
                //     <layout label="My layout">
                //         <div class="repeater-item">
                //         <p><singleline></singleline></p>
                //         <div><multiline></multiline></div>
                //         <img editable="true" width="500" />
                //         </div>
                //     </layout>
                //     </repeater>
                //     <p><unsubscribe>Unsubscribe</unsubscribe></p>
                // </body>
                // </html>

                string campaignID = Campaign.CreateFromTemplate(
                    auth,
                    "Your Client ID",
                    "Campaign Subject",
                    "Campaign Name",
                    "From Name",
                    "*****@*****.**",
                    "*****@*****.**",
                    listIDs,
                    segmentIDs,
                    "Template ID",
                    templateContent);

                Console.WriteLine("Campaign ID: " + campaignID);
            }
            catch (CreatesendException ex)
            {
                ErrorResult error = (ErrorResult)ex.Data["ErrorResult"];
                Console.WriteLine(error.Code);
                Console.WriteLine(error.Message);
            }
            catch (Exception ex)
            {
                // Handle some other failure
                Console.WriteLine(ex.ToString());
            }
        }