public void SetGlobalVariables()
    {
        // get list of orgs
        int[] orgIDs = GetFormOrgs();
        //this.orgs = new Organisation[orgIDs.Length];

        // EDIT: changed to show all offerings to all clinics (only change the price if they set a price on invoiceing in the org-offering table)
        //
        // only show orgs that offer this offering -- or if editing booking and offering not offered by that org, still show the org
        ArrayList orgsList = new ArrayList();
        int offeringID = IsValidFormOffering() ? GetFormOffering() : -1;
        Booking editBooking = IsEditBookingMode() && IsValidFormBooking() ? BookingDB.GetByID(GetFormBooking()) : null;
        for (int i = 0; i < orgIDs.Length; i++)
        {
            //if (offeringID == -1 || OrganisationOfferingsDB.IsOfferingOfferedyByOrg(offeringID, orgIDs[i]) || (editBooking != null && editBooking.Organisation.OrganisationID == orgIDs[i]))
            orgsList.Add(OrganisationDB.GetByID(orgIDs[i]));
        }
        this.orgs = (Organisation[])orgsList.ToArray(typeof(Organisation));

        // foreach day:
        //   foreach org:
        //       add  date:[orgs:[staff]]

        if (Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["LogAllSqlStackTraces"]))
            Logger.LogQuery("START TIME - GET STAFF WORKING AT ALL BOOKING PAGE ORGS");

        DataTable tblAllRegisteredStaff = RegisterStaffDB.GetDataTable_All();
        DataTable tblUnavailableProvBookingsFullDays = BookingDB.GetUnavailableProvBookingsBetween(orgIDs, GetFormDate(), GetFormDate().AddDays(GetFormNumDays()));

        //
        // need to get the staff list before getting the bookings because when we get bookings with 'staff' put in,
        // we get where staff are booked other organisations, which needs to be shown
        //

        Hashtable allStaff = new Hashtable();
        DateTime day = GetFormDate();
        for (int i = 0; i < GetFormNumDays(); day = day.AddDays(1), i++)
        {
            for (int j = 0; j < this.orgs.Length; j++)
            {
                StartEndTime orgStartEndTime = this.orgs[j].GetStartEndTime(day.DayOfWeek);
                bool orgOpen = ((this.orgs[j].StartDate == DateTime.MinValue || this.orgs[j].StartDate <= day) &&
                                (this.orgs[j].EndDate   == DateTime.MinValue || this.orgs[j].EndDate   >= day) &&
                                (this.orgs[j].IsOpen(day.DayOfWeek)) &&
                                (orgStartEndTime.StartTime < orgStartEndTime.EndTime));

                Staff[] workingStaff = GetWorkingStaffFor(orgs[j].OrganisationID, true, day, null, tblAllRegisteredStaff, tblUnavailableProvBookingsFullDays, GetFormShowUnavailableStaff());

                for (int k = 0; k < workingStaff.Length; k++)
                    allStaff[workingStaff[k].StaffID] = workingStaff[k];
            }
        }
        Staff[] staff = new Staff[allStaff.Values.Count];
        allStaff.Values.CopyTo(staff, 0);

        // get all bookings for these orgs between the dates -- irregardless of provider
        // so we can add providers who have bookings before but are no longer registered to this clinic or are no longer set as a provider
        Booking[] bookingsTheseOrgs = BookingDB.GetBetween(debugPageLoadTime, GetFormDate(), GetFormDate().AddDays(GetFormNumDays()), staff, this.orgs, null, null);
        this.bookings = bookingsTheseOrgs; // save to use results again when displaying page...

        this.daysData = new DayData[GetFormNumDays()];
        day = GetFormDate();
        for (int i = 0; i < GetFormNumDays(); day = day.AddDays(1), i++)
        {
            OrgDayData[] orgDayData = new OrgDayData[this.orgs.Length];
            for (int j = 0; j < this.orgs.Length; j++)
            {
                StartEndTime orgStartEndTime = this.orgs[j].GetStartEndTime(day.DayOfWeek);
                bool orgOpen = ((this.orgs[j].StartDate == DateTime.MinValue || this.orgs[j].StartDate <= day) &&
                                (this.orgs[j].EndDate   == DateTime.MinValue || this.orgs[j].EndDate   >= day) &&
                                (this.orgs[j].IsOpen(day.DayOfWeek)) &&
                                (orgStartEndTime.StartTime < orgStartEndTime.EndTime));

                //orgDayData[j] = new OrgDayData(this.orgs[j], RegisterStaffDB.GetWorkingStaffOf(orgs[j].OrganisationID, day));   // THIS IS VERY SLOW, SO CREATED BELOW LINE
                orgDayData[j] = new OrgDayData(this.orgs[j], GetWorkingStaffFor(orgs[j].OrganisationID, orgOpen, day, bookingsTheseOrgs, tblAllRegisteredStaff, tblUnavailableProvBookingsFullDays, GetFormShowUnavailableStaff()));

                if (orgDayData[j].NCols == 0)  // need to put in blank column if no staff allocated
                    orgDayData[j].StaffList = new Staff[] { null };
            }
            this.daysData[i] = new DayData(day, orgDayData);
        }

        // if there is a booking for a staff member who is now set as not working on this day at this org:
        // then this staff memeber will be showing (as it shows staff who have 'existing' bookings but not set as working that day), but
        // the last code will not get bookings for other orgs for this staff memmber
        // so this checks for those staff, and if so, has to re-get the list of bookings including for that staff memeber
        //
        // most of the time this should not be called, so the db lookups will stay minimal
        if (staff.Length < this.staffList.Length)
        {
            bookingsTheseOrgs = BookingDB.GetBetween(debugPageLoadTime, GetFormDate(), GetFormDate().AddDays(GetFormNumDays()), this.staffList, this.orgs, null, null);
            this.bookings = bookingsTheseOrgs; // save to use results again when displaying page...

            this.daysData = new DayData[GetFormNumDays()];
            day = GetFormDate();
            for (int i = 0; i < GetFormNumDays(); day = day.AddDays(1), i++)
            {
                OrgDayData[] orgDayData = new OrgDayData[this.orgs.Length];
                for (int j = 0; j < this.orgs.Length; j++)
                {
                    StartEndTime orgStartEndTime = this.orgs[j].GetStartEndTime(day.DayOfWeek);
                    bool orgOpen = ((this.orgs[j].StartDate == DateTime.MinValue || this.orgs[j].StartDate <= day) &&
                                    (this.orgs[j].EndDate   == DateTime.MinValue || this.orgs[j].EndDate   >= day) &&
                                    (this.orgs[j].IsOpen(day.DayOfWeek)) &&
                                    (orgStartEndTime.StartTime < orgStartEndTime.EndTime));

                    //orgDayData[j] = new OrgDayData(this.orgs[j], RegisterStaffDB.GetWorkingStaffOf(orgs[j].OrganisationID, day));   // THIS IS VERY SLOW, SO CREATED BELOW LINE
                    orgDayData[j] = new OrgDayData(this.orgs[j], GetWorkingStaffFor(orgs[j].OrganisationID, orgOpen, day, bookingsTheseOrgs, tblAllRegisteredStaff, tblUnavailableProvBookingsFullDays, GetFormShowUnavailableStaff()));

                    if (orgDayData[j].NCols == 0)  // need to put in blank column if no staff allocated
                        orgDayData[j].StaffList = new Staff[] { null };
                }
                this.daysData[i] = new DayData(day, orgDayData);
            }
        }

        if (Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["LogAllSqlStackTraces"]))
            Logger.LogQuery("END TIME - GET STAFF WORKING AT ALL BOOKING PAGE ORGS");

        this.bookingSlotMinsCache = new BookingSlotMinsCache(this.orgs.Length == 0 ? 0 : this.orgs[0].OrganisationID);
    }
 public DayData(DateTime Date, OrgDayData[] OrgDayData)
 {
     this.Date = Date;
     this.OrgDayData = OrgDayData;
 }