private void CopyCeremony(Ceremony destCeremony, Ceremony srcCeremony, IList<MajorCode> srcMajors, IList<College> srcColleges, IList<TicketDistributionMethod> srcTicketDistributionMethods )
        {
            destCeremony.Name = srcCeremony.Name;
            destCeremony.DateTime = srcCeremony.DateTime;
            destCeremony.Location = srcCeremony.Location;
            destCeremony.TicketsPerStudent = srcCeremony.TicketsPerStudent;
            destCeremony.TotalTickets = srcCeremony.TotalTickets;
            destCeremony.ExtraTicketBegin = srcCeremony.ExtraTicketBegin;
            destCeremony.ExtraTicketDeadline = CreateDeadline(srcCeremony.ExtraTicketDeadline);
            destCeremony.ExtraTicketPerStudent = srcCeremony.ExtraTicketPerStudent;
            destCeremony.PrintingDeadline = srcCeremony.PrintingDeadline;
            destCeremony.MinUnits = srcCeremony.MinUnits;
            destCeremony.PetitionThreshold = srcCeremony.PetitionThreshold;
            destCeremony.Colleges = srcColleges;
            destCeremony.ConfirmationText = srcCeremony.ConfirmationText;

            destCeremony.WebsiteUrl = srcCeremony.WebsiteUrl;
            destCeremony.SurveyUrl = srcCeremony.SurveyUrl;
            destCeremony.Survey = srcCeremony.Survey;

            foreach (var ceremonySurvey in srcCeremony.CeremonySurveys)
            {
                var destCeremonySurvey = destCeremony.CeremonySurveys.SingleOrDefault(a => a.College.Id == ceremonySurvey.College.Id);
                if (destCeremonySurvey == null)
                {
                    var cSurvey = new CeremonySurvey();
                    cSurvey.Ceremony = destCeremony;
                    cSurvey.College = ceremonySurvey.College;
                    cSurvey.Survey = ceremonySurvey.Survey;
                    cSurvey.SurveyUrl = ceremonySurvey.SurveyUrl;
                    destCeremony.CeremonySurveys.Add(cSurvey);
                }
                else
                {
                    destCeremonySurvey.Survey = ceremonySurvey.Survey;
                    destCeremonySurvey.SurveyUrl = ceremonySurvey.SurveyUrl;
                }
            }

            MergeCeremonyMajors(destCeremony.Majors, srcMajors, srcColleges);
            MergeTicketDistributionMethods(destCeremony.TicketDistributionMethods, srcTicketDistributionMethods);
        }
        public static CeremonyViewModel Create(IRepository repository, IPrincipal user, IMajorService majorService , Ceremony ceremony)
        {
            Check.Require(repository != null, "Repository is required.");
            Check.Require(majorService != null, "Major Service is required.");

            var viewModel = new CeremonyViewModel()
                                {
                                    TermCode = TermService.GetCurrent(),
                                    IsAdmin = user.IsInRole(Role.Codes.Admin),
                                    Ceremony = ceremony,
                                    Surveys = repository.OfType<Survey>().GetAll().ToList()
                                };

            // populate the colleges and majors
            var colleges = repository.OfType<College>().Queryable.Where(a => a.Display).ToList();

            foreach (var clg in colleges)
            {
                if (viewModel.Ceremony.CeremonySurveys.All(a => a.College != clg))
                {
                    var ceremonySurvey = new CeremonySurvey();
                    ceremonySurvey.College = clg;
                    ceremonySurvey.Ceremony = viewModel.Ceremony;
                    viewModel.Ceremony.CeremonySurveys.Add(ceremonySurvey);
                }
            }

            IEnumerable<MajorCode> majors;
            if (ceremony.Id != 0)
            {
                viewModel.Colleges = new MultiSelectList(colleges, "Id", "Name", ceremony.Colleges.Select(x=>x.Id).ToList());
                viewModel.TermCode = ceremony.TermCode;

                majors = majorService.GetByCollege(ceremony.Colleges.ToList());
                viewModel.Majors = new MultiSelectList(majors, "Id", "Name", ceremony.Majors.Select(x => x.Id).ToList());
            }
            else
            {
                viewModel.Colleges = new MultiSelectList(colleges, "Id", "Name");
            }

            // populate the ticket distribution methods
            var tdmethods = repository.OfType<TicketDistributionMethod>().Queryable.Where(a => a.IsActive).ToList();
            var selectedtdmethods = ceremony.TicketDistributionMethods.Select(a => a.Id).ToList();
            viewModel.TicketDistributionMethods = new MultiSelectList(tdmethods, "Id", "Name", selectedtdmethods);

            // info for the time drop downs
            viewModel.Hours = new List<int>();
            viewModel.Minutes = new List<string>();
            viewModel.AmPm = new List<string>();

            for (int i = 1; i < 13; i++)
            {
                viewModel.Hours.Add(i);
            }

            viewModel.Minutes.Add("00");
            viewModel.Minutes.Add("30");

            viewModel.AmPm.Add("AM");
            viewModel.AmPm.Add("PM");

            return viewModel;
        }