// Campaign
        public AuditTrail(DateTime dateTime, string userName, Campaign campaign, int id, string comment)
        {
            this.AuditTrailTimeStamp = dateTime;
            this.AuditTrailUserName = userName;
            this.AuditTrailComment = comment;

            if(id > 0)
            {
                this.CampaignID = id;
            }
            else
            {
                this.Campaign = campaign;
            }
        }
        //
        // GET: /Campaign/Create
        public ActionResult Create(string returnUrl, int CompanyID = 0)
        {
            ViewBag.ReturnUrl = returnUrl;
            // Create New Campaign to get Constructor Values and set Created By
            Campaign campaign = new Campaign();
            campaign.OnCreate(User.Identity.Name);
            ViewBag.CompanyID = new SelectList(db.Companies.Where(c => c.CompanyStatus != archived), "CompanyID", "CompanyName");

            return View(campaign);
        }
        public ActionResult Create(Campaign campaign, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                // Add Audit Entry
                AuditTrail audit = new AuditTrail(DateTime.Now, User.Identity.Name, campaign, campaign.CampaignID, "Create");
                db.AuditTrails.Add(audit);

                db.Campaigns.Add(campaign);
                db.SaveChanges();

                return RedirectToAction("Edit", new { id = campaign.CampaignID, ReturnUrl = returnUrl });
            }

            ViewBag.CompanyID = new SelectList(db.Companies.Where(c => c.CompanyStatus != archived), "CompanyID", "CompanyName", campaign.CompanyID);
            return View(campaign);
        }
        public ActionResult Edit(Campaign campaign, string returnUrl)
        {
            string preSaveStatus = db.Campaigns.Where(c => c.CampaignID == campaign.CampaignID).Select(c => c.CampaignStatus).FirstOrDefault();

            if (ModelState.IsValid)
            {
                // Add Audit Entry
                AuditTrail audit = new AuditTrail(DateTime.Now, User.Identity.Name, campaign, campaign.CampaignID, "Edit");
                db.AuditTrails.Add(audit);

                // Send Emails
                #region SendEmails
                // Check if the status is changed
                if (preSaveStatus != campaign.CampaignStatus)
                {
                    List<EmailTo> sendEmailTos = MyExtensions.GetEmailTo(campaign.CampaignStatus);
                    var urlBuilder = Request.Url.AbsoluteUri;

                    if (sendEmailTos != null && sendEmailTos.Count > 0)
                    {
                        UserMailer.SendStatusUpdate(sendEmailTos, "Company Updated by: " + MyExtensions.DisplayPrintFriendlyName(User.Identity.Name), urlBuilder.ToString(), db.Companies.Where(c => c.CompanyID == campaign.CompanyID).FirstOrDefault(), campaign, null).Send();
                    }
                }
                #endregion

                // Save entry into DB
                var current = db.Campaigns.Find(campaign.CampaignID);
                db.Entry(current).CurrentValues.SetValues(campaign);
                db.SaveChanges();

                if (returnUrl == null)
                {
                    return RedirectToAction("Index");
                }

                return Redirect(returnUrl);
            }

            ViewBag.CompanyID = new SelectList(db.Companies.Where(c => c.CompanyStatus != archived), "CompanyID", "CompanyName", campaign.CompanyID);
            return View(campaign);
        }
        public virtual MvcMailMessage SendStatusUpdate(List<EmailTo> emailTos, string title, string link, Company company = null, Campaign campaign = null, Product product = null)
        {
            string subject = "";// Check if we have an object
            if(product != null)
            {
                subject = company.CompanyName + ": Product Status Update " + DateTime.Now.ToString("f") + " : " + product.ProductName;
                ViewBag.Type = "Product";
                ViewBag.Name = product.ProductName;
                ViewBag.Status = product.ProductStatus;
                ViewBag.Link = link;

                ViewBag.CampaignData = "Campaign Name: " + campaign.CampaignName;
                ViewBag.CompanyData = "Company Name: " + company.CompanyName;
            }
            else if(campaign != null)
            {
                subject = company.CompanyName + ": Campaign Status Update - " + campaign.CampaignName;
                ViewBag.Type = "Campaign";
                ViewBag.Name = campaign.CampaignName;
                ViewBag.Status = campaign.CampaignStatus;
                ViewBag.Link = link;

                ViewBag.CompanyData = "Company Name: " + company.CompanyName;
            }
            else if(company != null)
            {
                subject = company.CompanyName + ": Company Status Update";
                ViewBag.Type = "Company";
                ViewBag.Name = company.CompanyName;
                ViewBag.Status = company.CompanyStatus;
                ViewBag.Link = link;
            }
            else
            {
                throw new System.ArgumentException("All Objects are Null", "UserMailer.cs");
            }

            return Populate(x =>
            {
                x.Subject = subject;
                x.ViewName = "SendStatusUpdate";
                foreach(EmailTo emailTo in emailTos)
                {
                    switch(emailTo)
                    {
                        case EmailTo.Account_Manager:
                            x.To.Add(company.CompanyAccountManagerEmail);
                            break;
                        case EmailTo.Inventory_Buyers:
                            x.To.Add("*****@*****.**");
                            break;
                        case EmailTo.Merchandisers:
                            x.To.Add("*****@*****.**");
                            break;
                        case EmailTo.Mentor:
                            x.To.Add(company.CompanyMentorEmail);
                            break;
                        default:
                            break;
                    }
                }
            });
        }