protected void EditFullDayBookings()
    {
        DateTime?    old_date = UrlEditFullDay_OldDate;
        DateTime?    new_date = UrlEditFullDay_NewDate;
        Organisation old_org  = UrlEditFullDay_OldOrg;
        Organisation new_org  = UrlEditFullDay_NewOrg;
        Staff        old_prov = UrlEditFullDay_OldProvider;
        Staff        new_prov = UrlEditFullDay_NewProvider;

        if (old_date == null)
        {
            throw new Exception("Invalid url field editfullday_old_date");
        }
        if (new_date == null)
        {
            throw new Exception("Invalid url field editfullday_new_date");
        }
        if (old_org == null)
        {
            throw new Exception("Invalid url field editfullday_old_org");
        }
        if (new_org == null)
        {
            throw new Exception("Invalid url field editfullday_new_org");
        }
        if (old_prov == null)
        {
            throw new Exception("Invalid url field editfullday_old_provider");
        }
        if (new_prov == null)
        {
            throw new Exception("Invalid url field editfullday_new_provider");
        }


        // get all bookings from that day/staff/org
        // check each for clash

        bool hasClash = false;

        System.Collections.ArrayList clashes = new System.Collections.ArrayList();
        Booking[] daysBookingList            = BookingDB.GetBetween(old_date.Value, old_date.Value.AddDays(1), new Staff[] { old_prov }, new Organisation[] { old_org }, null, null, false, "0", false);

        // remove any 34 types not for this org
        System.Collections.ArrayList tmp = new System.Collections.ArrayList();
        foreach (Booking booking in daysBookingList)
        {
            if (booking.BookingTypeID != 34 || (booking.Organisation.OrganisationID == old_org.OrganisationID && booking.Provider.StaffID == old_prov.StaffID))
            {
                tmp.Add(booking);
            }
        }
        daysBookingList = (Booking[])tmp.ToArray(typeof(Booking));

        foreach (Booking booking in daysBookingList)
        {
            DateTime newDateStart = new_date.Value.AddHours(booking.DateStart.Hour).AddMinutes(booking.DateStart.Minute).AddSeconds(booking.DateStart.Second);
            DateTime newDateEnd   = new_date.Value.AddHours(booking.DateEnd.Hour).AddMinutes(booking.DateEnd.Minute).AddSeconds(booking.DateEnd.Second);

            Booking[] bookings = BookingDB.GetToCheckOverlap_OneTime(newDateStart, newDateEnd, new_prov, null, true, true, true, new Booking[] { booking });

            // remove any non 34 types (unavailabilities) for other orgs
            tmp = new System.Collections.ArrayList();
            foreach (Booking bk in bookings)
            {
                if (bk.Organisation.OrganisationID == old_org.OrganisationID || bk.BookingTypeID == 34)
                {
                    tmp.Add(bk);
                }
            }
            bookings = (Booking[])tmp.ToArray(typeof(Booking));

            if (Booking.HasOverlap(bookings, newDateStart, newDateEnd, booking))
            {
                hasClash = true;
                clashes.Add(booking.DateStart.ToString("yyyy-MM-dd HH:mm") + (booking.Patient == null ? "" : " " + booking.Patient.Person.FullnameWithoutMiddlename));
                //break;
            }
        }

        if (hasClash)
        {
            string clashesString = string.Empty;
            foreach (string s in clashes)
            {
                clashesString += (clashesString.Length == 0 ? "" : "\r\n") + s;
            }
            throw new CustomMessageException("There are clashes that need to be moved first:\r\n\r\nThese are unable to be moved:\r\n" + clashesString);
        }

        foreach (Booking booking in daysBookingList)
        {
            if (booking.BookingTypeID != 34)
            {
                continue;
            }

            DateTime newDateStart = new_date.Value.AddHours(booking.DateStart.Hour).AddMinutes(booking.DateStart.Minute).AddSeconds(booking.DateStart.Second);
            DateTime newDateEnd   = new_date.Value.AddHours(booking.DateEnd.Hour).AddMinutes(booking.DateEnd.Minute).AddSeconds(booking.DateEnd.Second);

            int bookingChangeHistoryReason = 276; // 276 = Admininstration reschedule needs
            BookingChangeHistoryDB.Insert(booking.BookingID, GetStaffID(), bookingChangeHistoryReason, booking.DateStart);
            BookingDB.Update(booking.BookingID, newDateStart, newDateEnd, new_org.OrganisationID, new_prov.StaffID, booking.Patient == null ? -1 : booking.Patient.PatientID, booking.Offering == null ? -1 : booking.Offering.OfferingID,
                             booking.BookingTypeID, booking.BookingStatus.ID, -1, booking.AddedBy.StaffID, booking.BookingConfirmedByType == null ? -1 : booking.BookingConfirmedByType.ID, booking.ConfirmedBy == null ? -1 : booking.ConfirmedBy.StaffID, booking.DateConfirmed,
                             booking.DeletedBy == null ? -1 : booking.DeletedBy.StaffID, booking.DateDeleted,
                             booking.CancelledBy == null ? -1 : booking.CancelledBy.StaffID, booking.DateCancelled,
                             booking.IsPatientMissedAppt, booking.IsProviderMissedAppt, booking.IsEmergency, booking.IsRecurring, booking.RecurringDayOfWeek, booking.RecurringStartTime, booking.RecurringEndTime);
        }
    }
    protected void EditBooking()
    {
        //UrlReturnPage returnPage    = GetUrlReturnPage();
        bool?checkClashAllOrgs = UrlCheckClashAllOrgs;

        Booking      booking       = UrlBooking;
        DateTime?    startDateTime = UrlStartDateTime;
        DateTime?    endDateTime   = UrlEndDateTime;
        Patient      patient       = UrlPatient;
        Organisation org           = UrlOrg;
        Staff        staff         = UrlStaff;
        Offering     offering      = UrlOffering;
        bool?        confirmed     = UrlIsConfirmed;
        int?         editReason    = UrlEditReasonID;

        if (booking == null)
        {
            throw new Exception("Invalid url field booking_id");
        }
        if (startDateTime == null)
        {
            throw new Exception("Invalid url field start_datetime");
        }
        if (endDateTime == null)
        {
            throw new Exception("Invalid url field end_datetime");
        }
        if (org == null)
        {
            throw new Exception("Invalid url field org_id");
        }
        if (staff == null)
        {
            throw new Exception("Invalid url field staff_id");
        }
        if (confirmed == null)
        {
            throw new Exception("Invalid url field is_confirmed");
        }
        if (editReason == null)
        {
            throw new Exception("Invalid url field edit_reason_id");
        }

        if (booking.AddedBy == null)
        {
            throw new CustomMessageException("Error - please contact system administrator.\r\n\r\nError Details:\r\nBooking 'Added By' is not set and must be set. BK ID: " + booking.BookingID);
        }

        // check booking is valid ie no overlapping with current bookings
        Booking[] bookings = BookingDB.GetToCheckOverlap_OneTime(startDateTime.Value, endDateTime.Value, staff, checkClashAllOrgs.Value ? null : org, booking.BookingTypeID == 342, true, false);
        if (Booking.HasOverlap(bookings, startDateTime.Value, endDateTime.Value, booking))
        {
            string fromTime = startDateTime.Value.Hour.ToString().PadLeft(2, '0') + ":" + startDateTime.Value.Minute.ToString().PadLeft(2, '0');
            string toTime   = endDateTime.Value.Hour.ToString().PadLeft(2, '0') + ":" + endDateTime.Value.Minute.ToString().PadLeft(2, '0');
            throw new CustomMessageException("Can not book " + startDateTime.Value.ToString(@"ddd MMM d") + " " + fromTime + "-" + toTime + " due to overlap with existing booking");
        }


        int      booking_confirmed_by_type_id = !confirmed.Value ? -1 : 1;
        int      confirmedBy   = !confirmed.Value ? -1                : (booking.ConfirmedBy == null ? GetStaffID() : booking.ConfirmedBy.StaffID);
        DateTime dateConfirmed = !confirmed.Value ? DateTime.MinValue : (booking.ConfirmedBy == null ? DateTime.Now : booking.DateConfirmed);

        if (patient != null && !RegisterPatientDB.IsPatientRegisteredToOrg(patient.PatientID, org.OrganisationID))
        {
            RegisterPatientDB.Insert(org.OrganisationID, patient.PatientID);
        }

        BookingChangeHistoryDB.Insert(booking.BookingID, GetStaffID(), Convert.ToInt32(editReason.Value), booking.DateStart);
        BookingDB.Update(booking.BookingID, startDateTime.Value, endDateTime.Value, org.OrganisationID, staff.StaffID, patient == null ? -1 : patient.PatientID, offering == null ? -1 : offering.OfferingID,
                         booking.BookingTypeID, booking.BookingStatus.ID, -1, booking.AddedBy.StaffID, booking_confirmed_by_type_id, confirmedBy, dateConfirmed,
                         booking.DeletedBy == null ? -1 : booking.DeletedBy.StaffID, booking.DateDeleted, booking.CancelledBy == null ? -1 : booking.CancelledBy.StaffID, booking.DateCancelled, booking.IsPatientMissedAppt, booking.IsProviderMissedAppt, booking.IsEmergency, booking.IsRecurring, booking.RecurringDayOfWeek, booking.RecurringStartTime, booking.RecurringEndTime);

        if (booking.BookingTypeID == 34)
        {
            Booking newBooking = BookingDB.GetByID(booking.BookingID);
            newBooking.SendReminderEmail(booking);
        }

        if (booking.ArrivalTime != DateTime.MinValue && booking.DateStart != startDateTime)
        {
            BookingDB.RemoveArrivalTime(booking.BookingID);
        }
    }