protected void Page_Load(object sender, EventArgs e)
        {
            RunSecurity(CRM.Code.Models.Admin.AllowedSections.Calendar);

            Entity = db.CRM_Calendars.SingleOrDefault(c => c.ID.ToString() == Request.QueryString["id"]);

            ucLogHistory.IHistory = Entity;

            btnSubmitChanges.Visible = PermissionManager.CanUpdate;

            ucNavCal.Entity   = Entity;
            ucLogNotes.INotes = Entity;
            if (!PermissionManager.CanAdd && Entity == null)
            {
                Response.Redirect("list.aspx");
            }

            // buttons //

            btnSubmit.EventHandler        = btnSubmit_Click;
            btnSubmitChanges.EventHandler = btnSubmitChanges_Click;
            btnDelete.EventHandler        = btnDelete_Click;

            // Security //

            btnSubmitChanges.Visible = PermissionManager.CanUpdate;
            btnDelete.Visible        = PermissionManager.CanDelete;
            if (!PermissionManager.CanAdd && Entity == null)
            {
                Response.Redirect("list.aspx");
            }

            acPersons.EventHandler = lnkSelect_Click;
            acPersons.Config       = new AutoCompleteConfig(JSONSet.DataSets.contact);

            // confirmations //

            CRMContext = Entity;
            confirmationDelete.StandardDeleteHidden("Calendar", btnRealDelete_Click);

            if (!Page.IsPostBack)
            {
                ddlStatus.DataSource = Enumeration.GetAll <CRM_Calendar.StatusTypes>();
                ddlStatus.DataBind();

                ddlPrivacy.DataSource = Enumeration.GetAll <CRM_Calendar.PrivacyTypes>();
                ddlPrivacy.DataBind();

                ddlCalendarType.DataSource = from c in db.CRM_CalendarTypes
                                             orderby c.OrderNo
                                             select c;
                ddlCalendarType.DataBind();

                if (Entity != null)
                {
                    lblCreatedBy.Text = db.Admins.First(c => c.ID == Entity.CreatedByAdminID).DisplayName;
                    PopulateFields();
                }
                else
                {
                    lblCreatedBy.Text = AdminUser.DisplayName;
                    DateTime startDate = CRM.Code.Utils.Text.Text.FormatInputDateTime(HttpUtility.UrlDecode(Request.QueryString["slot"]));
                    txtStartDate.Value = startDate;
                    txtEndDate.Value   = startDate.AddHours(1);
                }
            }
        }
        protected void SaveRecord(bool newRecord)
        {
            // new record / exiting record //
            object oldEntity = null;

            if (newRecord)
            {
                Entity = new CRM_Calendar();
                Entity.CancellationReason      = "";
                Entity.TargetReference         = CRM_Calendar.DefaultTargetReference;
                Entity.PriceAgreed             = 0M;
                Entity.PriceType               = 0;
                Entity.InvoiceTitle            = "";
                Entity.InvoiceFirstname        = "";
                Entity.InvoiceLastname         = "";
                Entity.DatePaid                = null;
                Entity.PONumber                = "";
                Entity.PrimaryContactReference = "";
                Entity.Taken = 0;
                Entity.Limit = 0;
                db.CRM_Calendars.InsertOnSubmit(Entity);
            }
            else
            {
                oldEntity = Entity.ShallowCopy();
            }

            Entity.CRM_CalendarType = db.CRM_CalendarTypes.Single(c => c.ID == Convert.ToInt32(ddlCalendarType.SelectedValue));
            Entity.CreatedByAdminID = AdminUser.ID;
            Entity.DisplayName      = txtDisplayName.Text;
            Entity.EndDateTime      = txtStartDate.Value.Date.AddHours(txtEndDate.Value.Hour).AddMinutes(txtEndDate.Value.Minute);
            Entity.StartDateTime    = txtStartDate.Value;
            Entity.Status           = Convert.ToByte(ddlStatus.SelectedValue);
            Entity.RequiresCatering = false;
            Entity.PrivacyStatus    = Convert.ToByte(ddlPrivacy.SelectedValue);
            Entity.IsCancelled      = chkIsCancelled.Checked;

            if (acPersons.SelectedID != "")
            {
                Entity.PrimaryContactReference = acPersons.SelectedID;
            }

            db.SubmitChanges();

            if (!newRecord)
            {
                if (((CRM_Calendar)oldEntity).StartDateTime != Entity.StartDateTime || ((CRM_Calendar)oldEntity).EndDateTime != Entity.EndDateTime)
                {
                    foreach (CRM_CalendarAdmin invitation in Entity.CRM_CalendarAdmins)
                    {
                        EmailManager manager = new EmailManager();
                        manager.SendTimeChange((CRM_Calendar)oldEntity, invitation, db, AdminUser);
                    }
                }

                // if the entry has moved days, then updated all the venue allocations also to the new date.
                if (((CRM_Calendar)oldEntity).StartDateTime.Date != Entity.StartDateTime.Date)
                {
                    foreach (CRM_CalendarVenue venue in Entity.CRM_CalendarVenues)
                    {
                        venue.DateTimeFrom = new DateTime(Entity.StartDateTime.Year, Entity.StartDateTime.Month, Entity.StartDateTime.Day, venue.DateTimeFrom.Hour, venue.DateTimeFrom.Minute, 0);
                        venue.DateTimeTo   = new DateTime(Entity.EndDateTime.Year, Entity.EndDateTime.Month, Entity.EndDateTime.Day, venue.DateTimeTo.Hour, venue.DateTimeTo.Minute, 0);
                        db.SubmitChanges();
                    }
                }
            }


            if (oldEntity != null)
            {
                History.RecordLinqUpdate(AdminUser, oldEntity, Entity);
                db.SubmitChanges();
            }
            else
            {
                History.RecordLinqInsert(AdminUser, Entity);
            }
        }