public ActionResult New()
        {
            NewFamilyViewModel viewModel = new NewFamilyViewModel();

            NewFamilyModel model = new NewFamilyModel();

            model.NewFamilyMembers = new List <Member>();
            model.NewFamilyMembers.Add(new Member());

            //starting address
            Address address = new Address();

            address.State = "KY";
            model.Address = address;

            viewModel.States         = GetStates();
            viewModel.Campuses       = GetCampuses();
            viewModel.NewFamilyModel = model;

            return(View(viewModel));
        }
        public async Task <ActionResult> New(NewFamilyModel NewFamilyModel)
        {
            //we need to validate the data server side
            if (NewFamilyModel.NewFamilyMembers.Any(x => !x.AdultIsValid))
            {
                ModelState.AddModelError("", "Every family member requires a valid first name, last name, email and phone number.");
            }

            //ensure at least 1 person is being added
            if (NewFamilyModel.NewFamilyMembers.Count == 0)
            {
                ModelState.AddModelError("", "At least 1 family member is required to register a family.");
            }

            //check the email addresses and phone numbers
            foreach (var member in NewFamilyModel.NewFamilyMembers)
            {
                Boolean isValid = true;
                if (!ValidationHelper.IsValidEmail(member.Email))
                {
                    ModelState.AddModelError("", String.Format("{0} is not a valid email address", member.Email)); isValid = false;
                }
                if (!ValidationHelper.IsValidPhone(ValidationHelper.CleanPhoneNumber(member.PhoneNumber)))
                {
                    ModelState.AddModelError("", String.Format("{0} is not a valid phone number", member.PhoneNumber)); isValid = false;
                }

                if (isValid)
                {
                    //lets just verify this email doesn't already exist in the system, if it does, we should redirect
                    List <Person> personsFound = await ArenaAPIHelper.GetPersons(new PersonListOptions { Email = member.Email });

                    if (personsFound.Count > 0)
                    {
                        return(RedirectToAction("Find", new { email = member.Email }));
                    }
                }
            }



            if (!ModelState.IsValid)
            {
                NewFamilyViewModel viewModel = new NewFamilyViewModel();
                viewModel.Campuses       = GetCampuses();
                viewModel.States         = GetStates();
                viewModel.NewFamilyModel = NewFamilyModel;

                return(View(viewModel));
            }

            //add the first person
            Person requiredAdult = MemberHelper.GetAdultPersonFromMember(NewFamilyModel.NewFamilyMembers.First(), (Campus)NewFamilyModel.CampusId);

            requiredAdult.Addresses = new List <Address> {
                NewFamilyModel.Address
            };

            ArenaPostResult result = await ArenaAPIHelper.AddPerson(requiredAdult);

            if (result.WasSuccessful)
            {
                //we need the familyId
                requiredAdult = await ArenaAPIHelper.GetPerson(result.ObjectId);

                for (int i = 1; i < NewFamilyModel.NewFamilyMembers.Count; i++)
                {
                    Person additonalAdult = MemberHelper.GetAdultPersonFromMember(NewFamilyModel.NewFamilyMembers[i], (Campus)NewFamilyModel.CampusId);

                    additonalAdult.FamilyId  = requiredAdult.FamilyId;
                    additonalAdult.Addresses = requiredAdult.Addresses;

                    result = await ArenaAPIHelper.AddPerson(additonalAdult);
                }

                return(RedirectToAction("AddChildren", new { id = requiredAdult.PersonId }));
            }

            return(RedirectToAction("Index"));
        }