/// <summary>
        /// GetDepartments - Returns a list of Departments from the Departments table in the ClassSchedule
        /// database, used by the user interface to generate the department list drop down.
        /// </summary>
        /// <param name="addInitialText">If true, adds a "Any Department" option to the list.</param>
        /// <returns>A DepartmentListModel List.</returns>
        public List<DepartmentListModel> GetDepartments(string currQuarter, bool addInitialText = false)
        {
            List<DepartmentListModel> model = new List<DepartmentListModel>();

            if (addInitialText)
            {
                model.Add(new DepartmentListModel
                {
                    DepartmentID = 0,
                    Name = ANY_DEPARTMENT_VALUE,
                    UrlName = ANY_DEPARTMENT_VALUE
                });
            }

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                try
                {
                    var items = ctx.Departments.OrderBy(d => d.Name).ToList<Department>();

                    foreach (var item in items)
                    {
                        if (item.DepartmentID != BUS_PASS && item.DepartmentID != ORCA_PASS)
                        {
                            int deptEnd = Int32.Parse(item.EffectiveYearQuarterEnd.Substring(1,3));
                            int currInt = Int32.Parse(currQuarter.Substring(1,3));

                            if( deptEnd >= currInt)
                            {

                                model.Add(new DepartmentListModel
                                {
                                    DepartmentID = item.DepartmentID,
                                    Name = item.Name,
                                    UrlName = item.UrlFriendlyName
                                });
                            }
                        }

                    }
                }
                catch (Exception ex)
                {
                    throw new SystemException("Cannot get list of departments. " + ex.Message);
                }
            }

            return model;
        }
        public bool AddPrefixToDepartment(DepartmentPrefixItem entity)
        {
            bool result = false;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                DepartmentPrefix misc = new DepartmentPrefix();

                misc.DepartmentID = entity.DepartmentId;
                misc.Prefix = entity.PrefixText;

                ctx.DepartmentPrefixes.InsertOnSubmit(misc);

                try
                {
                    ctx.SubmitChanges();
                    result = true;

                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to add prefix: " + ex.Message);
                }

            }

            return result;
        }
        /// <summary>
        /// GetAvailableQuarters - Gets a QuarterItemModel containing the quarters to display
        /// in the user interface. 
        /// </summary>
        /// <returns>A List of QuarterItemModel objects containing the list of quarters for which the
        /// class schedule is available.</returns>
        public List<QuarterItemModel> GetAvailableQuarters()
        {
            List<QuarterItemModel> quarters = new List<QuarterItemModel>();

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                var items = ctx.DisplayQuarters.OrderBy(d => d.YearQuarterID).ToList<DisplayQuarter>();

                foreach (var item in items)
                {
                    quarters.Add(new QuarterItemModel
                    {
                        Title = item.Title,
                        UrlName = item.UrlName,
                        YearQuarterID = item.YearQuarterID,
                        DisplayQuarterID = item.DisplayQuarterID
                    });
                }

            }

            return quarters;
        }
        public DepartmentAddEditModel GetDepartmentForEdit(int id)
        {
            DepartmentAddEditModel result = new DepartmentAddEditModel();

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                try
                {
                    var item = ctx.Departments.Where(s=>s.DepartmentID == id).SingleOrDefault<Department>();

                                    result.DepartmentID = item.DepartmentID;
                                    result.Name = item.Name;
                                    result.UrlName = item.UrlFriendlyName;
                                    result.EffectiveYearQuarterBegin = item.EffectiveYearQuarterBegin;
                                    result.EffectiveYearQuarterEnd = item.EffectiveYearQuarterEnd;
                                    result.Contact = item.Contact;
                                    result.Description = item.Description;

                }
                catch (Exception ex)
                {
                    throw new SystemException("Cannot get department. " + ex.Message);
                }
            }

            return result;
        }
        /// <summary>
        /// GetDepartmentUrlNameFromID - Returns a url string representation of the specified department.
        /// </summary>
        /// <param name="id">An ID representing the unique ID (Primary Key) of the department</param>
        /// <returns>A url string, such as "English" or "Coordinated-Studies"</returns>
        private string GetDepartmentUrlNameFromID(int id)
        {
            string result = "";

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                var item = ctx.Departments.Where(s => s.DepartmentID == id).SingleOrDefault<Department>();

                result = item.UrlFriendlyName;
            }

            return result;
        }
 /// <summary>
 /// GetExcludedAdminUnits - Returns a list of Excluded Administrative Unit Codes from the 
 /// ClassSchedule database. This is used by the search process as an exclusion filter.
 /// </summary>
 /// <returns>A String Array representing the list of Admin Unit Codes to filter out of the search./</returns>
 private string[] GetExcludedAdminUnits()
 {
     using (ScheduleDataContext ctx = new ScheduleDataContext())
     {
         return ctx.ExcludedAdminUnits.Select(e => e.AdminUnitID).ToArray<string>();
     }
 }
        public bool AddNewDisplayQuarter(QuarterItemModel entity)
        {
            bool result = false;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                DisplayQuarter quarter = new DisplayQuarter();

                quarter.Title = entity.Title;
                quarter.UrlName = entity.UrlName;
                quarter.YearQuarterID = entity.YearQuarterID;

                ctx.DisplayQuarters.InsertOnSubmit(quarter);

                try
                {
                    ctx.SubmitChanges();
                    result = true;

                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to add Display Quarter: " + ex.Message);
                }

            }

            return result;
        }
        /// <summary>
        /// GetDepartmentModelBasics - returns a department object that includes the name, description,
        /// Url string, and other information for use in displays.
        /// </summary>
        /// <param name="id">The unique ID (Primary Key) for a department.</param>
        /// <returns>A DepartmentModel object.</returns>
        private DepartmentModel GetDepartmentModelBasics(int id)
        {
            DepartmentModel model = new DepartmentModel();

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                var item = ctx.Departments.Where(s => s.DepartmentID == id).SingleOrDefault<Department>();

                model.DepartmentID = item.DepartmentID;
                model.Description = item.Description;
                model.Name = item.Name;
                model.UrlName = item.UrlFriendlyName;
                model.Contact = item.Contact;

            }

            return model;
        }
        public DepartmentMiscSortItem GetMiscSortItem(int id)
        {
            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                var item = ctx.DepartmentMiscSorts.Where(d => d.DepartmentMiscSortId == id).SingleOrDefault<DepartmentMiscSort>();

                DepartmentMiscSortItem result = new DepartmentMiscSortItem();

                try
                {
                    result.DepartmentId = item.DepartmentID;
                    result.MiscSortId = item.DepartmentMiscSortId;
                    result.MiscSortText = item.MiscSortValue;
                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to get Misc Sort Value: " + ex.Message);
                }

                return result;
            }
        }
        /// <summary>
        /// GetQuarterItemFromYRQ - Gets a QuarterItemModel based on a Quarter Code
        /// </summary>
        /// <param name="yrq">A YRQ Code, such as "B012"</param>
        /// <returns>A QuarterItemModel loaded with quarterly information.</returns>
        public QuarterItemModel GetQuarterItemFromYRQ(string yrq)
        {
            QuarterItemModel result = new QuarterItemModel();

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                var item = ctx.DisplayQuarters.Where(d => d.YearQuarterID == yrq).SingleOrDefault<DisplayQuarter>();

                try
                {

                    result.YearQuarterID = item.YearQuarterID;
                    result.UrlName = item.UrlName;
                    result.Title = item.Title;
                    result.DisplayQuarterID = item.DisplayQuarterID;

                }
                catch (Exception ex)
                {
                    throw new SystemException("Unable to locate specified quarter '" + yrq + "':" + ex.Message);
                }

            }

            return result;
        }
        public List<DepartmentAddEditModel> GetManageDepartmentList()
        {
            List<DepartmentAddEditModel> model = new List<DepartmentAddEditModel>();

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                try
                {
                    var items = ctx.Departments.OrderBy(d => d.Name).ToList<Department>();

                    foreach (var item in items)
                    {

                        model.Add(new DepartmentAddEditModel
                                {
                                    DepartmentID = item.DepartmentID,
                                    Name = item.Name,
                                    UrlName = item.UrlFriendlyName,
                                    EffectiveYearQuarterBegin = item.EffectiveYearQuarterBegin,
                                    EffectiveYearQuarterEnd = item.EffectiveYearQuarterEnd,
                                    Contact = item.Contact
                                });

                    }
                }
                catch (Exception ex)
                {
                    throw new SystemException("Cannot get list of departments. " + ex.Message);
                }
            }

            return model;
        }
        public bool AddNewDepartment(DepartmentAddEditModel entity)
        {
            bool result = false;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                Department dept = new Department();

                if (entity.Description == "")
                {
                    entity.Description = " ";
                }

                dept.Contact = entity.Contact;
                dept.Description = entity.Description;
                dept.EffectiveYearQuarterBegin = entity.EffectiveYearQuarterBegin;
                dept.EffectiveYearQuarterEnd = entity.EffectiveYearQuarterEnd;
                dept.Name = entity.Name;
                dept.UrlFriendlyName = entity.UrlName;

                ctx.Departments.InsertOnSubmit(dept);

                try
                {
                    ctx.SubmitChanges();
                    result = true;

                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to add Department: " + ex.Message);
                }

            }

            return result;
        }
        /// <summary>
        /// GetDisplayTimes - Returns a list of DisplayTimeModel objects, used in displaying 
        /// start after and end before times.
        /// </summary>
        /// <param name="addInitialText">A parameter that determines whether we also include an "Anytime" value.</param>
        /// <returns>A DisplayTimeModel list</returns>
        public List<DisplayTimeModel> GetDisplayTimes(bool addInitialText = false)
        {
            List<DisplayTimeModel> results = new List<DisplayTimeModel>();

            if (addInitialText)
            {
                results.Add(new DisplayTimeModel { TimeID = 0, TimeValue = ANY_TIME_VALUE });
            }

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                var items = ctx.DisplayTimes.OrderBy(s => s.Time).ToList<DisplayTime>();

                foreach (var item in items)
                {
                    results.Add(new DisplayTimeModel
                    {
                        TimeID = item.TimeID,
                        TimeValue = item.Time.ToShortTimeString()
                    });
                }

            }

            return results;
        }
 /// <summary>
 /// GetDayCodesForWednesday
 /// </summary>
 /// <returns>Returns a string array of DAY_CD values for where a DAY_ID includes Wednesday</returns>
 private string[] GetDayCodesForWednesday()
 {
     using (ScheduleDataContext ctx = new ScheduleDataContext())
     {
         return ctx.DaySearches.Where(d => d.Wednesday == true).Select(d => d.DayCode).ToArray<string>();
     }
 }
        public bool AddNewMiscSortCodeInclude(DepartmentMiscSortItem entity)
        {
            bool result = false;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                DepartmentMiscSort misc = new DepartmentMiscSort();

                misc.IncludeFilter = false;
                misc.MiscSortValue = entity.MiscSortText;
                misc.DepartmentID = entity.DepartmentId;

                ctx.DepartmentMiscSorts.InsertOnSubmit(misc);

                try
                {
                    ctx.SubmitChanges();
                    result = true;

                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to add Misc Sort Value: " + ex.Message);
                }

            }

            return result;
        }
        /// <summary>
        /// GetDepartmentIDFromUrlName - Returns the unique ID (Primary Key) of a department based on the 
        /// url string.
        /// </summary>
        /// <param name="name">A Url string, such as "English", or "Coordinated-Studies".</param>
        /// <returns>An Integer representing the primary key.</returns>
        private int GetDepartmentIDFromUrlName(string name)
        {
            int result = 0;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                var item = ctx.Departments.Where(s => s.UrlFriendlyName == name).SingleOrDefault<Department>();

                result = item.DepartmentID;
            }

            return result;
        }
        /// <summary>
        /// GetYearQuarterFromUrlName - This function gets the YRQ for the specified Url string 
        /// </summary>
        /// <param name="name">A Url String, such as "Fall-2012"</param>
        /// <returns>A YRQ Quarter Code, such as "B012"</returns>
        public string GetYearQuarterFromUrlName(string name)
        {
            string result = "";

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                var item = ctx.DisplayQuarters.Where(d => d.UrlName == name).SingleOrDefault<DisplayQuarter>();

                try
                {

                    result = item.YearQuarterID;

                }
                catch(Exception ex)
                {
                    throw new SystemException("Unable to locate specified quarter '" + name + "':" + ex.Message);
                }

            }

            return result;
        }
        /// <summary>
        /// GetDepartmentPrefixes - This function returns a string array of the course prefixes 
        /// associated with the specific department.
        /// </summary>
        /// <param name="deptId">An ID representing the unique ID (Primary Key) of the department</param>
        /// <returns>String Array of Course Prefixes.</returns>
        private string[] GetDepartmentPrefixes(int deptId)
        {
            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                int count = ctx.DepartmentPrefixes.Where(d => d.DepartmentID == deptId).Count();
                    return ctx.DepartmentPrefixes.Where(d => d.DepartmentID == deptId).Select(d => d.Prefix).ToArray<string>();

            }
        }
        public bool RemoveDisplayQuarter(int displayQuarterID)
        {
            bool result = false;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                DisplayQuarter quarter = ctx.DisplayQuarters.Where(d => d.DisplayQuarterID == displayQuarterID).SingleOrDefault<DisplayQuarter>();

                ctx.DisplayQuarters.DeleteOnSubmit(quarter);

                try
                {
                    ctx.SubmitChanges();
                    result = true;

                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to remove Display Quarter: " + ex.Message);
                }

            }

            return result;
        }
        public bool EditDepartment(DepartmentAddEditModel entity)
        {
            bool result = false;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                var dept = ctx.Departments.Where(d => d.DepartmentID == entity.DepartmentID).SingleOrDefault<Department>();

                if (entity.Description == "" || entity.Description == null)
                {
                    entity.Description = " ";
                }

                dept.Contact = entity.Contact;
                dept.Description = entity.Description;
                dept.EffectiveYearQuarterBegin = entity.EffectiveYearQuarterBegin;
                dept.EffectiveYearQuarterEnd = entity.EffectiveYearQuarterEnd;
                dept.Name = entity.Name;
                dept.UrlFriendlyName = entity.UrlName;

                try
                {
                    ctx.SubmitChanges();
                    result = true;

                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to add Department: " + ex.Message);
                }

            }

            return result;
        }
        public bool RemoveMiscSortCodeEntry(int id)
        {
            bool result = false;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                DepartmentMiscSort item = ctx.DepartmentMiscSorts.Where(m => m.DepartmentMiscSortId == id).SingleOrDefault<DepartmentMiscSort>();

                try
                {
                    ctx.DepartmentMiscSorts.DeleteOnSubmit(item);

                    ctx.SubmitChanges();

                    result = true;

                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to remove Misc Sort Code: " + ex.Message);

                }

            }

            return result;
        }
 /// <summary>
 /// GetExcludedMiscSort - Returns a list of Included Misc Sort Codes from the 
 /// ClassSchedule database. This is used by the search process as an Inclusive filter.
 /// </summary>
 /// <returns>A String Array representing the list of Misc Sort Codes to use to filter the search./</returns>
 private string[] GetIncludedMiscSort(int deptId)
 {
     using (ScheduleDataContext ctx = new ScheduleDataContext())
     {
         return ctx.DepartmentMiscSorts.Where(e => e.DepartmentID == deptId && e.IncludeFilter == false).Select(e => e.MiscSortValue).ToArray<string>();
     }
 }
 /// <summary>
 /// DepartmentHasPrefixes - A function that determines whether a department has a 
 /// list of course prefixes, or whether it is a "virtual" department.
 /// </summary>
 /// <param name="deptId">An ID representing the unique ID (Primary Key) of the department</param>
 /// <returns>True if specified department has prefixes.</returns>
 private bool DepartmentHasPrefixes(int deptId)
 {
     using (ScheduleDataContext ctx = new ScheduleDataContext())
     {
         return (ctx.DepartmentPrefixes.Where(d => d.DepartmentID == deptId).Count() > 0);
     }
 }
        public List<DepartmentPrefixItem> GetDepartmentEditPrefixes(int id)
        {
            List<DepartmentPrefixItem> results = new List<DepartmentPrefixItem>();

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                //need to make this an object, so we can add the ID of the Prefix in case it needs to
                //be removed...
                var items = ctx.DepartmentPrefixes.Where(d => d.DepartmentID == id).OrderBy(d => d.Prefix).ToList<DepartmentPrefix>();

                foreach (var item in items)
                {
                    results.Add(new DepartmentPrefixItem
                    {
                        PrefixId = item.DepartmentPrefixID,
                        PrefixText = item.Prefix
                    });
                }

            }

            return results;
        }
        /// <summary>
        /// DepartmentHasSpecificCourses - Determines whether the specified department contains a
        /// specific list of courses. This can include departments that have course prefixes.
        /// </summary>
        /// <param name="deptId">An ID representing the unique ID (Primary Key) of the department</param>
        /// <returns>True if the specified department has specific courses.</returns>
        private bool DepartmentHasSpecificCourses(int deptId)
        {
            bool result = false;

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                result = (ctx.DepartmentCourses.Where(d=>d.DepartmentID == deptId).Count() > 0);
            }

            return result;
        }
        public List<DepartmentMiscSortItem> GetDepartmentMiscSortCodesToIncludeForEdit(int id)
        {
            List<DepartmentMiscSortItem> results = new List<DepartmentMiscSortItem>();

            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {
                //need to make this an object, so we can add the ID of the Prefix in case it needs to
                //be removed...
                var items = ctx.DepartmentMiscSorts.Where(d => d.DepartmentID == id && d.IncludeFilter == false).OrderBy(d => d.MiscSortValue).ToList<DepartmentMiscSort>();

                foreach (var item in items)
                {
                    results.Add(new DepartmentMiscSortItem
                    {
                         MiscSortId = item.DepartmentMiscSortId,
                         MiscSortText = item.MiscSortValue,
                         DepartmentId = item.DepartmentID
                    });
                }

            }

            return results;
        }
        public DepartmentPrefixItem GetDepartmentPrefixItem(int id)
        {
            using (ScheduleDataContext ctx = new ScheduleDataContext())
            {

                var item = ctx.DepartmentPrefixes.Where(d => d.DepartmentPrefixID == id).SingleOrDefault<DepartmentPrefix>();

                DepartmentPrefixItem result = new DepartmentPrefixItem();

                try
                {
                    result.DepartmentId = item.DepartmentID;
                    result.PrefixId = item.DepartmentPrefixID;
                    result.PrefixText = item.Prefix;
                }
                catch (Exception ex)
                {
                    throw new Exception("Unable to get Prefix: " + ex.Message);
                }

                return result;
            }
        }