UNPKG

@icap-ethiopia/esm-ethiohri-app

Version:
2,959 lines 103 kB
!(function ($) {
  "use strict";
  function Calendars() {
    (this.regionalOptions = []),
      (this.regionalOptions[""] = {
        invalidCalendar: "Calendar {0} not found",
        invalidDate: "Invalid {0} date",
        invalidMonth: "Invalid {0} month",
        invalidYear: "Invalid {0} year",
        differentCalendars: "Cannot mix {0} and {1} dates",
      }),
      (this.local = this.regionalOptions[""]),
      (this.calendars = {}),
      (this._localCals = {});
  }
  function CDate(calendar, year, month, day) {
    if (
      ((this._calendar = calendar),
      (this._year = year),
      (this._month = month),
      (this._day = day),
      0 === this._calendar._validateLevel &&
        !this._calendar.isValid(this._year, this._month, this._day))
    )
      throw (
        $.calendars.local.invalidDate ||
        $.calendars.regionalOptions[""].invalidDate
      ).replace(/\{0\}/, this._calendar.local.name);
  }
  function pad(value, length) {
    return (
      (value = "" + value), "000000".substring(0, length - value.length) + value
    );
  }
  function BaseCalendar() {
    this.shortYearCutoff = "+10";
  }
  function GregorianCalendar(language) {
    this.local = this.regionalOptions[language] || this.regionalOptions[""];
  }
  $.extend(Calendars.prototype, {
    instance: function (name, language) {
      (name = (name || "gregorian").toLowerCase()), (language = language || "");
      var cal = this._localCals[name + "-" + language];
      if (
        (!cal &&
          this.calendars[name] &&
          ((cal = new this.calendars[name](language)),
          (this._localCals[name + "-" + language] = cal)),
        !cal)
      )
        throw (
          this.local.invalidCalendar || this.regionalOptions[""].invalidCalendar
        ).replace(/\{0\}/, name);
      return cal;
    },
    newDate: function (year, month, day, calendar, language) {
      return (
        (calendar =
          ("undefined" != typeof year && null !== year && year.year
            ? year.calendar()
            : "string" == typeof calendar
            ? this.instance(calendar, language)
            : calendar) || this.instance()),
        calendar.newDate(year, month, day)
      );
    },
    substituteDigits: function (digits) {
      return function (value) {
        return (value + "").replace(/[0-9]/g, function (digit) {
          return digits[digit];
        });
      };
    },
    substituteChineseDigits: function (digits, powers) {
      return function (value) {
        for (var localNumber = "", power = 0; value > 0; ) {
          var units = value % 10;
          (localNumber =
            (0 === units ? "" : digits[units] + powers[power]) + localNumber),
            power++,
            (value = Math.floor(value / 10));
        }
        return (
          0 === localNumber.indexOf(digits[1] + powers[1]) &&
            (localNumber = localNumber.substr(1)),
          localNumber || digits[0]
        );
      };
    },
  }),
    $.extend(CDate.prototype, {
      newDate: function (year, month, day) {
        return this._calendar.newDate(
          "undefined" == typeof year || null === year ? this : year,
          month,
          day
        );
      },
      year: function (year) {
        return 0 === arguments.length ? this._year : this.set(year, "y");
      },
      month: function (month) {
        return 0 === arguments.length ? this._month : this.set(month, "m");
      },
      day: function (day) {
        return 0 === arguments.length ? this._day : this.set(day, "d");
      },
      date: function (year, month, day) {
        if (!this._calendar.isValid(year, month, day))
          throw (
            $.calendars.local.invalidDate ||
            $.calendars.regionalOptions[""].invalidDate
          ).replace(/\{0\}/, this._calendar.local.name);
        return (
          (this._year = year), (this._month = month), (this._day = day), this
        );
      },
      leapYear: function () {
        return this._calendar.leapYear(this);
      },
      epoch: function () {
        return this._calendar.epoch(this);
      },
      formatYear: function () {
        return this._calendar.formatYear(this);
      },
      monthOfYear: function () {
        return this._calendar.monthOfYear(this);
      },
      weekOfYear: function () {
        return this._calendar.weekOfYear(this);
      },
      daysInYear: function () {
        return this._calendar.daysInYear(this);
      },
      dayOfYear: function () {
        return this._calendar.dayOfYear(this);
      },
      daysInMonth: function () {
        return this._calendar.daysInMonth(this);
      },
      dayOfWeek: function () {
        return this._calendar.dayOfWeek(this);
      },
      weekDay: function () {
        return this._calendar.weekDay(this);
      },
      extraInfo: function () {
        return this._calendar.extraInfo(this);
      },
      add: function (offset, period) {
        return this._calendar.add(this, offset, period);
      },
      set: function (value, period) {
        return this._calendar.set(this, value, period);
      },
      compareTo: function (date) {
        if (this._calendar.name !== date._calendar.name)
          throw (
            $.calendars.local.differentCalendars ||
            $.calendars.regionalOptions[""].differentCalendars
          )
            .replace(/\{0\}/, this._calendar.local.name)
            .replace(/\{1\}/, date._calendar.local.name);
        var c =
          this._year !== date._year
            ? this._year - date._year
            : this._month !== date._month
            ? this.monthOfYear() - date.monthOfYear()
            : this._day - date._day;
        return 0 === c ? 0 : c < 0 ? -1 : 1;
      },
      calendar: function () {
        return this._calendar;
      },
      toJD: function () {
        return this._calendar.toJD(this);
      },
      fromJD: function (jd) {
        return this._calendar.fromJD(jd);
      },
      toJSDate: function () {
        return this._calendar.toJSDate(this);
      },
      fromJSDate: function (jsd) {
        return this._calendar.fromJSDate(jsd);
      },
      toString: function () {
        return (
          (this.year() < 0 ? "-" : "") +
          pad(Math.abs(this.year()), 4) +
          "-" +
          pad(this.month(), 2) +
          "-" +
          pad(this.day(), 2)
        );
      },
    }),
    $.extend(BaseCalendar.prototype, {
      _validateLevel: 0,
      newDate: function (year, month, day) {
        return "undefined" == typeof year || null === year
          ? this.today()
          : (year.year &&
              (this._validate(
                year,
                month,
                day,
                $.calendars.local.invalidDate ||
                  $.calendars.regionalOptions[""].invalidDate
              ),
              (day = year.day()),
              (month = year.month()),
              (year = year.year())),
            new CDate(this, year, month, day));
      },
      today: function () {
        return this.fromJSDate(new Date());
      },
      epoch: function (year) {
        var date = this._validate(
          year,
          this.minMonth,
          this.minDay,
          $.calendars.local.invalidYear ||
            $.calendars.regionalOptions[""].invalidYear
        );
        return date.year() < 0 ? this.local.epochs[0] : this.local.epochs[1];
      },
      formatYear: function (year) {
        var date = this._validate(
          year,
          this.minMonth,
          this.minDay,
          $.calendars.local.invalidYear ||
            $.calendars.regionalOptions[""].invalidYear
        );
        return (date.year() < 0 ? "-" : "") + pad(Math.abs(date.year()), 4);
      },
      monthsInYear: function (year) {
        return (
          this._validate(
            year,
            this.minMonth,
            this.minDay,
            $.calendars.local.invalidYear ||
              $.calendars.regionalOptions[""].invalidYear
          ),
          12
        );
      },
      monthOfYear: function (year, month) {
        var date = this._validate(
          year,
          month,
          this.minDay,
          $.calendars.local.invalidMonth ||
            $.calendars.regionalOptions[""].invalidMonth
        );
        return (
          ((date.month() + this.monthsInYear(date) - this.firstMonth) %
            this.monthsInYear(date)) +
          this.minMonth
        );
      },
      fromMonthOfYear: function (year, ord) {
        var m =
          ((ord + this.firstMonth - 2 * this.minMonth) %
            this.monthsInYear(year)) +
          this.minMonth;
        return (
          this._validate(
            year,
            m,
            this.minDay,
            $.calendars.local.invalidMonth ||
              $.calendars.regionalOptions[""].invalidMonth
          ),
          m
        );
      },
      daysInYear: function (year) {
        var date = this._validate(
          year,
          this.minMonth,
          this.minDay,
          $.calendars.local.invalidYear ||
            $.calendars.regionalOptions[""].invalidYear
        );
        return this.leapYear(date) ? 366 : 365;
      },
      dayOfYear: function (year, month, day) {
        var date = this._validate(
          year,
          month,
          day,
          $.calendars.local.invalidDate ||
            $.calendars.regionalOptions[""].invalidDate
        );
        return (
          date.toJD() -
          this.newDate(
            date.year(),
            this.fromMonthOfYear(date.year(), this.minMonth),
            this.minDay
          ).toJD() +
          1
        );
      },
      daysInWeek: function () {
        return 7;
      },
      dayOfWeek: function (year, month, day) {
        var date = this._validate(
          year,
          month,
          day,
          $.calendars.local.invalidDate ||
            $.calendars.regionalOptions[""].invalidDate
        );
        return (Math.floor(this.toJD(date)) + 2) % this.daysInWeek();
      },
      extraInfo: function (year, month, day) {
        return (
          this._validate(
            year,
            month,
            day,
            $.calendars.local.invalidDate ||
              $.calendars.regionalOptions[""].invalidDate
          ),
          {}
        );
      },
      add: function (date, offset, period) {
        return (
          this._validate(
            date,
            this.minMonth,
            this.minDay,
            $.calendars.local.invalidDate ||
              $.calendars.regionalOptions[""].invalidDate
          ),
          this._correctAdd(
            date,
            this._add(date, offset, period),
            offset,
            period
          )
        );
      },
      _add: function (date, offset, period) {
        this._validateLevel++;
        var d;
        if ("d" === period || "w" === period) {
          var jd =
            date.toJD() + offset * ("w" === period ? this.daysInWeek() : 1);
          return (
            (d = date.calendar().fromJD(jd)),
            this._validateLevel--,
            [d.year(), d.month(), d.day()]
          );
        }
        try {
          var y = date.year() + ("y" === period ? offset : 0),
            m = date.monthOfYear() + ("m" === period ? offset : 0);
          d = date.day();
          var resyncYearMonth = function (calendar) {
            for (; m < calendar.minMonth; )
              y--, (m += calendar.monthsInYear(y));
            for (
              var yearMonths = calendar.monthsInYear(y);
              m > yearMonths - 1 + calendar.minMonth;

            )
              y++, (m -= yearMonths), (yearMonths = calendar.monthsInYear(y));
          };
          "y" === period
            ? (date.month() !== this.fromMonthOfYear(y, m) &&
                (m = this.newDate(y, date.month(), this.minDay).monthOfYear()),
              (m = Math.min(m, this.monthsInYear(y))),
              (d = Math.min(
                d,
                this.daysInMonth(y, this.fromMonthOfYear(y, m))
              )))
            : "m" === period &&
              (resyncYearMonth(this),
              (d = Math.min(
                d,
                this.daysInMonth(y, this.fromMonthOfYear(y, m))
              )));
          var ymd = [y, this.fromMonthOfYear(y, m), d];
          return this._validateLevel--, ymd;
        } catch (e) {
          throw (this._validateLevel--, e);
        }
      },
      _correctAdd: function (date, ymd, offset, period) {
        if (
          !(
            this.hasYearZero ||
            ("y" !== period && "m" !== period) ||
            (0 !== ymd[0] && date.year() > 0 == ymd[0] > 0)
          )
        ) {
          var adj = {
              y: [1, 1, "y"],
              m: [1, this.monthsInYear(-1), "m"],
              w: [this.daysInWeek(), this.daysInYear(-1), "d"],
              d: [1, this.daysInYear(-1), "d"],
            }[period],
            dir = offset < 0 ? -1 : 1;
          ymd = this._add(date, offset * adj[0] + dir * adj[1], adj[2]);
        }
        return date.date(ymd[0], ymd[1], ymd[2]);
      },
      set: function (date, value, period) {
        this._validate(
          date,
          this.minMonth,
          this.minDay,
          $.calendars.local.invalidDate ||
            $.calendars.regionalOptions[""].invalidDate
        );
        var y = "y" === period ? value : date.year(),
          m = "m" === period ? value : date.month(),
          d = "d" === period ? value : date.day();
        return (
          ("y" !== period && "m" !== period) ||
            (d = Math.min(d, this.daysInMonth(y, m))),
          date.date(y, m, d)
        );
      },
      isValid: function (year, month, day) {
        this._validateLevel++;
        var valid = this.hasYearZero || 0 !== year;
        if (valid) {
          var date = this.newDate(year, month, this.minDay);
          valid =
            month >= this.minMonth &&
            month - this.minMonth < this.monthsInYear(date) &&
            day >= this.minDay &&
            day - this.minDay < this.daysInMonth(date);
        }
        return this._validateLevel--, valid;
      },
      toJSDate: function (year, month, day) {
        var date = this._validate(
          year,
          month,
          day,
          $.calendars.local.invalidDate ||
            $.calendars.regionalOptions[""].invalidDate
        );
        return $.calendars.instance().fromJD(this.toJD(date)).toJSDate();
      },
      fromJSDate: function (jsd) {
        return this.fromJD($.calendars.instance().fromJSDate(jsd).toJD());
      },
      _validate: function (year, month, day, error) {
        if (year.year) {
          if (0 === this._validateLevel && this.name !== year.calendar().name)
            throw (
              $.calendars.local.differentCalendars ||
              $.calendars.regionalOptions[""].differentCalendars
            )
              .replace(/\{0\}/, this.local.name)
              .replace(/\{1\}/, year.calendar().local.name);
          return year;
        }
        try {
          if (
            (this._validateLevel++,
            1 === this._validateLevel && !this.isValid(year, month, day))
          )
            throw error.replace(/\{0\}/, this.local.name);
          var date = this.newDate(year, month, day);
          return this._validateLevel--, date;
        } catch (e) {
          throw (this._validateLevel--, e);
        }
      },
    }),
    (GregorianCalendar.prototype = new BaseCalendar()),
    $.extend(GregorianCalendar.prototype, {
      name: "Gregorian",
      jdEpoch: 1721425.5,
      daysPerMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
      hasYearZero: !1,
      minMonth: 1,
      firstMonth: 1,
      minDay: 1,
      regionalOptions: {
        "": {
          name: "Gregorian",
          epochs: ["BCE", "CE"],
          monthNames: [
            "January",
            "February",
            "March",
            "April",
            "May",
            "June",
            "July",
            "August",
            "September",
            "October",
            "November",
            "December",
          ],
          monthNamesShort: [
            "Jan",
            "Feb",
            "Mar",
            "Apr",
            "May",
            "Jun",
            "Jul",
            "Aug",
            "Sep",
            "Oct",
            "Nov",
            "Dec",
          ],
          dayNames: [
            "Sunday",
            "Monday",
            "Tuesday",
            "Wednesday",
            "Thursday",
            "Friday",
            "Saturday",
          ],
          dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
          dayNamesMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
          digits: null,
          dateFormat: "mm/dd/yyyy",
          firstDay: 0,
          isRTL: !1,
        },
      },
      leapYear: function (year) {
        var date = this._validate(
          year,
          this.minMonth,
          this.minDay,
          $.calendars.local.invalidYear ||
            $.calendars.regionalOptions[""].invalidYear
        );
        return (
          (year = date.year() + (date.year() < 0 ? 1 : 0)),
          year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)
        );
      },
      weekOfYear: function (year, month, day) {
        var checkDate = this.newDate(year, month, day);
        return (
          checkDate.add(4 - (checkDate.dayOfWeek() || 7), "d"),
          Math.floor((checkDate.dayOfYear() - 1) / 7) + 1
        );
      },
      daysInMonth: function (year, month) {
        var date = this._validate(
          year,
          month,
          this.minDay,
          $.calendars.local.invalidMonth ||
            $.calendars.regionalOptions[""].invalidMonth
        );
        return (
          this.daysPerMonth[date.month() - 1] +
          (2 === date.month() && this.leapYear(date.year()) ? 1 : 0)
        );
      },
      weekDay: function (year, month, day) {
        return (this.dayOfWeek(year, month, day) || 7) < 6;
      },
      toJD: function (year, month, day) {
        var date = this._validate(
          year,
          month,
          day,
          $.calendars.local.invalidDate ||
            $.calendars.regionalOptions[""].invalidDate
        );
        (year = date.year()),
          (month = date.month()),
          (day = date.day()),
          year < 0 && year++,
          month < 3 && ((month += 12), year--);
        var a = Math.floor(year / 100),
          b = 2 - a + Math.floor(a / 4);
        return (
          Math.floor(365.25 * (year + 4716)) +
          Math.floor(30.6001 * (month + 1)) +
          day +
          b -
          1524.5
        );
      },
      fromJD: function (jd) {
        var z = Math.floor(jd + 0.5),
          a = Math.floor((z - 1867216.25) / 36524.25);
        a = z + 1 + a - Math.floor(a / 4);
        var b = a + 1524,
          c = Math.floor((b - 122.1) / 365.25),
          d = Math.floor(365.25 * c),
          e = Math.floor((b - d) / 30.6001),
          day = b - d - Math.floor(30.6001 * e),
          month = e - (e > 13.5 ? 13 : 1),
          year = c - (month > 2.5 ? 4716 : 4715);
        return year <= 0 && year--, this.newDate(year, month, day);
      },
      toJSDate: function (year, month, day) {
        var date = this._validate(
            year,
            month,
            day,
            $.calendars.local.invalidDate ||
              $.calendars.regionalOptions[""].invalidDate
          ),
          jsd = new Date(date.year(), date.month() - 1, date.day());
        return (
          jsd.setHours(0),
          jsd.setMinutes(0),
          jsd.setSeconds(0),
          jsd.setMilliseconds(0),
          jsd.setHours(jsd.getHours() > 12 ? jsd.getHours() + 2 : 0),
          jsd
        );
      },
      fromJSDate: function (jsd) {
        return this.newDate(
          jsd.getFullYear(),
          jsd.getMonth() + 1,
          jsd.getDate()
        );
      },
    }),
    ($.calendars = new Calendars()),
    ($.calendars.cdate = CDate),
    ($.calendars.baseCalendar = BaseCalendar),
    ($.calendars.calendars.gregorian = GregorianCalendar);
})(jQuery),
  (function ($) {
    "use strict";
    $.extend($.calendars.regionalOptions[""], {
      invalidArguments: "Invalid arguments",
      invalidFormat: "Cannot format a date from another calendar",
      missingNumberAt: "Missing number at position {0}",
      unknownNameAt: "Unknown name at position {0}",
      unexpectedLiteralAt: "Unexpected literal at position {0}",
      unexpectedText: "Additional text found at end",
    }),
      ($.calendars.local = $.calendars.regionalOptions[""]),
      $.extend($.calendars.cdate.prototype, {
        formatDate: function (format, settings) {
          return (
            "string" != typeof format && ((settings = format), (format = "")),
            this._calendar.formatDate(format || "", this, settings)
          );
        },
      }),
      $.extend($.calendars.baseCalendar.prototype, {
        UNIX_EPOCH: $.calendars.instance().newDate(1970, 1, 1).toJD(),
        SECS_PER_DAY: 86400,
        TICKS_EPOCH: $.calendars.instance().jdEpoch,
        TICKS_PER_DAY: 864e9,
        ATOM: "yyyy-mm-dd",
        COOKIE: "D, dd M yyyy",
        FULL: "DD, MM d, yyyy",
        ISO_8601: "yyyy-mm-dd",
        JULIAN: "J",
        RFC_822: "D, d M yy",
        RFC_850: "DD, dd-M-yy",
        RFC_1036: "D, d M yy",
        RFC_1123: "D, d M yyyy",
        RFC_2822: "D, d M yyyy",
        RSS: "D, d M yy",
        TICKS: "!",
        TIMESTAMP: "@",
        W3C: "yyyy-mm-dd",
        formatDate: function (format, date, settings) {
          if (
            ("string" != typeof format &&
              ((settings = date), (date = format), (format = "")),
            !date)
          )
            return "";
          if (date.calendar() !== this)
            throw (
              $.calendars.local.invalidFormat ||
              $.calendars.regionalOptions[""].invalidFormat
            );
          (format = format || this.local.dateFormat),
            (settings = settings || {});
          for (
            var dayNamesShort =
                settings.dayNamesShort || this.local.dayNamesShort,
              dayNames = settings.dayNames || this.local.dayNames,
              monthNamesShort =
                settings.monthNamesShort || this.local.monthNamesShort,
              monthNames = settings.monthNames || this.local.monthNames,
              localNumbers = settings.localNumbers || this.local.localNumbers,
              doubled = function (match, step) {
                for (
                  var matches = 1;
                  iFormat + matches < format.length &&
                  format.charAt(iFormat + matches) === match;

                )
                  matches++;
                return (
                  (iFormat += matches - 1),
                  Math.floor(matches / (step || 1)) > 1
                );
              },
              formatNumber = function (match, value, len, step) {
                var num = "" + value;
                if (doubled(match, step))
                  for (; num.length < len; ) num = "0" + num;
                return num;
              },
              formatName = function (match, value, shortNames, longNames) {
                return doubled(match) ? longNames[value] : shortNames[value];
              },
              localiseNumbers =
                localNumbers && this.local.digits
                  ? this.local.digits
                  : function (value) {
                      return value;
                    },
              output = "",
              literal = !1,
              iFormat = 0;
            iFormat < format.length;
            iFormat++
          )
            if (literal)
              "'" !== format.charAt(iFormat) || doubled("'")
                ? (output += format.charAt(iFormat))
                : (literal = !1);
            else
              switch (format.charAt(iFormat)) {
                case "d":
                  output += localiseNumbers(formatNumber("d", date.day(), 2));
                  break;
                case "D":
                  output += formatName(
                    "D",
                    date.dayOfWeek(),
                    dayNamesShort,
                    dayNames
                  );
                  break;
                case "o":
                  output += formatNumber("o", date.dayOfYear(), 3);
                  break;
                case "w":
                  output += formatNumber("w", date.weekOfYear(), 2);
                  break;
                case "m":
                  output += localiseNumbers(formatNumber("m", date.month(), 2));
                  break;
                case "M":
                  output += formatName(
                    "M",
                    date.month() - this.minMonth,
                    monthNamesShort,
                    monthNames
                  );
                  break;
                case "y":
                  output += localiseNumbers(
                    doubled("y", 2)
                      ? date.year()
                      : (date.year() % 100 < 10 ? "0" : "") +
                          (date.year() % 100)
                  );
                  break;
                case "Y":
                  doubled("Y", 2), (output += date.formatYear());
                  break;
                case "J":
                  output += date.toJD();
                  break;
                case "@":
                  output += (date.toJD() - this.UNIX_EPOCH) * this.SECS_PER_DAY;
                  break;
                case "!":
                  output +=
                    (date.toJD() - this.TICKS_EPOCH) * this.TICKS_PER_DAY;
                  break;
                case "'":
                  doubled("'") ? (output += "'") : (literal = !0);
                  break;
                default:
                  output += format.charAt(iFormat);
              }
          return output;
        },
        parseDate: function (format, value, settings) {
          if ("undefined" == typeof value || null === value)
            throw (
              $.calendars.local.invalidArguments ||
              $.calendars.regionalOptions[""].invalidArguments
            );
          if (
            ((value = "object" == typeof value ? value.toString() : value + ""),
            "" === value)
          )
            return null;
          (format = format || this.local.dateFormat),
            (settings = settings || {});
          var shortYearCutoff =
            settings.shortYearCutoff || this.shortYearCutoff;
          shortYearCutoff =
            "string" != typeof shortYearCutoff
              ? shortYearCutoff
              : (this.today().year() % 100) + parseInt(shortYearCutoff, 10);
          for (
            var dayNamesShort =
                settings.dayNamesShort || this.local.dayNamesShort,
              dayNames = settings.dayNames || this.local.dayNames,
              monthNamesShort =
                settings.monthNamesShort || this.local.monthNamesShort,
              monthNames = settings.monthNames || this.local.monthNames,
              jd = -1,
              year = -1,
              month = -1,
              day = -1,
              doy = -1,
              shortYear = !1,
              literal = !1,
              doubled = function (match, step) {
                for (
                  var matches = 1;
                  iFormat + matches < format.length &&
                  format.charAt(iFormat + matches) === match;

                )
                  matches++;
                return (
                  (iFormat += matches - 1),
                  Math.floor(matches / (step || 1)) > 1
                );
              },
              getNumber = function (match, step) {
                var isDoubled = doubled(match, step),
                  size = [
                    2,
                    3,
                    isDoubled ? 4 : 2,
                    isDoubled ? 4 : 2,
                    10,
                    11,
                    20,
                  ]["oyYJ@!".indexOf(match) + 1],
                  digits = new RegExp("^-?\\d{1," + size + "}"),
                  num = value.substring(iValue).match(digits);
                if (!num)
                  throw (
                    $.calendars.local.missingNumberAt ||
                    $.calendars.regionalOptions[""].missingNumberAt
                  ).replace(/\{0\}/, iValue);
                return (iValue += num[0].length), parseInt(num[0], 10);
              },
              calendar = this,
              getName = function (match, shortNames, longNames, step) {
                for (
                  var names = doubled(match, step) ? longNames : shortNames,
                    i = 0;
                  i < names.length;
                  i++
                )
                  if (
                    value.substr(iValue, names[i].length).toLowerCase() ===
                    names[i].toLowerCase()
                  )
                    return (iValue += names[i].length), i + calendar.minMonth;
                throw (
                  $.calendars.local.unknownNameAt ||
                  $.calendars.regionalOptions[""].unknownNameAt
                ).replace(/\{0\}/, iValue);
              },
              checkLiteral = function () {
                if (value.charAt(iValue) !== format.charAt(iFormat))
                  throw (
                    $.calendars.local.unexpectedLiteralAt ||
                    $.calendars.regionalOptions[""].unexpectedLiteralAt
                  ).replace(/\{0\}/, iValue);
                iValue++;
              },
              iValue = 0,
              iFormat = 0;
            iFormat < format.length;
            iFormat++
          )
            if (literal)
              "'" !== format.charAt(iFormat) || doubled("'")
                ? checkLiteral()
                : (literal = !1);
            else
              switch (format.charAt(iFormat)) {
                case "d":
                  day = getNumber("d");
                  break;
                case "D":
                  getName("D", dayNamesShort, dayNames);
                  break;
                case "o":
                  doy = getNumber("o");
                  break;
                case "w":
                  getNumber("w");
                  break;
                case "m":
                  month = getNumber("m");
                  break;
                case "M":
                  month = getName("M", monthNamesShort, monthNames);
                  break;
                case "y":
                  var iSave = iFormat;
                  (shortYear = !doubled("y", 2)),
                    (iFormat = iSave),
                    (year = getNumber("y", 2));
                  break;
                case "Y":
                  year = getNumber("Y", 2);
                  break;
                case "J":
                  (jd = getNumber("J") + 0.5),
                    "." === value.charAt(iValue) && (iValue++, getNumber("J"));
                  break;
                case "@":
                  jd = getNumber("@") / this.SECS_PER_DAY + this.UNIX_EPOCH;
                  break;
                case "!":
                  jd = getNumber("!") / this.TICKS_PER_DAY + this.TICKS_EPOCH;
                  break;
                case "*":
                  iValue = value.length;
                  break;
                case "'":
                  doubled("'") ? checkLiteral() : (literal = !0);
                  break;
                default:
                  checkLiteral();
              }
          if (iValue < value.length)
            throw (
              $.calendars.local.unexpectedText ||
              $.calendars.regionalOptions[""].unexpectedText
            );
          if (
            (year === -1
              ? (year = this.today().year())
              : year < 100 &&
                shortYear &&
                (year +=
                  shortYearCutoff === -1
                    ? 1900
                    : this.today().year() -
                      (this.today().year() % 100) -
                      (year <= shortYearCutoff ? 0 : 100)),
            doy > -1)
          ) {
            (month = 1), (day = doy);
            for (
              var dim = this.daysInMonth(year, month);
              day > dim;
              dim = this.daysInMonth(year, month)
            )
              month++, (day -= dim);
          }
          return jd > -1 ? this.fromJD(jd) : this.newDate(year, month, day);
        },
        determineDate: function (
          dateSpec,
          defaultDate,
          currentDate,
          dateFormat,
          settings
        ) {
          currentDate &&
            "object" != typeof currentDate &&
            ((settings = dateFormat),
            (dateFormat = currentDate),
            (currentDate = null)),
            "string" != typeof dateFormat &&
              ((settings = dateFormat), (dateFormat = ""));
          var calendar = this,
            offsetString = function (offset) {
              try {
                return calendar.parseDate(dateFormat, offset, settings);
              } catch (e) {}
              offset = offset.toLowerCase();
              for (
                var date =
                    (offset.match(/^c/) && currentDate
                      ? currentDate.newDate()
                      : null) || calendar.today(),
                  pattern = /([+-]?[0-9]+)\s*(d|w|m|y)?/g,
                  matches = pattern.exec(offset);
                matches;

              )
                date.add(parseInt(matches[1], 10), matches[2] || "d"),
                  (matches = pattern.exec(offset));
              return date;
            };
          return (
            (defaultDate = defaultDate ? defaultDate.newDate() : null),
            (dateSpec =
              "undefined" == typeof dateSpec || null === dateSpec
                ? defaultDate
                : "string" == typeof dateSpec
                ? offsetString(dateSpec)
                : "number" == typeof dateSpec
                ? isNaN(dateSpec) || dateSpec === 1 / 0 || dateSpec === -(1 / 0)
                  ? defaultDate
                  : calendar.today().add(dateSpec, "d")
                : calendar.newDate(dateSpec))
          );
        },
      });
  })(jQuery),
  (function ($) {
    "use strict";
    var pluginName = "calendarsPicker";
    $.JQPlugin.createPlugin({
      name: pluginName,
      defaultRenderer: {
        picker:
          '<div class="calendars"><div class="calendars-nav">{link:prev}{link:today}{link:next}</div>{months}{popup:start}<div class="calendars-ctrl">{link:clear}{link:close}</div>{popup:end}<div class="calendars-clear-fix"></div></div>',
        monthRow: '<div class="calendars-month-row">{months}</div>',
        month:
          '<div class="calendars-month"><div class="calendars-month-header">{monthHeader}</div><table><thead>{weekHeader}</thead><tbody>{weeks}</tbody></table></div>',
        weekHeader: "<tr>{days}</tr>",
        dayHeader: "<th>{day}</th>",
        week: "<tr>{days}</tr>",
        day: "<td>{day}</td>",
        monthSelector: ".calendars-month",
        daySelector: "td",
        rtlClass: "calendars-rtl",
        multiClass: "calendars-multi",
        defaultClass: "",
        selectedClass: "calendars-selected",
        highlightedClass: "calendars-highlight",
        todayClass: "calendars-today",
        otherMonthClass: "calendars-other-month",
        weekendClass: "calendars-weekend",
        commandClass: "calendars-cmd",
        commandButtonClass: "",
        commandLinkClass: "",
        disabledClass: "calendars-disabled",
      },
      commands: {
        prev: {
          text: "prevText",
          status: "prevStatus",
          keystroke: { keyCode: 33 },
          enabled: function (inst) {
            var minDate = inst.curMinDate();
            return (
              !minDate ||
              inst.drawDate
                .newDate()
                .add(
                  1 - inst.options.monthsToStep - inst.options.monthsOffset,
                  "m"
                )
                .day(inst.options.calendar.minDay)
                .add(-1, "d")
                .compareTo(minDate) !== -1
            );
          },
          date: function (inst) {
            return inst.drawDate
              .newDate()
              .add(-inst.options.monthsToStep - inst.options.monthsOffset, "m")
              .day(inst.options.calendar.minDay);
          },
          action: function (inst) {
            plugin.changeMonth(this, -inst.options.monthsToStep);
          },
        },
        prevJump: {
          text: "prevJumpText",
          status: "prevJumpStatus",
          keystroke: { keyCode: 33, ctrlKey: !0 },
          enabled: function (inst) {
            var minDate = inst.curMinDate();
            return (
              !minDate ||
              inst.drawDate
                .newDate()
                .add(
                  1 - inst.options.monthsToJump - inst.options.monthsOffset,
                  "m"
                )
                .day(inst.options.calendar.minDay)
                .add(-1, "d")
                .compareTo(minDate) !== -1
            );
          },
          date: function (inst) {
            return inst.drawDate
              .newDate()
              .add(-inst.options.monthsToJump - inst.options.monthsOffset, "m")
              .day(inst.options.calendar.minDay);
          },
          action: function (inst) {
            plugin.changeMonth(this, -inst.options.monthsToJump);
          },
        },
        next: {
          text: "nextText",
          status: "nextStatus",
          keystroke: { keyCode: 34 },
          enabled: function (inst) {
            var maxDate = inst.get("maxDate");
            return (
              !maxDate ||
              1 !==
                inst.drawDate
                  .newDate()
                  .add(
                    inst.options.monthsToStep - inst.options.monthsOffset,
                    "m"
                  )
                  .day(inst.options.calendar.minDay)
                  .compareTo(maxDate)
            );
          },
          date: function (inst) {
            return inst.drawDate
              .newDate()
              .add(inst.options.monthsToStep - inst.options.monthsOffset, "m")
              .day(inst.options.calendar.minDay);
          },
          action: function (inst) {
            plugin.changeMonth(this, inst.options.monthsToStep);
          },
        },
        nextJump: {
          text: "nextJumpText",
          status: "nextJumpStatus",
          keystroke: { keyCode: 34, ctrlKey: !0 },
          enabled: function (inst) {
            var maxDate = inst.get("maxDate");
            return (
              !maxDate ||
              1 !==
                inst.drawDate
                  .newDate()
                  .add(
                    inst.options.monthsToJump - inst.options.monthsOffset,
                    "m"
                  )
                  .day(inst.options.calendar.minDay)
                  .compareTo(maxDate)
            );
          },
          date: function (inst) {
            return inst.drawDate
              .newDate()
              .add(inst.options.monthsToJump - inst.options.monthsOffset, "m")
              .day(inst.options.calendar.minDay);
          },
          action: function (inst) {
            plugin.changeMonth(this, inst.options.monthsToJump);
          },
        },
        current: {
          text: "currentText",
          status: "currentStatus",
          keystroke: { keyCode: 36, ctrlKey: !0 },
          enabled: function (inst) {
            var minDate = inst.curMinDate(),
              maxDate = inst.get("maxDate"),
              curDate = inst.selectedDates[0] || inst.options.calendar.today();
            return !(
              (minDate && curDate.compareTo(minDate) === -1) ||
              (maxDate && 1 === curDate.compareTo(maxDate))
            );
          },
          date: function (inst) {
            return inst.selectedDates[0] || inst.options.calendar.today();
          },
          action: function (inst) {
            var curDate =
              inst.selectedDates[0] || inst.options.calendar.today();
            plugin.showMonth(this, curDate.year(), curDate.month());
          },
        },
        today: {
          text: "todayText",
          status: "todayStatus",
          keystroke: { keyCode: 36, ctrlKey: !0 },
          enabled: function (inst) {
            var minDate = inst.curMinDate(),
              maxDate = inst.get("maxDate");
            return !(
              (minDate &&
                inst.options.calendar.today().compareTo(minDate) === -1) ||
              (maxDate &&
                1 === inst.options.calendar.today().compareTo(maxDate))
            );
          },
          date: function (inst) {
            return inst.options.calendar.today();
          },
          action: function () {
            plugin.showMonth(this);
          },
        },
        clear: {
          text: "clearText",
          status: "clearStatus",
          keystroke: { keyCode: 35, ctrlKey: !0 },
          enabled: function () {
            return !0;
          },
          date: function () {
            return null;
          },
          action: function () {
            plugin.clear(this);
          },
        },
        close: {
          text: "closeText",
          status: "closeStatus",
          keystroke: { keyCode: 27 },
          enabled: function () {
            return !0;
          },
          date: function () {
            return null;
          },
          action: function () {
            plugin.hide(this);
          },
        },
        prevWeek: {
          text: "prevWeekText",
          status: "prevWeekStatus",
          keystroke: { keyCode: 38, ctrlKey: !0 },
          enabled: function (inst) {
            var minDate = inst.curMinDate();
            return (
              !minDate ||
              inst.drawDate
                .newDate()
                .add(-inst.options.calendar.daysInWeek(), "d")
                .compareTo(minDate) !== -1
            );
          },
          date: function (inst) {
            return inst.drawDate
              .newDate()
              .add(-inst.options.calendar.daysInWeek(), "d");
          },
          action: function (inst) {
            plugin.changeDay(this, -inst.options.calendar.daysInWeek());
          },
        },
        prevDay: {
          text: "prevDayText",
          status: "prevDayStatus",
          keystroke: { keyCode: 37, ctrlKey: !0 },
          enabled: function (inst) {
            var minDate = inst.curMinDate();
            return (
              !minDate ||
              inst.drawDate.newDate().add(-1, "d").compareTo(minDate) !== -1
            );
          },
          date: function (inst) {
            return inst.drawDate.newDate().add(-1, "d");
          },
          action: function () {
            plugin.changeDay(this, -1);
          },
        },
        nextDay: {
          text: "nextDayText",
          status: "nextDayStatus",
          keystroke: { keyCode: 39, ctrlKey: !0 },
          enabled: function (inst) {
            var maxDate = inst.get("maxDate");
            return (
              !maxDate ||
              1 !== inst.drawDate.newDate().add(1, "d").compareTo(maxDate)
            );
          },
          date: function (inst) {
            return inst.drawDate.newDate().add(1, "d");
          },
          action: function () {
            plugin.changeDay(this, 1);
          },
        },
        nextWeek: {
          text: "nextWeekText",
          status: "nextWeekStatus",
          keystroke: { keyCode: 40, ctrlKey: !0 },
          enabled: function (inst) {
            var maxDate = inst.get("maxDate");
            return (
              !maxDate ||
              1 !==
                inst.drawDate
                  .newDate()
                  .add(inst.options.calendar.daysInWeek(), "d")
                  .compareTo(maxDate)
            );
          },
          date: function (inst) {
            return inst.drawDate
              .newDate()
              .add(inst.options.calendar.daysInWeek(), "d");
          },
          action: function (inst) {
            plugin.changeDay(this, inst.options.calendar.daysInWeek());
          },
        },
      },
      defaultOptions: {
        calendar: $.calendars.instance(),
        pickerClass: "",
        showOnFocus: !0,
        showTrigger: null,
        showAnim: "show",
        showOptions: {},
        showSpeed: "normal",
        popupContainer: null,
        alignment: "bottom",
        fixedWeeks: !1,
        firstDay: null,
        calculateWeek: null,
        localNumbers: !1,
        monthsToShow: 1,
        monthsOffset: 0,
        monthsToStep: 1,
        monthsToJump: 12,
        useMouseWheel: !0,
        changeMonth: !0,
        yearRange: "c-10:c+10",
        showOtherMonths: !1,
        selectOtherMonths: !1,
        defaultDate: null,
        selectDefaultDate: !1,
        minDate: null,
        maxDate: null,
        dateFormat: null,
        autoSize: !1,
        rangeSelect: !1,
        rangeSeparator: " - ",
        multiSelect: 0,
        multiSeparator: ",",
        onDate: null,
        onShow: null,
        onChangeMonthYear: null,
        onSelect: null,
        onClose: null,
        altField: null,
        altFormat: null,
        constrainInput: !0,
        commandsAsDateFormat: !1,
        commands: {},
        holidays: null,
      },
      regionalOptions: {
        "": {
          renderer: {},
          prevText: "&lt;",
          prevStatus: "Show the previous month",
          prevJumpText: "&lt;&lt;",
          prevJumpStatus: "Show the previous year",
          nextText: "&gt;",
          nextStatus: "Show the next month",
          nextJumpText: "&gt;&gt;",
          nextJumpStatus: "Show the next year",
          currentText: "Current",
          currentStatus: "Show the current month",
          todayText: "Today",
          todayStatus: "Show current month",
          clearText: "Clear",
          clearStatus: "Clear all the dates",
          closeText: "Close",
          closeStatus: "Close the datepicker",
          yearStatus: "Change the year",
          earlierText: "&#160;&#160;▲",
          laterText: "&#160;&#160;▼",
          monthStatus: "Change the month",
          weekText: "Wk",
          weekStatus: "Week of the year",
          dayStatus: "Select DD, M d, yyyy",
          defaultStatus: "Select a date",
          isRTL: !1,
        },
      },
      _disabled: [],
      _popupClass: "calendars-popup",
      _triggerClass: "calendars-trigger",
      _disableClass: "calendars-disable",
      _monthYearClass: "calendars-month-year",
      _curMonthClass: "calendars-month-",
      _anyYearClass: "calendars-any-year",
      _curDoWClass: "calendars-dow-",
      _init: function () {
        (this.defaultOptions.commands = this.commands),
          (this.regionalOptions[""].renderer = this.defaultRenderer),
          this._super();
      },
      _instSettings: function (elem, options) {
        return {
          selectedDates: [],
          drawDate: null,
          pickingRange: !1,
          inline:
            $.inArray(elem[0].nodeName.toLowerCase(), ["div", "span"]) > -1,
          get: function (name) {
            return $.inArray(name, ["defaultDate", "minDate", "maxDate"]) > -1
              ? this.options.calendar.determineDate(
                  this.options[name],
                  null,
                  this.selectedDates[0],
                  this.get("dateFormat"),
                  this.getConfig()
                )
              : "dateFormat" === name
              ? this.options.dateFormat ||
                this.options.calendar.local.dateFormat
              : this.options[name];
          },
          curMinDate: function () {
            return this.pickingRange
              ? this.selectedDates[0]
              : this.get("minDate");
          },
          getConfig: function () {
            return {
              dayNamesShort: this.options.dayNamesShort,
              dayNames: this.options.dayNames,
              monthNamesShort: this.options.monthNamesShort,
              monthNames: this.options.monthNames,
              calculateWeek: this.options.calculateWeek,
              shortYearCutoff: this.options.shortYearCutoff,
            };
          },
        };
      },
      _postAttach: function (elem, inst) {
        inst.inline
          ? ((inst.drawDate = plugin._checkMinMax(
              (
                inst.selectedDates[0] ||
                inst.get("defaultDate") ||
                inst.options.calendar.today()
              ).newDate(),
              inst
            )),
            (inst.prevDate = inst.drawDate.newDate()),
            this._update(elem[0]),
            $.fn.mousewheel && elem.mousewheel(this._doMouseWheel))
          : (this._attachments(elem, inst),
            elem
              .on("keydown." + inst.name, this._keyDown)
              .on("keypress." + inst.name, this._keyPress)
              .on("keyup." + inst.name, this._keyUp),
            elem.attr("disabled") && this.disable(elem[0]));
      },
      _optionsChanged: function (elem, inst, options) {
        if (options.calendar && options.calendar !== inst.options.calendar) {
          var discardDate = function (name) {
            return "object" == typeof inst.options[name]
              ? null
              : inst.options[name];
          };
          (options = $.extend(
            {
              defaultDate: discardDate("defaultDate"),
              minDate: discardDate("minDate"),
              maxDate: discardDate("maxDate"),
            },
            options
          )),
            (inst.selectedDates = []),
            (inst.drawDate = null);
        }
        var dates = inst.selectedDates;
        $.extend(inst.options, options),
          this.setDate(elem[0], dates, null, !1, !0),
          (inst.pickingRange = !1);
        var calendar = inst.options.calendar,
          defaultDate = inst.get("defaultDate");
        (inst.drawDate = this._checkMinMax(
          (defaultDate ? defaultDate : inst.drawDate) ||
            defaultDate ||
            calendar.today(),
          inst
        ).newDate()),
          inst.inline || this._attachments(elem, inst),
          (inst.inline || inst.div) && this._update(elem[0]);
      },
      _attachments: function (elem, inst) {
        elem.off("focus." + inst.name),
          inst.options.showOnFocus && elem.on("focus." + inst.name, this.show),
          inst.trigger && inst.trigger.remove();
        var trigger = inst.options.showTrigger;
        (inst.trigger = trigger
          ? $(trigger)
              .clone()
              .removeAttr("id")
              .addClass(this._triggerClass)
              [inst.options.isRTL ? "insertBefore" : "insertAfter"](elem)
              .click(function () {
                plugin.isDisabled(elem[0]) ||
                  plugin[plugin.curInst === inst ? "hide" : "show"](elem[0]);
              })
          : $([])),
          this._autoSize(elem, inst);
        var dates = this._extractDates(inst, elem.val());
        dates && this.setDate(elem[0], dates, null, !0);
        var defaultDate = inst.get("defaultDate");
        inst.options.selectDefaultDate &&
          defaultDate &&
          0 === inst.selectedDates.length &&
          this.setDate(
            elem[0],
            (defaultDate || inst.options.calendar.today()).newDate()
          );
      },
      _autoSize: function (elem, inst) {
        if (inst.options.autoSize && !inst.inline) {
          var calendar = inst.options.calendar,
            date = calendar.newDate(2009, 10, 20),
            dateFormat = inst.get("dateFormat");
          if (dateFormat.match(/[DM]/)) {
            var findMax = function (names) {
              for (var max = 0, maxI = 0, i = 0; i < names.length; i++)
                names[i].length > max && ((max = names[i].length), (maxI = i));
              return maxI;
            };
            date.month(
              findMax(
                calendar.local[
                  dateFormat.match(/MM/) ? "monthNames" : "monthNamesShort"
                ]
              ) + 1
            ),
              date.day(
                findMax(
                  calendar.local[
                    dateFormat.match(/DD/) ? "dayNames" : "dayNamesShort"
                  ]
                ) +
                  20 -
                  date.dayOfWeek()
              );
          }
          inst.elem.attr(
            "size",
            date.formatDate(dateFormat, {
              localNumbers: inst.options.localnumbers,
            }).length
          );
        }
      },
      _preDestroy: function (elem, inst) {
        inst.trigger && inst.trigger.remove(),
          elem.empty().off("." + inst.name),
          inst.inline && $.fn.mousewheel && elem.unmousewheel(),
          !inst.inline && inst.options.autoSize && elem.removeAttr("size");
      },
      multipleEvents: function (fns) {
        var funcs = arguments;
        return function () {
          for (var i = 0; i < funcs.length; i++)
            funcs[i].apply(this, arguments);
        };
      },
      enable: function (elem) {
        if (((elem = $(elem)), elem.hasClass(this._getMarker()))) {
          var inst = this._getInst(elem);
          inst.inline
            ? elem
                .children("." + this._disableClass)
                .remove()
                .end()
                .find("button,select")
                .prop("disabled", !1)
                .end()
                .find("a")
                .attr("href", "#")
            : (elem.prop("disabled", !1),
              inst.trigger
                .filter("button." + this._triggerClass)
                .prop("disabled", !1)
                .end()
                .filter("img." + this._triggerClass)
                .css({
                  opacity: "1.0",
                  cursor: "",
                })),
            (this._disabled = $.map(this._disabled, function (value) {
              return value === elem[0] ? null : value;
            }));
        }
      },
      disable: function (elem) {
        if (((elem = $(elem)), elem.hasClass(this._getMarker()))) {
          var inst = this._getInst(elem);
          if (inst.inline) {
            var inline = elem.children(":last"),
              offset = inline.offset(),
              relOffset = { left: 0, top: 0 };
            inline.parents().each(function () {
              if ("relative" === $(this).css("position"))
                return (relOffset = $(this).offset()), !1;
            });
            var zIndex = elem.css("zIndex");
            (zIndex = ("auto" === zIndex ? 0 : parseInt(zIndex, 10)) + 1),
              elem
                .prepend(
                  '<div class="' +
                    this._disableClass +
                    '" style="width: ' +
                    inline.outerWidth() +
                    "px; height: " +
                    inline.outerHeight() +
                    "px; left: " +
                    (offset.left - relOffset.left) +
                    "px; top: " +
                    (offset.top - relOffset.top) +
                    "px; z-index: " +
                    zIndex +
                    '"></div>'
                )
                .find("button,select")
                .prop("disabled", !0)
                .end()
                .find("a")
                .removeAttr("href");
          } else
            elem.prop("disabled", !0),
              inst.trigger
                .filter("button." + this._triggerClass)
                .prop("disabled", !0)
                .end()
                .filter("img." + this._triggerClass)
                .css({ opacity: "0.5", cursor: "default" });
          (this._disabled = $.map(this._disabled, function (value) {
            return value === elem[0] ? null : value;
          })),
            this._disabled.push(elem[0]);
        }
      },
      isDisabled: function (elem) {
        return elem && $.inArray(elem, this._disabled) > -1;
      },
      show: function (elem) {
        elem = $(elem.target || elem);
        var inst = plugin._getInst(elem);
        if (
          plugin.curInst !== inst &&
          (plugin.curInst && plugin.hide(plugin.curInst, !0),
          !$.isEmptyObject(inst))
        ) {
          (inst.lastVal = null),
            (inst.selectedDates = plugin._extractDates(inst, elem.val())),
            (inst.pickingRange = !1),
            (inst.drawDate = plugin._checkMinMax(
              (
                inst.selectedDates[0] ||
                inst.get("defaultDate") ||
                inst.options.calendar.today()
              ).newDate(),
              inst
            )),
            (inst.prevDate = inst.drawDate.newDate()),
            (plugin.curInst = inst),
            plugin._update(elem[0], !0);
          var offset = plugin._checkOffset(inst);
          inst.div.css({ left: offset.left, top: offset.top });
          var showAnim = inst.options.showAnim,
            showSpeed = inst.options.showSpeed;
          if (
            ((showSpeed =
              "normal" === showSpeed &&
              $.ui &&
              parseInt($.ui.version.substring(2)) >= 8
                ? "_default"
                : showSpeed),
            $.effects &&
              ($.effects[showAnim] ||
                ($.effects.effect && $.effects.effect[showAnim])))
          ) {
            var data = inst.div.data();
            for (var key in data)
              key.match(/^ec\.storage\./) &&
                (data[key] = inst._mainDiv.css(
                  key.replace(/ec\.storage\./, "")
                ));
            inst.div
              .data(data)
              .show(showAnim, inst.options.showOptions, showSpeed);
          } else inst.div[showAnim || "show"](showAnim ? showSpeed : 0);
        }
      },
      _extractDates: function (inst, datesText) {
        if (datesText !== inst.lastVal) {
          (inst.lastVal = datesText),
            (datesText = datesText.split(
              inst.options.multiSelect
                ? inst.options.multiSeparator
                : inst.options.rangeSelect
                ? inst.options.rangeSeparator
                : "\0"
            ));
          for (var dates = [], i = 0; i < datesText.length; i++)
            try {
              var date = inst.options.calendar.parseDate(
                inst.get("dateFormat"),
                datesText[i]
              );
              if (date) {
                for (var found = !1, j = 0; j < dates.length; j++)
                  if (0 === dates[j].compareTo(date)) {
                    found = !0;
                    break;
                  }
                found || dates.push(date);
              }
            } catch (e) {}
          return (
            dates.splice(
              inst.options.multiSelect || (inst.options.rangeSelect ? 2 : 1),
              dates.length
            ),
            inst.options.rangeSelect &&
              1 === dates.length &&
              (dates[1] = dates[0]),
            dates
          );
        }
      },
      _update: function (elem, hidden) {
        elem = $(elem.target || elem);
        var inst = plugin._getInst(elem);
        if (!$.isEmptyObject(inst))
          if (
            ((inst.inline || plugin.curInst === inst) &&
              (!$.isFunction(inst.options.onChangeMonthYear) ||
                (inst.prevDate &&
                  inst.prevDate.year() === inst.drawDate.year() &&
                  inst.prevDate.month() === inst.drawDate.month()) ||
                inst.options.onChangeMonthYear.apply(elem[0], [
                  inst.drawDate.year(),
                  inst.drawDate.month(),
                ])),
            inst.inline)
          ) {
            var index = $("a, :input", elem).index($(":focus", elem));
            elem.html(this._generateContent(elem[0], inst));
            var focus = elem.find("a, :input");
            focus.eq(Math.max(Math.min(index, focus.length - 1), 0)).focus();
          } else
            plugin.curInst === inst &&
              (inst.div ||
                ((inst.div = $("<div></div>")
                  .addClass(this._popupClass)
                  .css({
                    display: hidden ? "none" : "static",
                    position: "absolute",
                    left: elem.offset().left,
                    top: elem.offset().top + elem.outerHeight(),
                  })
                  .appendTo($(inst.options.popupContainer || "body"))),
                $.fn.mousewheel && inst.div.mousewheel(this._doMouseWheel)),
              inst.div.html(this._generateContent(elem[0], inst)),
              elem.focus());
      },
      _updateInput: function (elem, keyUp) {
        var inst = this._getInst(elem);
        if (!$.isEmptyObject(inst)) {
          for (
            var value = "",
              altValue = "",
              sep = inst.options.multiSelect
                ? inst.options.multiSeparator
                : inst.options.rangeSeparator,
              calendar = inst.options.calendar,
              dateFormat = inst.get("dateFormat"),
              altFormat = inst.options.altFormat || dateFormat,
              settings = { localNumbers: inst.options.localNumbers },
              i = 0;
            i < inst.selectedDates.length;
            i++
          )
            (value += keyUp
              ? ""
              : (i > 0 ? sep : "") +
                calendar.formatDate(
                  dateFormat,
                  inst.selectedDates[i],
                  settings
                )),
              (altValue +=
                (i > 0 ? sep : "") +
                calendar.formatDate(
                  altFormat,
                  inst.selectedDates[i],
                  settings
                ));
          inst.inline || keyUp || $(elem).val(value),
            $(inst.options.altField).val(altValue),
            !$.isFunction(inst.options.onSelect) ||
              keyUp ||
              inst.inSelect ||
              ((inst.inSelect = !0),
              inst.options.onSelect.apply(elem, [inst.selectedDates]),
              (inst.inSelect = !1)),
            $(elem).change();
        }
      },
      _getBorders: function (elem) {
        var convert = function (value) {
          return { thin: 1, medium: 3, thick: 5 }[value] || value;
        };
        return [
          parseFloat(convert(elem.css("border-left-width"))),
          parseFloat(convert(elem.css("border-top-width"))),
        ];
      },
      _checkOffset: function (inst) {
        var base =
            inst.elem.is(":hidden") && inst.trigger ? inst.trigger : inst.elem,
          offset = base.offset(),
          browserWidth = $(window).width(),
          browserHeight = $(window).height();
        if (0 === browserWidth) return offset;
        var isFixed = !1;
        $(inst.elem)
          .parents()
          .each(function () {
            return (
              (isFixed = isFixed || "fixed" === $(this).css("position")),
              !isFixed
            );
          });
        var scrollX =
            document.documentElement.scrollLeft || document.body.scrollLeft,
          scrollY =
            document.documentElement.scrollTop || document.body.scrollTop,
          above = offset.top - (isFixed ? scrollY : 0) - inst.div.outerHeight(),
          below = offset.top - (isFixed ? scrollY : 0) + base.outerHeight(),
          alignL = offset.left - (isFixed ? scrollX : 0),
          alignR =
            offset.left -
            (isFixed ? scrollX : 0) +
            base.outerWidth() -
            inst.div.outerWidth(),
          tooWide =
            offset.left - scrollX + inst.div.outerWidth() > browserWidth,
          tooHigh =
            offset.top -
              scrollY +
              inst.elem.outerHeight() +
              inst.div.outerHeight() >
            browserHeight;
        inst.div.css("position", isFixed ? "fixed" : "absolute");
        var alignment = inst.options.alignment;
        return (
          (offset =
            "topLeft" === alignment
              ? { left: alignL, top: above }
              : "topRight" === alignment
              ? { left: alignR, top: above }
              : "bottomLeft" === alignment
              ? { left: alignL, top: below }
              : "bottomRight" === alignment
              ? { left: alignR, top: below }
              : "top" === alignment
              ? {
                  left: inst.options.isRTL || tooWide ? alignR : alignL,
                  top: above,
                }
              : {
                  left: inst.options.isRTL || tooWide ? alignR : alignL,
                  top: tooHigh ? above : below,
                }),
          (offset.left = Math.max(isFixed ? 0 : scrollX, offset.left)),
          (offset.top = Math.max(isFixed ? 0 : scrollY, offset.top)),
          offset
        );
      },
      _checkExternalClick: function (event) {
        if (plugin.curInst) {
          var elem = $(event.target);
          0 !==
            elem.closest("." + plugin._popupClass + ",." + plugin._triggerClass)
              .length ||
            elem.hasClass(plugin._getMarker()) ||
            plugin.hide(plugin.curInst);
        }
      },
      hide: function (elem, immediate) {
        if (elem) {
          var inst = this._getInst(elem);
          if (
            ($.isEmptyObject(inst) && (inst = elem),
            inst && inst === plugin.curInst)
          ) {
            var showAnim = immediate ? "" : inst.options.showAnim,
              showSpeed = inst.options.showSpeed;
            showSpeed =
              "normal" === showSpeed &&
              $.ui &&
              parseInt($.ui.version.substring(2)) >= 8
                ? "_default"
                : showSpeed;
            var postProcess = function () {
              inst.div &&
                (inst.div.remove(),
                (inst.div = null),
                (plugin.curInst = null),
                $.isFunction(inst.options.onClose) &&
                  inst.options.onClose.apply(elem, [inst.selectedDates]));
            };
            if (
              (inst.div.stop(),
              $.effects &&
                ($.effects[showAnim] ||
                  ($.effects.effect && $.effects.effect[showAnim])))
            )
              inst.div.hide(
                showAnim,
                inst.options.showOptions,
                showSpeed,
                postProcess
              );
            else {
              var hideAnim =
                "slideDown" === showAnim
                  ? "slideUp"
                  : "fadeIn" === showAnim
                  ? "fadeOut"
                  : "hide";
              inst.div[hideAnim](showAnim ? showSpeed : "", postProcess);
            }
            showAnim || postProcess();
          }
        }
      },
      _keyDown: function (event) {
        var command,
          elem = (event.data && event.data.elem) || event.target,
          inst = plugin._getInst(elem),
          handled = !1;
        if (inst.inline || inst.div)
          if (9 === event.keyCode) plugin.hide(elem);
          else if (13 === event.keyCode)
            plugin.selectDate(
              elem,
              $("a." + inst.options.renderer.highlightedClass, inst.div)[0]
            ),
              (handled = !0);
          else {
            var commands = inst.options.commands;
            for (var name in commands)
              if (
                inst.options.commands.hasOwnProperty(name) &&
                ((command = commands[name]),
                command.keystroke.keyCode === event.keyCode &&
                  !!command.keystroke.ctrlKey ==
                    !(!event.ctrlKey && !event.metaKey) &&
                  !!command.keystroke.altKey === event.altKey &&
                  !!command.keystroke.shiftKey === event.shiftKey)
              ) {
                plugin.performAction(elem, name), (handled = !0);
                break;
              }
          }
        else
          (command = inst.options.commands.current),
            command.keystroke.keyCode === event.keyCode &&
              !!command.keystroke.ctrlKey ==
                !(!event.ctrlKey && !event.metaKey) &&
              !!command.keystroke.altKey === event.altKey &&
              !!command.keystroke.shiftKey === event.shiftKey &&
              (plugin.show(elem), (handled = !0));
        return (
          (inst.ctrlKey =
            (event.keyCode < 48 && 32 !== event.keyCode) ||
            event.ctrlKey ||
            event.metaKey),
          handled && (event.preventDefault(), event.stopPropagation()),
          !handled
        );
      },
      _keyPress: function (event) {
        var inst = plugin._getInst(
          (event.data && event.data.elem) || event.target
        );
        if (!$.isEmptyObject(inst) && inst.options.constrainInput) {
          var ch = String.fromCharCode(event.keyCode || event.charCode),
            allowedChars = plugin._allowedChars(inst);
          return (
            event.metaKey ||
            inst.ctrlKey ||
            ch < " " ||
            !allowedChars ||
            allowedChars.indexOf(ch) > -1
          );
        }
        return !0;
      },
      _allowedChars: function (inst) {
        for (
          var allowedChars = inst.options.multiSelect
              ? inst.options.multiSeparator
              : inst.options.rangeSelect
              ? inst.options.rangeSeparator
              : "",
            literal = !1,
            hasNum = !1,
            dateFormat = inst.get("dateFormat"),
            i = 0;
          i < dateFormat.length;
          i++
        ) {
          var ch = dateFormat.charAt(i);
          if (literal)
            "'" === ch && "'" !== dateFormat.charAt(i + 1)
              ? (literal = !1)
              : (allowedChars += ch);
          else
            switch (ch) {
              case "d":
              case "m":
              case "o":
              case "w":
                (allowedChars += hasNum ? "" : "0123456789"), (hasNum = !0);
                break;
              case "y":
              case "@":
              case "!":
                (allowedChars += (hasNum ? "" : "0123456789") + "-"),
                  (hasNum = !0);
                break;
              case "J":
                (allowedChars += (hasNum ? "" : "0123456789") + "-."),
                  (hasNum = !0);
                break;
              case "D":
              case "M":
              case "Y":
                return null;
              case "'":
                "'" === dateFormat.charAt(i + 1)
                  ? (allowedChars += "'")
                  : (literal = !0);
                break;
              default:
                allowedChars += ch;
            }
        }
        return allowedChars;
      },
      _keyUp: function (event) {
        var elem = (event.data && event.data.elem) || event.target,
          inst = plugin._getInst(elem);
        if (
          !$.isEmptyObject(inst) &&
          !inst.ctrlKey &&
          inst.lastVal !== inst.elem.val()
        )
          try {
            var dates = plugin._extractDates(inst, inst.elem.val());
            dates.length > 0 && plugin.setDate(elem, dates, null, !0);
          } catch (e) {}
        return !0;
      },
      _doMouseWheel: function (event, delta) {
        var elem =
          (plugin.curInst && plugin.curInst.elem[0]) ||
          $(event.target).closest("." + plugin._getMarker())[0];
        if (!plugin.isDisabled(elem)) {
          var inst = plugin._getInst(elem);
          inst.options.useMouseWheel &&
            ((delta = delta < 0 ? -1 : 1),
            plugin.changeMonth(
              elem,
              -inst.options[event.ctrlKey ? "monthsToJump" : "monthsToStep"] *
                delta
            )),
            event.preventDefault();
        }
      },
      clear: function (elem) {
        var inst = this._getInst(elem);
        if (!$.isEmptyObject(inst)) {
          (inst.selectedDates = []), this.hide(elem);
          var defaultDate = inst.get("defaultDate");
          inst.options.selectDefaultDate && defaultDate
            ? this.setDate(
                elem,
                (defaultDate || inst.options.calendar.today()).newDate()
              )
            : this._updateInput(elem);
        }
      },
      getDate: function (elem) {
        var inst = this._getInst(elem);
        return $.isEmptyObject(inst) ? [] : inst.selectedDates;
      },
      setDate: function (elem, dates, endDate, keyUp, setOpt) {
        var inst = this._getInst(elem);
        if (!$.isEmptyObject(inst)) {
          $.isArray(dates) ||
            ((dates = [dates]), endDate && dates.push(endDate));
          var minDate = inst.get("minDate"),
            maxDate = inst.get("maxDate"),
            curDate = inst.selectedDates[0];
          inst.selectedDates = [];
          for (var i = 0; i < dates.length; i++) {
            var date = inst.options.calendar.determineDate(
              dates[i],
              null,
              curDate,
              inst.get("dateFormat"),
              inst.getConfig()
            );
            if (
              date &&
              !(
                (minDate && date.compareTo(minDate) === -1) ||
                (maxDate && 1 === date.compareTo(maxDate))
              )
            ) {
              for (var found = !1, j = 0; j < inst.selectedDates.length; j++)
                if (0 === inst.selectedDates[j].compareTo(date)) {
                  found = !0;
                  break;
                }
              found || inst.selectedDates.push(date);
            }
          }
          if (
            (inst.selectedDates.splice(
              inst.options.multiSelect || (inst.options.rangeSelect ? 2 : 1),
              inst.selectedDates.length
            ),
            inst.options.rangeSelect)
          ) {
            switch (inst.selectedDates.length) {
              case 1:
                inst.selectedDates[1] = inst.selectedDates[0];
                break;
              case 2:
                inst.selectedDates[1] =
                  1 === inst.selectedDates[0].compareTo(inst.selectedDates[1])
                    ? inst.selectedDates[0]
                    : inst.selectedDates[1];
            }
            inst.pickingRange = !1;
          }
          (inst.prevDate = inst.drawDate ? inst.drawDate.newDate() : null),
            (inst.drawDate = this._checkMinMax(
              (
                inst.selectedDates[0] ||
                inst.get("defaultDate") ||
                inst.options.calendar.today()
              ).newDate(),
              inst
            )),
            setOpt || (this._update(elem), this._updateInput(elem, keyUp));
        }
      },
      isSelectable: function (elem, date) {
        var inst = this._getInst(elem);
        return (
          !$.isEmptyObject(inst) &&
          ((date = inst.options.calendar.determineDate(
            date,
            inst.selectedDates[0] || inst.options.calendar.today(),
            null,
            inst.options.dateFormat,
            inst.getConfig()
          )),
          this._isSelectable(
            elem,
            date,
            inst.options.onDate,
            inst.get("minDate"),
            inst.get("maxDate")
          ))
        );
      },
      _isSelectable: function (elem, date, onDate, minDate, maxDate) {
        var dateInfo =
          "boolean" == typeof onDate
            ? { selectable: onDate }
            : $.isFunction(onDate)
            ? onDate.apply(elem, [date, !0])
            : {};
        return (
          dateInfo.selectable !== !1 &&
          (!minDate || date.toJD() >= minDate.toJD()) &&
          (!maxDate || date.toJD() <= maxDate.toJD())
        );
      },
      performAction: function (elem, action) {
        var inst = this._getInst(elem);
        if (!$.isEmptyObject(inst) && !this.isDisabled(elem)) {
          var commands = inst.options.commands;
          commands[action] &&
            commands[action].enabled.apply(elem, [inst]) &&
            commands[action].action.apply(elem, [inst]);
        }
      },
      showMonth: function (elem, year, month, day) {
        var inst = this._getInst(elem);
        if (
          !$.isEmptyObject(inst) &&
          (("undefined" != typeof day && null !== day) ||
            inst.drawDate.year() !== year ||
            inst.drawDate.month() !== month)
        ) {
          inst.prevDate = inst.drawDate.newDate();
          var calendar = inst.options.calendar,
            show = this._checkMinMax(
              "undefined" != typeof year && null !== year
                ? calendar.newDate(year, month, 1)
                : calendar.today(),
              inst
            );
          inst.drawDate.date(
            show.year(),
            show.month(),
            "undefined" != typeof day && null !== day
              ? day
              : Math.min(
                  inst.drawDate.day(),
                  calendar.daysInMonth(show.year(), show.month())
                )
          ),
            this._update(elem);
        }
      },
      changeMonth: function (elem, offset) {
        var inst = this._getInst(elem);
        if (!$.isEmptyObject(inst)) {
          var date = inst.drawDate.newDate().add(offset, "m");
          this.showMonth(elem, date.year(), date.month());
        }
      },
      changeDay: function (elem, offset) {
        var inst = this._getInst(elem);
        if (!$.isEmptyObject(inst)) {
          var date = inst.drawDate.newDate().add(offset, "d");
          this.showMonth(elem, date.year(), date.month(), date.day());
        }
      },
      _checkMinMax: function (date, inst) {
        var minDate = inst.get("minDate"),
          maxDate = inst.get("maxDate");
        return (
          (date =
            minDate && date.compareTo(minDate) === -1
              ? minDate.newDate()
              : date),
          (date =
            maxDate && 1 === date.compareTo(maxDate) ? maxDate.newDate() : date)
        );
      },
      retrieveDate: function (elem, target) {
        var inst = this._getInst(elem);
        return $.isEmptyObject(inst)
          ? null
          : inst.options.calendar.fromJD(
              parseFloat(target.className.replace(/^.*jd(\d+\.5).*$/, "$1"))
            );
      },
      selectDate: function (elem, target) {
        var inst = this._getInst(elem);
        if (!$.isEmptyObject(inst) && !this.isDisabled(elem)) {
          var date = this.retrieveDate(elem, target);
          if (inst.options.multiSelect) {
            for (var found = !1, i = 0; i < inst.selectedDates.length; i++)
              if (0 === date.compareTo(inst.selectedDates[i])) {
                inst.selectedDates.splice(i, 1), (found = !0);
                break;
              }
            !found &&
              inst.selectedDates.length < inst.options.multiSelect &&
              inst.selectedDates.push(date);
          } else
            inst.options.rangeSelect
              ? (inst.pickingRange
                  ? (inst.selectedDates[1] = date)
                  : (inst.selectedDates = [date, date]),
                (inst.pickingRange = !inst.pickingRange))
              : (inst.selectedDates = [date]);
          (inst.prevDate = inst.drawDate = date.newDate()),
            this._updateInput(elem),
            inst.inline ||
            inst.pickingRange ||
            inst.selectedDates.length <
              (inst.options.multiSelect || (inst.options.rangeSelect ? 2 : 1))
              ? this._update(elem)
              : this.hide(elem);
        }
      },
      _generateContent: function (elem, inst) {
        function removeHighlight(elem) {
          (inst.inline ? $(elem).closest("." + self._getMarker()) : inst.div)
            .find(inst.options.renderer.daySelector + " a")
            .removeClass(inst.options.renderer.highlightedClass);
        }
        var monthsToShow = inst.options.monthsToShow;
        (monthsToShow = $.isArray(monthsToShow)
          ? monthsToShow
          : [1, monthsToShow]),
          (inst.drawDate = this._checkMinMax(
            inst.drawDate ||
              inst.get("defaultDate") ||
              inst.options.calendar.today(),
            inst
          ));
        for (
          var drawDate = inst.drawDate
              .newDate()
              .add(-inst.options.monthsOffset, "m"),
            monthRows = "",
            row = 0;
          row < monthsToShow[0];
          row++
        ) {
          for (var months = "", col = 0; col < monthsToShow[1]; col++)
            (months += this._generateMonth(
              elem,
              inst,
              drawDate.year(),
              drawDate.month(),
              inst.options.calendar,
              inst.options.renderer,
              0 === row && 0 === col
            )),
              drawDate.add(1, "m");
          monthRows += this._prepare(
            inst.options.renderer.monthRow,
            inst
          ).replace(/\{months\}/, months);
        }
        var picker = this._prepare(inst.options.renderer.picker, inst)
            .replace(/\{months\}/, monthRows)
            .replace(
              /\{weekHeader\}/g,
              this._generateDayHeaders(
                inst,
                inst.options.calendar,
                inst.options.renderer
              )
            ),
          addCommand = function (type, open, close, name, classes) {
            if (picker.indexOf("{" + type + ":" + name + "}") !== -1) {
              var command = inst.options.commands[name],
                date = inst.options.commandsAsDateFormat
                  ? command.date.apply(elem, [inst])
                  : null;
              picker = picker.replace(
                new RegExp("\\{" + type + ":" + name + "\\}", "g"),
                "<" +
                  open +
                  (command.status
                    ? ' title="' + inst.options[command.status] + '"'
                    : "") +
                  ' class="' +
                  inst.options.renderer.commandClass +
                  " " +
                  inst.options.renderer.commandClass +
                  "-" +
                  name +
                  " " +
                  classes +
                  (command.enabled(inst)
                    ? ""
                    : " " + inst.options.renderer.disabledClass) +
                  '">' +
                  (date
                    ? date.formatDate(inst.options[command.text], {
                        localNumbers: inst.options.localNumbers,
                      })
                    : inst.options[command.text]) +
                  "</" +
                  close +
                  ">"
              );
            }
          };
        for (var name in inst.options.commands)
          inst.options.commands.hasOwnProperty(name) &&
            (addCommand(
              "button",
              'button type="button"',
              "button",
              name,
              inst.options.renderer.commandButtonClass
            ),
            addCommand(
              "link",
              'a href="javascript:void(0)"',
              "a",
              name,
              inst.options.renderer.commandLinkClass
            ));
        if (((picker = $(picker)), monthsToShow[1] > 1)) {
          var count = 0;
          $(inst.options.renderer.monthSelector, picker).each(function () {
            var nth = ++count % monthsToShow[1];
            $(this).addClass(1 === nth ? "first" : 0 === nth ? "last" : "");
          });
        }
        var self = this;
        picker
          .find(inst.options.renderer.daySelector + " a")
          .hover(
            function () {
              removeHighlight(this),
                $(this).addClass(inst.options.renderer.highlightedClass);
            },
            function () {
              removeHighlight(this);
            }
          )
          .click(function () {
            self.selectDate(elem, this);
          })
          .end()
          .find(
            "select." +
              this._monthYearClass +
              ":not(." +
              this._anyYearClass +
              ")"
          )
          .change(function () {
            var monthYear = $(this).val().split("/");
            self.showMonth(
              elem,
              parseInt(monthYear[1], 10),
              parseInt(monthYear[0], 10)
            );
          })
          .end()
          .find("select." + this._anyYearClass)
          .click(function () {
            $(this)
              .css("visibility", "hidden")
              .next("input")
              .css({
                left: this.offsetLeft,
                top: this.offsetTop,
                width: this.offsetWidth,
                height: this.offsetHeight,
              })
              .show()
              .focus();
          })
          .end()
          .find("input." + self._monthYearClass)
          .change(function () {
            try {
              var year = parseInt($(this).val(), 10);
              (year = isNaN(year) ? inst.drawDate.year() : year),
                self.showMonth(
                  elem,
                  year,
                  inst.drawDate.month(),
                  inst.drawDate.day()
                );
            } catch (e) {}
          })
          .keydown(function (event) {
            13 === event.keyCode
              ? $(event.elem).change()
              : 27 === event.keyCode &&
                ($(event.elem)
                  .hide()
                  .prev("select")
                  .css("visibility", "visible"),
                inst.elem.focus());
          });
        var data = { elem: inst.elem[0] };
        picker
          .keydown(data, this._keyDown)
          .keypress(data, this._keyPress)
          .keyup(data, this._keyUp),
          picker
            .find("." + inst.options.renderer.commandClass)
            .click(function () {
              if (!$(this).hasClass(inst.options.renderer.disabledClass)) {
                var action = this.className.replace(
                  new RegExp(
                    "^.*" + inst.options.renderer.commandClass + "-([^ ]+).*$"
                  ),
                  "$1"
                );
                plugin.performAction(elem, action);
              }
            }),
          inst.options.isRTL && picker.addClass(inst.options.renderer.rtlClass),
          monthsToShow[0] * monthsToShow[1] > 1 &&
            picker.addClass(inst.options.renderer.multiClass),
          inst.options.pickerClass && picker.addClass(inst.options.pickerClass),
          $("body").append(picker);
        var width = 0;
        return (
          picker.find(inst.options.renderer.monthSelector).each(function () {
            width += $(this).outerWidth();
          }),
          picker.width(width / monthsToShow[0]),
          $.isFunction(inst.options.onShow) &&
            inst.options.onShow.apply(elem, [
              picker,
              inst.options.calendar,
              inst,
            ]),
          picker
        );
      },
      _generateMonth: function (
        elem,
        inst,
        year,
        month,
        calendar,
        renderer,
        first
      ) {
        var daysInMonth = calendar.daysInMonth(year, month),
          monthsToShow = inst.options.monthsToShow;
        monthsToShow = $.isArray(monthsToShow)
          ? monthsToShow
          : [1, monthsToShow];
        var fixedWeeks =
            inst.options.fixedWeeks || monthsToShow[0] * monthsToShow[1] > 1,
          firstDay = inst.options.firstDay;
        firstDay =
          "undefined" == typeof firstDay || null === firstDay
            ? calendar.local.firstDay
            : firstDay;
        var leadDays =
            (calendar.dayOfWeek(year, month, calendar.minDay) -
              firstDay +
              calendar.daysInWeek()) %
            calendar.daysInWeek(),
          numWeeks = fixedWeeks
            ? 6
            : Math.ceil((leadDays + daysInMonth) / calendar.daysInWeek()),
          selectOtherMonths =
            inst.options.selectOtherMonths && inst.options.showOtherMonths,
          minDate = inst.pickingRange
            ? inst.selectedDates[0]
            : inst.get("minDate"),
          maxDate = inst.get("maxDate"),
          showWeeks = renderer.week.indexOf("{weekOfYear}") > -1,
          today = calendar.today(),
          drawDate = calendar.newDate(year, month, calendar.minDay);
        drawDate.add(
          -leadDays -
            (fixedWeeks &&
            (drawDate.dayOfWeek() === firstDay ||
              drawDate.daysInMonth() < calendar.daysInWeek())
              ? calendar.daysInWeek()
              : 0),
          "d"
        );
        for (
          var jd = drawDate.toJD(),
            localiseNumbers = function (value) {
              return inst.options.localNumbers && calendar.local.digits
                ? calendar.local.digits(value)
                : value;
            },
            weeks = "",
            week = 0;
          week < numWeeks;
          week++
        ) {
          for (
            var weekOfYear = showWeeks
                ? '<span class="jd' +
                  jd +
                  '">' +
                  ($.isFunction(inst.options.calculateWeek)
                    ? inst.options.calculateWeek(drawDate)
                    : drawDate.weekOfYear()) +
                  "</span>"
                : "",
              days = "",
              day = 0;
            day < calendar.daysInWeek();
            day++
          ) {
            var selected = !1;
            if (inst.options.rangeSelect && inst.selectedDates.length > 0)
              selected =
                drawDate.compareTo(inst.selectedDates[0]) !== -1 &&
                1 !== drawDate.compareTo(inst.selectedDates[1]);
            else
              for (var i = 0; i < inst.selectedDates.length; i++)
                if (0 === inst.selectedDates[i].compareTo(drawDate)) {
                  selected = !0;
                  break;
                }
            var dateInfo = $.isFunction(inst.options.onDate)
                ? inst.options.onDate.apply(elem, [
                    drawDate,
                    drawDate.month() === month,
                  ])
                : {},
              selectable =
                (selectOtherMonths || drawDate.month() === month) &&
                this._isSelectable(
                  elem,
                  drawDate,
                  dateInfo.selectable,
                  minDate,
                  maxDate
                ),
              holidayClass = "",
              onClick = "",
              title =
                dateInfo.title ||
                drawDate.formatDate(inst.options.dayStatus, {
                  localNumbers: inst.options.localNumbers,
                });
            if (null != inst.options.holidays) {
              var holiday =
                inst.options.holidays[drawDate.year()] &&
                inst.options.holidays[drawDate.year()][drawDate.month()] &&
                inst.options.holidays[drawDate.year()][drawDate.month()][
                  drawDate.day()
                ];
              void 0 != holiday &&
                ((holidayClass = inst.options.holidays.holidayClass),
                (title += " : " + holiday.title),
                (onClick = holiday.confirmed
                  ? "alert('You are selecting a date which is a holiday (" +
                    holiday.title +
                    "). If you are appointing make sure service will be available on the this date.')"
                  : "alert('It seems you are selecting a date which maybe a holiday (" +
                    holiday.title +
                    "). Since this holiday will be on the selected date or one (1) day before/after the selected date, if you are appointing make sure service will be available on this dates.')"));
            }
            (days += this._prepare(renderer.day, inst).replace(
              /\{day\}/g,
              (selectable ? '<a href="javascript:void(0)"' : "<span") +
                ' onclick ="' +
                onClick +
                '" class="jd' +
                jd +
                " " +
                (dateInfo.dateClass || "") +
                (selected && (selectOtherMonths || drawDate.month() === month)
                  ? " " + renderer.selectedClass
                  : "") +
                (selectable ? " " + renderer.defaultClass : "") +
                (drawDate.weekDay() ? "" : " " + renderer.weekendClass) +
                (drawDate.month() === month
                  ? ""
                  : " " + renderer.otherMonthClass) +
                (0 === drawDate.compareTo(today) && drawDate.month() === month
                  ? " " + renderer.todayClass
                  : "") +
                (0 === drawDate.compareTo(inst.drawDate) &&
                drawDate.month() === month
                  ? " " + renderer.highlightedClass
                  : "") +
                " " +
                holidayClass +
                '"' +
                (dateInfo.title || (inst.options.dayStatus && selectable)
                  ? ' title="' + title + '"'
                  : "") +
                ">" +
                (inst.options.showOtherMonths || drawDate.month() === month
                  ? dateInfo.content || localiseNumbers(drawDate.day())
                  : "&#160;") +
                (selectable ? "</a>" : "</span>")
            )),
              drawDate.add(1, "d"),
              jd++;
          }
          weeks += this._prepare(renderer.week, inst)
            .replace(/\{days\}/g, days)
            .replace(/\{weekOfYear\}/g, weekOfYear);
        }
        var monthHeader = this._prepare(renderer.month, inst).match(
          /\{monthHeader(:[^\}]+)?\}/
        );
        (monthHeader =
          monthHeader[0].length <= 13
            ? "MM yyyy"
            : monthHeader[0].substring(13, monthHeader[0].length - 1)),
          (monthHeader = first
            ? this._generateMonthSelection(
                inst,
                year,
                month,
                minDate,
                maxDate,
                monthHeader,
                calendar,
                renderer
              )
            : calendar.formatDate(
                monthHeader,
                calendar.newDate(year, month, calendar.minDay),
                { localNumbers: inst.options.localNumbers }
              ));
        var weekHeader = this._prepare(renderer.weekHeader, inst).replace(
          /\{days\}/g,
          this._generateDayHeaders(inst, calendar, renderer)
        );
        return this._prepare(renderer.month, inst)
          .replace(/\{monthHeader(:[^\}]+)?\}/g, monthHeader)
          .replace(/\{weekHeader\}/g, weekHeader)
          .replace(/\{weeks\}/g, weeks);
      },
      _generateDayHeaders: function (inst, calendar, renderer) {
        var firstDay = inst.options.firstDay;
        firstDay =
          "undefined" == typeof firstDay || null === firstDay
            ? calendar.local.firstDay
            : firstDay;
        for (var header = "", day = 0; day < calendar.daysInWeek(); day++) {
          var dow = (day + firstDay) % calendar.daysInWeek();
          header += this._prepare(renderer.dayHeader, inst).replace(
            /\{day\}/g,
            '<span class="' +
              this._curDoWClass +
              dow +
              '" title="' +
              calendar.local.dayNames[dow] +
              '">' +
              calendar.local.dayNamesMin[dow] +
              "</span>"
          );
        }
        return header;
      },
      _generateMonthSelection: function (
        inst,
        year,
        month,
        minDate,
        maxDate,
        monthHeader,
        calendar
      ) {
        if (!inst.options.changeMonth)
          return calendar.formatDate(
            monthHeader,
            calendar.newDate(year, month, 1),
            { localNumbers: inst.options.localNumbers }
          );
        for (
          var monthNames =
              calendar.local[
                "monthNames" + (monthHeader.match(/mm/i) ? "" : "Short")
              ],
            html = monthHeader.replace(/m+/i, "\\x2E").replace(/y+/i, "\\x2F"),
            selector =
              '<select class="' +
              this._monthYearClass +
              '" title="' +
              inst.options.monthStatus +
              '">',
            maxMonth = calendar.monthsInYear(year) + calendar.minMonth,
            m = calendar.minMonth;
          m < maxMonth;
          m++
        )
          (minDate &&
            calendar
              .newDate(
                year,
                m,
                calendar.daysInMonth(year, m) - 1 + calendar.minDay
              )
              .compareTo(minDate) === -1) ||
            (maxDate &&
              1 ===
                calendar
                  .newDate(year, m, calendar.minDay)
                  .compareTo(maxDate)) ||
            (selector +=
              '<option value="' +
              m +
              "/" +
              year +
              '"' +
              (month === m ? ' selected="selected"' : "") +
              ">" +
              monthNames[m - calendar.minMonth] +
              "</option>");
        (selector += "</select>"), (html = html.replace(/\\x2E/, selector));
        var localiseNumbers = function (value) {
            return inst.options.localNumbers && calendar.local.digits
              ? calendar.local.digits(value)
              : value;
          },
          yearRange = inst.options.yearRange;
        if ("any" === yearRange)
          selector =
            '<select class="' +
            this._monthYearClass +
            " " +
            this._anyYearClass +
            '" title="' +
            inst.options.yearStatus +
            '"><option value="' +
            year +
            '">' +
            localiseNumbers(year) +
            '</option></select><input class="' +
            this._monthYearClass +
            " " +
            this._curMonthClass +
            month +
            '" value="' +
            year +
            '">';
        else {
          yearRange = yearRange.split(":");
          var todayYear = calendar.today().year(),
            start = yearRange[0].match("c[+-].*")
              ? year + parseInt(yearRange[0].substring(1), 10)
              : (yearRange[0].match("[+-].*") ? todayYear : 0) +
                parseInt(yearRange[0], 10),
            end = yearRange[1].match("c[+-].*")
              ? year + parseInt(yearRange[1].substring(1), 10)
              : (yearRange[1].match("[+-].*") ? todayYear : 0) +
                parseInt(yearRange[1], 10);
          (selector =
            '<select class="' +
            this._monthYearClass +
            '" title="' +
            inst.options.yearStatus +
            '">'),
            (start = calendar
              .newDate(start + 1, calendar.firstMonth, calendar.minDay)
              .add(-1, "d")),
            (end = calendar.newDate(end, calendar.firstMonth, calendar.minDay));
          var earlierLater,
            y,
            addYear = function (y, yDisplay) {
              (0 !== y || calendar.hasYearZero) &&
                (selector +=
                  '<option value="' +
                  Math.min(
                    month,
                    calendar.monthsInYear(y) - 1 + calendar.minMonth
                  ) +
                  "/" +
                  y +
                  '"' +
                  (year === y ? ' selected="selected"' : "") +
                  ">" +
                  (yDisplay || localiseNumbers(y)) +
                  "</option>");
            };
          if (start.toJD() < end.toJD()) {
            for (
              start = (
                minDate && 1 === minDate.compareTo(start) ? minDate : start
              ).year(),
                end = (
                  maxDate && maxDate.compareTo(end) === -1 ? maxDate : end
                ).year(),
                earlierLater = Math.floor((end - start) / 2),
                (!minDate || minDate.year() < start) &&
                  addYear(start - earlierLater, inst.options.earlierText),
                y = start;
              y <= end;
              y++
            )
              addYear(y);
            (!maxDate || maxDate.year() > end) &&
              addYear(end + earlierLater, inst.options.laterText);
          } else {
            for (
              start = (
                maxDate && maxDate.compareTo(start) === -1 ? maxDate : start
              ).year(),
                end = (
                  minDate && 1 === minDate.compareTo(end) ? minDate : end
                ).year(),
                earlierLater = Math.floor((start - end) / 2),
                (!maxDate || maxDate.year() > start) &&
                  addYear(start + earlierLater, inst.options.earlierText),
                y = start;
              y >= end;
              y--
            )
              addYear(y);
            (!minDate || minDate.year() < end) &&
              addYear(end - earlierLater, inst.options.laterText);
          }
          selector += "</select>";
        }
        return (html = html.replace(/\\x2F/, selector));
      },
      _prepare: function (text, inst) {
        var replaceSection = function (type, retain) {
          for (;;) {
            var start = text.indexOf("{" + type + ":start}");
            if (start === -1) return;
            var end = text.substring(start).indexOf("{" + type + ":end}");
            end > -1 &&
              (text =
                text.substring(0, start) +
                (retain
                  ? text.substr(start + type.length + 8, end - type.length - 8)
                  : "") +
                text.substring(start + end + type.length + 6));
          }
        };
        replaceSection("inline", inst.inline),
          replaceSection("popup", !inst.inline);
        for (
          var pattern = /\{l10n:([^\}]+)\}/, matches = pattern.exec(text);
          matches;

        )
          (text = text.replace(matches[0], inst.options[matches[1]])),
            (matches = pattern.exec(text));
        return text;
      },
    });
    var plugin = $.calendarsPicker;
    $(function () {
      $(document)
        .on("mousedown." + pluginName, plugin._checkExternalClick)
        .on("resize." + pluginName, function () {
          plugin.hide(plugin.curInst);
        });
    });
  })(jQuery);