public ActionResult AssoEdit(short?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Org org = db.Orgs.Find(id);

            if (org == null)
            {
                return(HttpNotFound());
            }
            ViewBag.Npcs = db.NPCs.OrderBy(n => n.Name).ToList();
            var selected = db.NpcOrgs.Where(x => x.OrgId == org.OrgId).ToList();
            List <AssoNpc_Org> assoNpcs = new List <AssoNpc_Org>();

            foreach (NpcOrg npcOrg in selected)
            {
                AssoNpc_Org toAdd = new AssoNpc_Org(npcOrg);
                assoNpcs.Add(toAdd);
            }

            ViewBag.Events = db.Events.OrderBy(e => e.Name).ToList();
            var selected2 = db.OrgEvents.Where(i => i.OrgId == org.OrgId).ToList();
            List <AssoEvent_Org> assoEvents = new List <AssoEvent_Org>();

            foreach (OrgEvent item in selected2)
            {
                AssoEvent_Org toAdd = new AssoEvent_Org(item);
                assoEvents.Add(toAdd);
            }

            ViewBag.Characters = db.Characters.Where(i => i.IsApproved).OrderBy(c => c.CharacterName).ToList();
            var selected3 = db.CharOrgs.Where(i => i.OrgId == org.OrgId).ToList();
            List <AssoChar_Org> assoChars = new List <AssoChar_Org>();

            foreach (CharOrg item in selected3)
            {
                AssoChar_Org toAdd = new AssoChar_Org(item);
                assoChars.Add(toAdd);
            }


            var       infoid = org.InfoId;
            AssoOrgVM model  = new AssoOrgVM {
                InfoId = infoid, OrgId = org.OrgId, Submit = "Save", Name = org.Name, AssoNpcs = assoNpcs, AssoEvents = assoEvents, AssoChars = assoChars
            };

            return(View(model));
        }
        public ActionResult AssoEdit(short infoId, short orgId, string submit,
                                     List <AssoNpc_Org> npcs,
                                     List <AssoEvent_Org> events,
                                     List <AssoChar_Org> charas
                                     )
        {
            if (ModelState.IsValid)
            {
                #region Add Members
                List <short> currentNpcId = db.NpcOrgs.Where(x => x.OrgId == orgId).Select(x => x.NpcId).ToList();
                if (npcs != null)
                {
                    foreach (AssoNpc_Org member in npcs)
                    {
                        //if the association already exists
                        if (currentNpcId.Contains(member.NpcId))
                        {
                            NpcOrg toEdit = db.NpcOrgs.Where(x => x.NpcId == member.NpcId && x.OrgId == orgId).First();

                            //make the edits
                            toEdit.OrgOrder     = member.OrgOrder;
                            toEdit.BlurbNpcPage = member.BlurbNpcPage;
                            toEdit.BlurbOrgPage = member.BlurbOrgPage;
                            toEdit.MemberOrder  = member.MemberOrder;
                            toEdit.IsCurrent    = member.IsCurrent;

                            db.Entry(toEdit).State = EntityState.Modified;
                            db.SaveChanges();
                            currentNpcId.Remove(member.NpcId);
                        }
                        else
                        {
                            NpcOrg toAdd = new NpcOrg
                            {
                                OrgId        = orgId,
                                NpcId        = member.NpcId,
                                OrgOrder     = member.OrgOrder,
                                BlurbNpcPage = member.BlurbNpcPage,
                                BlurbOrgPage = member.BlurbOrgPage,
                                MemberOrder  = member.MemberOrder,
                                IsCurrent    = member.IsCurrent
                            };
                            db.NpcOrgs.Add(toAdd);
                        }
                    }
                }
                if (currentNpcId.Count != 0)
                {
                    foreach (short id in currentNpcId)
                    {
                        NpcOrg gone = db.NpcOrgs.Where(x => x.OrgId == orgId && x.NpcId == id).FirstOrDefault();
                        db.NpcOrgs.Remove(gone);
                    }
                }
                db.SaveChanges();
                #endregion

                #region Add Events
                List <short> currentEventId = db.OrgEvents.Where(x => x.OrgId == orgId).Select(x => x.EventId).ToList();
                if (events != null)
                {
                    foreach (AssoEvent_Org assoEvent in events)
                    {
                        //if the association already exists
                        if (currentEventId.Contains(assoEvent.EventId))
                        {
                            OrgEvent toEdit = db.OrgEvents.Where(x => x.EventId == assoEvent.EventId && x.OrgId == orgId).First();
                            toEdit.Blurb           = assoEvent.Blurb;
                            db.Entry(toEdit).State = EntityState.Modified;
                            db.SaveChanges();
                            currentEventId.Remove(assoEvent.EventId);
                        }
                        else
                        {
                            OrgEvent toAdd = new OrgEvent
                            {
                                OrgId   = orgId,
                                EventId = assoEvent.EventId,
                                Blurb   = assoEvent.Blurb
                            };
                            db.OrgEvents.Add(toAdd);
                        }
                    }
                }
                if (currentEventId.Count != 0)
                {
                    foreach (short id in currentEventId)
                    {
                        OrgEvent gone = db.OrgEvents.Where(x => x.OrgId == orgId && x.EventId == id).FirstOrDefault();
                        db.OrgEvents.Remove(gone);
                    }
                }
                db.SaveChanges();
                #endregion

                #region Add CharacterOrgs
                List <short> currentCharId = db.CharOrgs.Where(x => x.OrgId == orgId).Select(x => x.CharId).ToList();
                if (charas != null)
                {
                    foreach (AssoChar_Org assoChar in charas)
                    {
                        if (currentCharId.Contains(assoChar.CharId))
                        {
                            CharOrg toEdit = db.CharOrgs.Where(x => x.CharId == assoChar.CharId && x.OrgId == orgId).First();
                            toEdit.BlurbOrgPage      = assoChar.BlurbOrgPage;
                            toEdit.IsCurrent         = assoChar.IsCurrent;
                            toEdit.IsPublic          = assoChar.IsPublic;
                            toEdit.KatherineApproved = assoChar.KatherineApproved;
                            db.Entry(toEdit).State   = EntityState.Modified;
                            db.SaveChanges();
                            currentCharId.Remove(assoChar.CharId);
                        }
                        else
                        {
                            CharOrg toAdd = new CharOrg
                            {
                                OrgId             = orgId,
                                CharId            = assoChar.CharId,
                                BlurbOrgPage      = assoChar.BlurbOrgPage,
                                IsPublic          = assoChar.IsPublic,
                                IsCurrent         = assoChar.IsCurrent,
                                KatherineApproved = assoChar.KatherineApproved
                            };
                            db.CharOrgs.Add(toAdd);
                        }
                    }
                }
                if (currentCharId.Count != 0)
                {
                    foreach (short id in currentCharId)
                    {
                        CharOrg gone = db.CharOrgs.Where(x => x.OrgId == orgId && x.CharId == id).FirstOrDefault();
                        db.CharOrgs.Remove(gone);
                    }
                }
                db.SaveChanges();
                #endregion


                return(Json(true));
            }
            //if model fails
            ViewBag.Npcs       = db.NPCs.OrderBy(n => n.Name).ToList();
            ViewBag.Events     = db.Events.OrderBy(e => e.Name).ToList();
            ViewBag.Characters = db.Characters.Where(i => i.IsApproved).OrderBy(c => c.CharacterName).ToList();
            var       org   = db.Orgs.Find(orgId);
            AssoOrgVM model = new AssoOrgVM {
                InfoId = infoId, OrgId = orgId, Submit = submit, Name = org.Name, AssoNpcs = npcs, AssoEvents = events, AssoChars = charas
            };
            return(View(model));
        }