/// <summary>
        /// Adds the given number of years to the current date and returns the new Jewish Date
        /// </summary>
        /// <param name="years"></param>
        /// <returns></returns>
        /// <remarks>If the current month is Adar Sheini and the new year is not a leap year, the month is set to Adar.
        /// If the current Day is the 30th of Cheshvan or Kislev and in the new year that month only has 29 days,
        /// the day is set to the 1st of the following month.
        /// </remarks>
        public JewishDate AddYears(int years)
        {
            int year  = this._year + years,
                month = this._month,
                day   = this._day;

            if (month == 13 && !JewishDateCalculations.IsJewishLeapYear(year))
            {
                month = 12;
            }
            else if (month == 8 && day == 30 && !JewishDateCalculations.IsLongCheshvan(year))
            {
                month = 9;
                day   = 1;
            }
            else if (month == 9 && day == 30 && JewishDateCalculations.IsShortKislev(year))
            {
                month = 10;
                day   = 1;
            }
            return(new JewishDate(year, month, day));
        }
        private Sedra(int year, bool inIsrael)
        {
            //If the last call is within the same year as this one, we reuse the data.
            //If memory is an issue, remove these next few lines
            if (_lastSedraCalculated != null && _lastSedraCalculated._year == year && _lastSedraCalculated._inIsrael == inIsrael)
            {
                this._firstSatInYear = _lastSedraCalculated._firstSatInYear;
                this._sedraArray     = _lastSedraCalculated._sedraArray;
                return;
            }

            //Save the data in case the next call is for the same year
            _lastSedraCalculated = this;

            bool      longCheshvon   = JewishDateCalculations.IsLongCheshvan(year);
            bool      shortKislev    = JewishDateCalculations.IsShortKislev(year);
            int       roshHashana    = JewishDateCalculations.GetAbsoluteFromJewishDate(year, 7, 1);
            DayOfWeek roshHashanaDOW = (DayOfWeek)Math.Abs(roshHashana % 7);
            YearType  yearType;

            if (longCheshvon && !shortKislev)
            {
                yearType = YearType.Complete;
            }
            else if (!longCheshvon && shortKislev)
            {
                yearType = YearType.Incomplete;
            }
            else
            {
                yearType = YearType.Regular;
            }

            this._year     = year;
            this._inIsrael = inIsrael;

            /* find and save the first shabbos on or after Rosh Hashana */
            this._firstSatInYear = GetDayOnOrBefore(6, roshHashana + 6);

            if (!JewishDateCalculations.IsJewishLeapYear(year))
            {
                switch (roshHashanaDOW)
                {
                case DayOfWeek.Saturday:
                    if (yearType == YearType.Incomplete)
                    {
                        this._sedraArray = shabbos_short;
                    }
                    else if (yearType == YearType.Complete)
                    {
                        this._sedraArray = shabbos_long;
                    }
                    break;

                case DayOfWeek.Monday:
                    if (yearType == YearType.Incomplete)
                    {
                        this._sedraArray = mon_short;
                    }
                    else if (yearType == YearType.Complete)
                    {
                        this._sedraArray = this._inIsrael ? mon_short : mon_long;
                    }
                    break;

                case DayOfWeek.Tuesday:
                    if (yearType == YearType.Regular)
                    {
                        this._sedraArray = this._inIsrael ? mon_short : mon_long;
                    }
                    break;

                case DayOfWeek.Thursday:
                    if (yearType == YearType.Regular)
                    {
                        this._sedraArray = this._inIsrael ? thu_normal_Israel : thu_normal;
                    }
                    else if (yearType == YearType.Complete)
                    {
                        this._sedraArray = thu_long;
                    }
                    break;

                default:
                    throw new Exception("improper sedra year type calculated.");
                }
            }
            else  /* leap year */
            {
                switch (roshHashanaDOW)
                {
                case DayOfWeek.Saturday:
                    if (yearType == YearType.Incomplete)
                    {
                        this._sedraArray = shabbos_short_leap;
                    }
                    else if (yearType == YearType.Complete)
                    {
                        this._sedraArray = this._inIsrael ? shabbos_short_leap : shabbos_long_leap;
                    }
                    break;

                case DayOfWeek.Monday:
                    if (yearType == YearType.Incomplete)
                    {
                        this._sedraArray = this._inIsrael ? mon_short_leap_Israel : mon_short_leap;
                    }
                    else if (yearType == YearType.Complete)
                    {
                        this._sedraArray = this._inIsrael ? mon_long_leap_Israel : mon_long_leap;
                    }
                    break;

                case DayOfWeek.Tuesday:
                    if (yearType == YearType.Regular)
                    {
                        this._sedraArray = this._inIsrael ? mon_long_leap_Israel : mon_long_leap;
                    }
                    break;

                case DayOfWeek.Thursday:
                    if (yearType == YearType.Incomplete)
                    {
                        this._sedraArray = thu_short_leap;
                    }
                    else if (yearType == YearType.Complete)
                    {
                        this._sedraArray = thu_long_leap;
                    }
                    break;

                default:
                    throw new Exception("improper sedra year type calculated.");
                }
            }
        }