{"version":3,"file":"ngx-datetime-range-picker.mjs","sources":["../../src/lib/ngx-datetime-range-picker.constants.ts","../../src/lib/ngx-datetime-range-picker.utils.ts","../../src/lib/interfaces/index.ts","../../src/lib/ngx-datetime-range-picker.service.ts","../../src/lib/pipes/objNgFor.pipe.ts","../../src/lib/ngx-datetime-range-picker.component.ts","../../src/lib/ngx-datetime-range-picker.component.html","../../src/lib/material/material.module.ts","../../src/lib/ngx-datetime-range-picker.module.ts","../../src/public_api.ts","../../src/ngx-datetime-range-picker.ts"],"sourcesContent":["import { ActiveItemSide, DateSide, AriaLabelsOptions, Options, Settings, State } from \"./interfaces\";\n\ndeclare var require: any;\nconst moment = require(\"moment\");\nconst USA_MST_TZ_CODE = \"MST\";\nconst USA_TZ_CODE = \"PST\";\nconst EU_TZ_CODE = \"CET\";\n\nfunction getLocalTimezone(): string {\n  const tz: string = /\\((.*)\\)/.exec(new Date().toString())[1];\n\n  if (tz === \"Central Europe Standard Time\") {\n    return EU_TZ_CODE;\n  } else {\n    return USA_MST_TZ_CODE;\n  }\n}\n\nexport const DEFAULT_DATE_FORMAT = \"YYYY-MM-DD\";\n\nexport const NgxDatetimeRangePickerConstants = {\n  DEFAULT: {\n    OPTIONS: <Options>{\n      dateArray: [],\n      startDate: moment().format(\"YYYY-MM-DD\") as string,\n      endDate: moment().format(\"YYYY-MM-DD\") as string,\n      minDate: moment()\n        .subtract(2, \"year\")\n        .startOf(\"year\")\n        .format(\"YYYY-MM-DD\") as string,\n      maxDate: moment().format(\"YYYY-MM-DD\") as string,\n      startTime: \"00:00\",\n      endTime: \"23:59\"\n    },\n    SETTINGS: <Settings>{\n      type: \"daily\",\n      modelKeys: [\"daily\", \"weekly\", \"monthly\", \"quarterly\", \"yearly\"],\n      showTimezoneSelect: false,\n      useLocalTimezone: false,\n      timePicker: false,\n      inputClass: \"m1drp\",\n      inputDateFormat: null,\n      viewDateFormat: DEFAULT_DATE_FORMAT,\n      outputDateFormat: DEFAULT_DATE_FORMAT,\n      singleDatePicker: false,\n      componentDisabled: false,\n      placeholder: \"Select Date\",\n      showRowNumber: false,\n      availableRanges: {},\n      showRanges: true,\n      disableWeekends: false,\n      disableWeekdays: false,\n      retailCalendar: false,\n      displayBeginDate: false,\n      displayEndDate: false,\n      ariaLabels: {\n        inputField: \"Date Range Input Field\"\n      } as AriaLabelsOptions\n    },\n    STATE: <State>{\n      activeEndDate: null,\n      activeItem: {\n        left: {} as ActiveItemSide,\n        right: {} as ActiveItemSide\n      },\n      activeRange: null,\n      activeStartDate: null,\n      calendarAvailable: {\n        left: false,\n        right: false\n      },\n      customRange: false,\n      dates: {\n        left: {} as DateSide,\n        right: {} as DateSide\n      },\n      dateTitleText: {\n        left: \"\",\n        right: \"\"\n      },\n      frequencyColumnHeader: null,\n      isCalendarVisible: false,\n      isValidFilter: false,\n      isUserModelChange: true,\n      localTimezone: getLocalTimezone(),\n      selectedDateText: \"\",\n      selectedHour: {\n        left: \"\",\n        right: \"\"\n      },\n      selectedMeridian: {\n        left: \"\",\n        right: \"\"\n      },\n      selectedMinute: {\n        left: \"\",\n        right: \"\"\n      },\n      selectedMonth: {\n        left: \"\",\n        right: \"\"\n      },\n      selectedTimezone: undefined, // Since \"useLocalTimezone: false\" by default;\n      selectedYear: {\n        left: \"\",\n        right: \"\"\n      },\n      sides: [],\n      timeItems: [\"hour\", \"minute\"],\n      times: {\n        left: \"\",\n        right: \"\"\n      },\n      timeZones: [USA_TZ_CODE, EU_TZ_CODE],\n      todayTime: \"\",\n      weekDayOptions: [\"su\", \"mo\", \"tu\", \"we\", \"th\", \"fr\", \"sa\"]\n    },\n    TIME_FORMAT: \"HH:mm\",\n    RANGES: {\n      daily: [\n        { label: \"Last 7 Days\", count: 6 },\n        { label: \"Last 30 Days\", count: 29 },\n        { label: \"Last 90 Days\", count: 89 }\n      ],\n      weekly: [\n        { label: \"Last 4 Weeks\", count: 3 },\n        { label: \"Last 13 Weeks\", count: 12 },\n        { label: \"Last 26 Weeks\", count: 25 }\n      ],\n      monthly: [\n        { label: \"Last 3 Months\", count: 2 },\n        { label: \"Last 6 Months\", count: 5 },\n        { label: \"Last 9 Months\", count: 8 }\n      ],\n      quarterly: [\n        { label: \"Last 2 Quarters\", count: 1 },\n        { label: \"Last 4 Quarters\", count: 3 }\n      ],\n      yearly: [{ label: \"Last Year\", count: 1 }]\n    }\n  },\n  CONSTANT: {\n    MONTHS_AVAILABLE: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n    TIMES_AVAILABLE: [\"hour\", \"minute\"],\n    MOMENT_CONVERSION_MAP: {\n      daily: \"day\",\n      weekly: \"week\",\n      monthly: \"month\",\n      quarterly: \"quarter\",\n      yearly: \"year\"\n    },\n    USA_MST_TZ_CODE,\n    USA_TZ_CODE,\n    EU_TZ_CODE,\n    OFFSETS: {\n      [USA_TZ_CODE]: {\n        SO: -7,\n        WO: -8\n      },\n      [EU_TZ_CODE]: {\n        SO: 1,\n        WO: 0\n      }\n    },\n    TZ_NAMES: {\n      [USA_MST_TZ_CODE]: \"America/Phoenix\",\n      [USA_TZ_CODE]: \"America/Los_Angeles\",\n      [EU_TZ_CODE]: \"Europe/Berlin\"\n    }\n  }\n};\n","export const getNotAvailableText = (): string => {\n  return \"N/A\";\n};\n\n/**\n *\n * @param value the value to be cloned\n * @note will not work for objects containing functions\n */\nexport const cloneDeep = (value: Object | string | number): Object | string | number => {\n  if (value) {\n    return JSON.parse(JSON.stringify(value));\n  }\n};\n\nexport const isEmpty = (value: Object): boolean => {\n  if (value) {\n    return Object.keys(value).length <= 0;\n  }\n};\n\nexport const mergeDeep = (...objects): Object => {\n  const isObject = (obj) => obj && typeof obj === \"object\";\n\n  return objects.reduce((prev, obj) => {\n    Object.keys(obj).forEach((key) => {\n      const pVal = prev[key];\n      const oVal = obj[key];\n\n      if (Array.isArray(pVal) && Array.isArray(oVal)) {\n        prev[key] = pVal.concat(...oVal);\n      } else if (isObject(pVal) && isObject(oVal)) {\n        prev[key] = mergeDeep(pVal, oVal);\n      } else {\n        prev[key] = oVal;\n      }\n    });\n\n    return prev;\n  }, {});\n};\n\nexport const isNil = (value) => {\n  return value == null || value === undefined;\n};\n","const tuple = <T extends string[]>(...args: T) => args;\nexport const CalendarTypes = tuple(\"daily\", \"weekly\", \"monthly\", \"quarterly\", \"yearly\");\nexport type CalendarType = typeof CalendarTypes[number];\n\nexport interface AriaLabelsOptions {\n  inputField?: string;\n}\n\nexport interface DateSide {\n  label: string;\n  months: string[];\n  years: string[];\n  itemRows: Object[];\n}\n\nexport interface TimeSide {\n  hour: any[];\n  minute: any[];\n  meridian: any[];\n}\n\nexport interface DateCharacteristics {\n  available?: boolean;\n  inRange?: boolean;\n  active?: boolean;\n  today?: boolean;\n  date?: string;\n}\n\nexport interface ActiveItemSide extends DateCharacteristics {\n  rowItemText?: string;\n  firstDay?: string;\n  lastDay?: string;\n}\n\nexport interface CalendarSides {\n  left?: DateSide | TimeSide | ActiveItemSide | string | boolean;\n  right?: DateSide | TimeSide | ActiveItemSide | string | boolean;\n}\n\nexport interface DateTimeRangeChangeOutput {\n  activeRange: string;\n  startDate: string | number;\n  endDate: string | number;\n  startTime?: string;\n  endTime?: string;\n}\n\nexport type DateTimeRangeModelChangeOutput = { [key in CalendarType]?: DateTimeRangeChangeOutput };\n\nexport interface Options {\n  dateArray?: any[];\n  startDate?: string | number;\n  endDate?: string | number;\n  minDate?: string | number;\n  maxDate?: string | number;\n  startTime?: string;\n  endTime?: string;\n  minTime?: string;\n  maxTime?: string;\n}\n\nexport interface State {\n  activeEndDate: string;\n  activeItem: CalendarSides;\n  activeRange: string;\n  activeStartDate: string;\n  calendarAvailable: CalendarSides;\n  customRange: boolean;\n  dates: CalendarSides;\n  dateTitleText: CalendarSides;\n  frequencyColumnHeader: string;\n  isCalendarVisible: boolean;\n  isValidFilter: boolean;\n  isUserModelChange: boolean;\n  localTimezone: string;\n  selectedDateText: string;\n  selectedHour: CalendarSides;\n  selectedMeridian: CalendarSides;\n  selectedMinute: CalendarSides;\n  selectedMonth: CalendarSides;\n  selectedTimezone: string;\n  selectedYear: CalendarSides;\n  sides: string[];\n  timeItems: string[];\n  times: CalendarSides;\n  timeZones: string[];\n  todayTime: string;\n  weekDayOptions: string[];\n}\n\nexport interface Settings {\n  type?: string;\n  modelKeys?: string[];\n  useLocalTimezone?: boolean;\n  showTimezoneSelect?: boolean;\n  timePicker?: boolean;\n  timezoneSupport?: boolean;\n  defaultTimezone?: string;\n  inputClass?: string;\n  inputDateFormat?: string;\n  viewDateFormat?: string;\n  outputDateFormat?: string;\n  singleDatePicker?: boolean;\n  componentDisabled?: boolean;\n  placeholder?: string;\n  showRowNumber?: boolean;\n  availableRanges?: {};\n  showRanges?: boolean;\n  disableWeekends?: boolean;\n  disableWeekdays?: boolean;\n  retailCalendar?: boolean;\n  displayBeginDate?: boolean;\n  displayEndDate?: boolean;\n  ariaLabels?: AriaLabelsOptions;\n}\n\nexport interface Config extends Options, Settings {\n  selectedTimezone?: string;\n}\n\nexport interface DateRow {\n  rowNumber: string;\n  rowNumberText: string;\n  items: DateCharacteristics[];\n}\n\nexport interface RowVariables {\n  rowNumber: string;\n  columns: number;\n}\n\nexport interface RowItemVariables {\n  itemCount: number;\n  currentItemDate: string;\n  rowItemText: string;\n  firstDay: string;\n  lastDay: string;\n}\n\nexport interface RowOptions {\n  type: string;\n  monthStartWeekNumber: number;\n  dateRows: number;\n  year: string;\n  itemCount: number;\n}\n\nexport interface RowItemOptions {\n  type: string;\n  monthStartWeekNumber: number;\n  dateRows: number;\n  rowNumber: string;\n  yearStartDate: string;\n  year: number;\n  rowItem: number;\n  columns: number;\n}\n\nexport type DateRangeModel = { [key in CalendarType]?: Options };\n","import { Injectable } from \"@angular/core\";\nimport {\n  DEFAULT_DATE_FORMAT,\n  NgxDatetimeRangePickerConstants as Constants\n} from \"./ngx-datetime-range-picker.constants\";\nimport { getNotAvailableText, cloneDeep, isNil } from \"./ngx-datetime-range-picker.utils\";\nimport {\n  Options,\n  Settings,\n  CalendarSides,\n  State,\n  RowItemVariables,\n  RowItemOptions,\n  DateCharacteristics,\n  Config,\n  RowOptions,\n  CalendarTypes,\n  RowVariables,\n  CalendarType\n} from \"./interfaces\";\nimport { Moment } from \"moment\";\n\ndeclare var require: any;\nconst moment = require(\"moment\");\n\nconst DEFAULT_TIME_FORMAT = Constants.DEFAULT.TIME_FORMAT;\nconst MONTHS_AVAILABLE = Constants.CONSTANT.MONTHS_AVAILABLE;\nconst TZ_NAMES = Constants.CONSTANT.TZ_NAMES;\nconst DEFAULT_RANGES = Constants.DEFAULT.RANGES;\nconst MOMENT_CONVERSION_MAP = Constants.CONSTANT.MOMENT_CONVERSION_MAP;\n\n@Injectable({\n  providedIn: \"root\"\n})\nexport class NgxDatetimeRangePickerService {\n  getDefaultOptions(): Options {\n    return cloneDeep(Constants.DEFAULT.OPTIONS) as Options;\n  }\n\n  getDefaultSettings(): Settings {\n    return cloneDeep(Constants.DEFAULT.SETTINGS) as Settings;\n  }\n\n  getDefaultState(): State {\n    return cloneDeep(Constants.DEFAULT.STATE) as State;\n  }\n\n  checkSettingsValidity(settings: Settings) {\n    if (settings.type && !CalendarTypes.includes(settings.type as CalendarType)) {\n      const errMsg = `${settings.type} is an invalid calendar type. It should one of ${[...CalendarTypes]}`;\n      throw new Error(errMsg);\n    }\n  }\n\n  formatDateToDefaultFormat(date: string | number, format: string): string {\n    let formattedDate = null;\n    if (!date) {\n      return;\n    }\n\n    if (!isNaN(Number(date))) {\n      formattedDate = moment(date).format(DEFAULT_DATE_FORMAT);\n    } else {\n      formattedDate = moment(date, format).format(DEFAULT_DATE_FORMAT);\n    }\n\n    return formattedDate;\n  }\n\n  formatTimeToDefaultFormat(time: string) {\n    let formattedTime = null;\n    if (!time) {\n      return;\n    }\n\n    if (time.indexOf(\":\") > -1) {\n      if (time.indexOf(\"AM\") > -1 || time.indexOf(\"PM\") > -1) {\n        formattedTime = moment(time, \"h:mm A\").format(DEFAULT_TIME_FORMAT);\n      } else {\n        formattedTime = time;\n      }\n    } else {\n      console.warn(\n        `WARN_NGX_DATETIME_RANGE_PICKER:\n            The provided time is not in correct format.\n            Format: HH:mm or hh:mm A\n        `\n      );\n    }\n    return formattedTime;\n  }\n\n  getCalendarRowNumberText(type, number) {\n    return (() => {\n      switch (type) {\n        case \"daily\":\n          return `W${number}`;\n        case \"weekly\":\n          return \"\";\n        case \"monthly\":\n          return `Q${number}`;\n        case \"quarterly\":\n          return `${number}`;\n        case \"yearly\":\n          return \"\";\n      }\n    })();\n  }\n\n  createDefaultRanges(config: Config): Object {\n    const ranges = {};\n    const type: string = config.type;\n    const maxDate: string = cloneDeep(config.maxDate) as string;\n\n    DEFAULT_RANGES[type].forEach((rangeInfo: { label: string; count: number }) => {\n      ranges[rangeInfo.label] = {\n        startDate: moment(maxDate, DEFAULT_DATE_FORMAT)\n          .subtract(rangeInfo.count, MOMENT_CONVERSION_MAP[type])\n          .format(DEFAULT_DATE_FORMAT),\n        endDate: maxDate\n      };\n    });\n\n    ranges[\"Custom Range\"] = { startDate: null, endDate: null };\n    return ranges;\n  }\n\n  getSanitizedDateArray(config: Config): string[] {\n    const sanitizedDateArray: string[] = [];\n    const type = config.type;\n    const dateArray = config.dateArray;\n    const inputDateFormat = config.inputDateFormat;\n\n    // dateArray can have nulls\n    dateArray.forEach((date) => {\n      if (!date) {\n        return;\n      }\n\n      let format: string = null;\n\n      if (isNaN(Number(date))) {\n        if (inputDateFormat) {\n          format = inputDateFormat;\n        } else {\n          format = moment(date)._f; // moment does not support this\n        }\n      }\n\n      if (inputDateFormat !== moment(date)._f) {\n        console.warn(\n          `ERR_NGX_DATETIME_RANGE_PICKER:\n              inputDateFormat !== dateFormat in dateArray.\n              Converted dates might not be as expected\n            `\n        );\n      }\n\n      const value: Moment = format ? moment(date, format) : moment(date);\n\n      if (value) {\n        const formattedDate = value.endOf(MOMENT_CONVERSION_MAP[type as string]).format(DEFAULT_DATE_FORMAT);\n        sanitizedDateArray.push(formattedDate);\n      } else {\n        console.warn(\n          `ERR_NGX_DATETIME_RANGE_PICKER:\n              dateArray values are in unknown format.\n              Pass the format or pass the dates in known format\n            `\n        );\n      }\n    });\n\n    return [...new Set(sanitizedDateArray)];\n  }\n\n  getNumberOfWeeks(date): number {\n    if (!date) {\n      return;\n    }\n\n    const monthStart: number = moment(date, DEFAULT_DATE_FORMAT)\n      .startOf(\"month\")\n      .day();\n    const monthEnd: number = Number(\n      moment(date, DEFAULT_DATE_FORMAT)\n        .endOf(\"month\")\n        .format(\"D\")\n    );\n    return Math.ceil((monthStart + monthEnd) / 7);\n  }\n\n  getYearlyWeekCount(year: string): number {\n    if (!year) {\n      return;\n    }\n\n    const yearStartDate: string = moment(year, \"YYYY\")\n      .startOf(\"year\")\n      .format(DEFAULT_DATE_FORMAT);\n    const yearEndDate: string = moment(year, \"YYYY\")\n      .endOf(\"year\")\n      .format(DEFAULT_DATE_FORMAT);\n    const yearEndWeekEndDate: string = moment(yearEndDate, DEFAULT_DATE_FORMAT)\n      .startOf(\"week\")\n      .format(DEFAULT_DATE_FORMAT);\n    const yearStartWeekEndDate: string = moment(yearStartDate, DEFAULT_DATE_FORMAT)\n      .endOf(\"week\")\n      .format(DEFAULT_DATE_FORMAT);\n\n    const yearStartWeekNumber: number = this.getWeekNumber(yearStartWeekEndDate) as number;\n    const yearEndWeekNumber: number = this.getWeekNumber(yearEndWeekEndDate) as number;\n\n    return yearEndWeekNumber - yearStartWeekNumber + 1;\n  }\n\n  getMonthsAvailable(minDate, maxDate, selectedYear): string[] {\n    const months: string[] = [];\n\n    if (!minDate || !maxDate || !selectedYear) {\n      return;\n    }\n\n    minDate = moment(minDate, DEFAULT_DATE_FORMAT).startOf(\"month\");\n    maxDate = moment(maxDate, DEFAULT_DATE_FORMAT).startOf(\"month\");\n\n    let minDatems: number = moment(minDate, DEFAULT_DATE_FORMAT).valueOf();\n    let maxDatems: number = moment(maxDate, DEFAULT_DATE_FORMAT).valueOf();\n    const yearStartms: number = moment()\n      .year(selectedYear)\n      .startOf(\"year\")\n      .valueOf();\n    const yearEndms: number = moment()\n      .year(selectedYear)\n      .endOf(\"year\")\n      .valueOf();\n\n    if (minDatems < yearStartms) {\n      minDatems = yearStartms;\n    }\n    if (maxDatems > yearEndms) {\n      maxDatems = yearEndms;\n    }\n\n    let minDateMonthNumber: number = moment(minDatems).month();\n    const diff: number = moment(maxDatems).diff(moment(minDatems), \"months\");\n    const maxMonths: number = diff < MONTHS_AVAILABLE.length ? diff : MONTHS_AVAILABLE.length;\n\n    for (let i = 0; i <= maxMonths; i++) {\n      if (minDateMonthNumber >= MONTHS_AVAILABLE.length) {\n        months.push(MONTHS_AVAILABLE[minDateMonthNumber - MONTHS_AVAILABLE.length]);\n      } else {\n        months.push(MONTHS_AVAILABLE[minDateMonthNumber]);\n      }\n      minDateMonthNumber++;\n    }\n\n    return months;\n  }\n\n  getYearsAvailable(config: Config): string[] {\n    const minDate: string | number = config ? config.minDate : \"\";\n    const maxDate: string | number = config ? config.maxDate : \"\";\n    const years: string[] = [];\n\n    if (minDate && maxDate) {\n      const minYear: number = Number(this.getSelectedYear(minDate));\n      const maxYear: number = Number(this.getSelectedYear(maxDate));\n      const diff = maxYear - minYear;\n\n      for (let i = 0; i <= diff; i++) {\n        years.push(`${minYear + i}`);\n      }\n    }\n    return years.reverse();\n  }\n\n  isDateAvailable(\n    date: number,\n    minDate: number,\n    maxDate: number,\n    startDate: number,\n    endDate: number,\n    monthStartDate: number,\n    monthEndDate: number,\n    config: Config\n  ): boolean {\n    let available = false;\n    const type: string = config.type;\n    const disableWeekends: boolean = config.disableWeekends;\n    const disableWeekdays: boolean = config.disableWeekdays;\n\n    if (type === \"daily\") {\n      minDate = minDate > monthStartDate ? minDate : monthStartDate;\n      maxDate = maxDate < monthEndDate ? maxDate : monthEndDate;\n    }\n\n    if (date >= minDate && date <= maxDate) {\n      available = true;\n\n      if (available) {\n        if (disableWeekends) {\n          available = !this.isWeekend(date);\n        }\n        if (disableWeekdays) {\n          available = !this.isWeekday(date);\n        }\n        if (config.dateArray.length) {\n          available = this.isInDateArray(date, config.dateArray, DEFAULT_DATE_FORMAT);\n        }\n      }\n    }\n    return available;\n  }\n\n  isDateInRange(\n    date: number,\n    minDate: number,\n    maxDate: number,\n    startDate: number,\n    endDate: number,\n    monthStartDate: number,\n    monthEndDate: number,\n    available: boolean,\n    config: Config\n  ): boolean {\n    let inRange = false;\n    const type: string = config.type;\n    const singleDatePicker: boolean = config.singleDatePicker;\n\n    if (!singleDatePicker) {\n      if (type === \"daily\") {\n        minDate = monthStartDate;\n        maxDate = monthEndDate;\n      }\n      if (date >= startDate && date <= endDate && date >= minDate && date <= maxDate) {\n        if (available) {\n          inRange = true;\n        }\n      }\n    }\n    return inRange;\n  }\n\n  isDateActive(date: number, startDate: number, endDate: number, side: string): boolean {\n    return (date === startDate && side === \"left\") || (date === endDate && side === \"right\");\n  }\n\n  isDateToday(dateMs: number, config): boolean {\n    const todayDate: string = moment().format(DEFAULT_DATE_FORMAT);\n    const type: string = config.type;\n    const { firstDay, lastDay } = this.getFirstLastDay(todayDate, type);\n    const firstDayMs: number = moment(firstDay, DEFAULT_DATE_FORMAT).valueOf();\n    const lastDayMs: number = moment(lastDay, DEFAULT_DATE_FORMAT).valueOf();\n    return dateMs >= firstDayMs && dateMs <= lastDayMs;\n  }\n\n  isWeekday(date: number, format?: string): boolean {\n    return !this.isWeekend(date, format);\n  }\n\n  isWeekend(date: number, format?: string): boolean {\n    if (!format) {\n      format = null;\n    }\n    const day = moment(date, format).day();\n    return day === 0 || day === 6;\n  }\n\n  isInDateArray(date: number, dateArray: any[], format?: string): boolean {\n    if (!format) {\n      format = null;\n    }\n    return dateArray.find((d) => moment(d, format).valueOf() === date) !== undefined;\n  }\n\n  getCalendarRowVariables(options: RowOptions): RowVariables {\n    const variables: RowVariables = {\n      rowNumber: \"\",\n      columns: 0\n    };\n    const type: string = options.type;\n    const monthStartWeekNumber: number = options.monthStartWeekNumber;\n    const dateRows: number = options.dateRows;\n    const year = `${options.year}`;\n\n    if (type === \"daily\") {\n      variables.rowNumber = `${monthStartWeekNumber + dateRows}`;\n      variables.columns = 6;\n    } else if (type === \"weekly\") {\n      variables.rowNumber = ``;\n      variables.columns = 6;\n    } else if (type === \"monthly\") {\n      variables.rowNumber = `${dateRows + 1}`;\n      variables.columns = 2;\n    } else if (type === \"quarterly\") {\n      variables.rowNumber = year.charAt(dateRows);\n      variables.columns = 0;\n    } else if (type === \"yearly\") {\n      variables.rowNumber = \"\";\n      variables.columns = 0;\n    }\n\n    return variables;\n  }\n\n  getCalendarRowItemVariables(options: RowItemOptions): RowItemVariables {\n    const { type, monthStartWeekNumber, yearStartDate, year, rowItem, dateRows, columns } = options;\n\n    const itemCount: number = rowItem + dateRows * columns + dateRows;\n    let currentItemDate = \"\";\n    let rowItemText = \"\";\n\n    if (type === \"daily\") {\n      if (!isNil(monthStartWeekNumber) && !isNil(dateRows) && !isNil(year)) {\n        const yearStartDateDaily = moment()\n          .year(year)\n          .startOf(\"year\")\n          .format(DEFAULT_DATE_FORMAT);\n        currentItemDate = moment(yearStartDateDaily, DEFAULT_DATE_FORMAT)\n          .add(monthStartWeekNumber + dateRows - 1, \"week\")\n          .startOf(\"week\")\n          .add(rowItem, \"day\")\n          .format(DEFAULT_DATE_FORMAT);\n        rowItemText = moment(currentItemDate, DEFAULT_DATE_FORMAT).format(\"D\");\n      }\n    } else if (type === \"weekly\") {\n      if (!isNil(yearStartDate) && !isNil(itemCount)) {\n        currentItemDate = moment(yearStartDate, DEFAULT_DATE_FORMAT)\n          .add(itemCount, \"week\")\n          .endOf(\"week\")\n          .format(DEFAULT_DATE_FORMAT);\n        const weekNumber: any = itemCount + 1;\n        rowItemText = `W${weekNumber}`;\n      }\n    } else if (type === \"monthly\") {\n      if (!isNil(itemCount) && !isNil(year)) {\n        currentItemDate = moment()\n          .year(year)\n          .month(itemCount)\n          .endOf(\"month\")\n          .format(DEFAULT_DATE_FORMAT);\n        rowItemText = moment(currentItemDate, DEFAULT_DATE_FORMAT).format(\"MMM\");\n      }\n    } else if (type === \"quarterly\") {\n      if (!isNil(itemCount) && !isNil(year)) {\n        currentItemDate = moment()\n          .year(year)\n          .quarter(itemCount + 1)\n          .endOf(\"quarter\")\n          .format(DEFAULT_DATE_FORMAT);\n        rowItemText = `Quarter ${itemCount + 1}`;\n      }\n    }\n\n    const { firstDay, lastDay } = this.getFirstLastDay(currentItemDate, type);\n\n    return {\n      itemCount,\n      currentItemDate,\n      rowItemText,\n      firstDay,\n      lastDay\n    };\n  }\n\n  isRowIemValid(options: RowOptions): boolean {\n    let valid = false;\n    const type: string = options.type;\n    const year: string = options.year;\n    const itemCount: number = options.itemCount;\n    const validWeekCount: number = this.getYearlyWeekCount(year);\n\n    if (type === \"daily\") {\n      valid = true;\n    } else if (type === \"weekly\") {\n      if (itemCount < validWeekCount) {\n        valid = true;\n      }\n    } else if (type === \"monthly\") {\n      valid = true;\n    } else if (type === \"quarterly\") {\n      valid = true;\n    }\n\n    return valid;\n  }\n\n  formatStartDate(config: Config, returnFormat: string): string {\n    const startDate: string | number = config ? config.startDate : null;\n    const type: string = config ? config.type : \"\";\n    let formattedStartDate: string = null;\n\n    if (startDate) {\n      formattedStartDate = moment(startDate, DEFAULT_DATE_FORMAT)\n        .startOf(MOMENT_CONVERSION_MAP[type])\n        .format(returnFormat);\n    }\n\n    return formattedStartDate;\n  }\n\n  getSelectedYear(date: string | number): number {\n    return moment(date, DEFAULT_DATE_FORMAT).format(\"YYYY\");\n  }\n\n  getFirstLastDay(date: string, type: string): { firstDay: string; lastDay: string } {\n    let firstDay = \"\";\n    let lastDay = \"\";\n\n    if (type === \"daily\") {\n      firstDay = lastDay = date;\n    } else if (type === \"weekly\") {\n      firstDay = moment(date, DEFAULT_DATE_FORMAT)\n        .startOf(\"week\")\n        .format(DEFAULT_DATE_FORMAT);\n      lastDay = moment(date, DEFAULT_DATE_FORMAT)\n        .endOf(\"week\")\n        .format(DEFAULT_DATE_FORMAT);\n    } else if (type === \"monthly\") {\n      firstDay = moment(date, DEFAULT_DATE_FORMAT)\n        .startOf(\"month\")\n        .format(DEFAULT_DATE_FORMAT);\n      lastDay = moment(date, DEFAULT_DATE_FORMAT)\n        .endOf(\"month\")\n        .format(DEFAULT_DATE_FORMAT);\n    } else if (type === \"quarterly\") {\n      firstDay = moment(date, DEFAULT_DATE_FORMAT)\n        .startOf(\"quarter\")\n        .format(DEFAULT_DATE_FORMAT);\n      lastDay = moment(date, DEFAULT_DATE_FORMAT)\n        .endOf(\"quarter\")\n        .format(DEFAULT_DATE_FORMAT);\n    } else if (type === \"yearly\") {\n      firstDay = moment(date, DEFAULT_DATE_FORMAT)\n        .startOf(\"year\")\n        .format(DEFAULT_DATE_FORMAT);\n      lastDay = moment(date, DEFAULT_DATE_FORMAT)\n        .endOf(\"year\")\n        .format(DEFAULT_DATE_FORMAT);\n    }\n\n    return { firstDay, lastDay };\n  }\n\n  getZoneDate(tz: string, format: string, date?: string): Moment {\n    let _date: number = moment().valueOf();\n\n    if (date) {\n      _date = moment(date, format)\n        .startOf(\"day\")\n        .valueOf();\n    }\n\n    const today = new Date(_date).toLocaleString(\"en-US\", {\n      timeZone: TZ_NAMES[tz]\n    });\n\n    return moment(today, \"MM/DD/YYYY, hh:mm:ss A\");\n  }\n\n  getZoneToday(tz: string, viewDateFormat: string): string {\n    const today: Moment = this.getZoneDate(tz, viewDateFormat);\n    return moment(today).format(`${viewDateFormat}  hh:mm A`);\n  }\n\n  formatToZoneDate(tz: string, format: string, date: string): string {\n    const formattedDate: Moment = this.getZoneDate(tz, format, date);\n    return moment(formattedDate).format(`${format}`);\n  }\n\n  convertToViewTimeItem(item: string | number): string {\n    let stringified_item = item + \"\";\n    if (stringified_item.length === 1) {\n      stringified_item = `0${stringified_item}`;\n    }\n    return stringified_item;\n  }\n\n  getWeekNumber(date: string): string | number {\n    if (date) {\n      const year: number = moment(date, \"YYYY-MM-DD\").year();\n      const month: number = moment(date, \"YYYY-MM-DD\").month();\n      const day: number = Number(moment(date, \"YYYY-MM-DD\").format(\"D\"));\n\n      const yearStartms: Date = new Date(year, 0, 1);\n      const datems: Date = new Date(year, month, day);\n      return Math.ceil(((datems.getTime() - yearStartms.getTime()) / 86400000 + yearStartms.getDay() + 1) / 7);\n    } else {\n      console.warn(`\n        WARN_NGX_DATETIME_RANGE_PICKER | getWeekNumber:\n        Invalid date\n      `);\n      return getNotAvailableText();\n    }\n  }\n\n  iterateOverDateObj(dates: CalendarSides, func) {\n    for (const side in dates) {\n      if (side) {\n        const sideDates = dates[side];\n        sideDates.itemRows.forEach((rows) => {\n          rows.items.forEach((rowItem) => {\n            func(rowItem);\n          });\n        });\n      }\n    }\n  }\n\n  getCalendarColspan(type: string): number {\n    if (type === \"daily\") {\n      return 6;\n    } else if (type === \"weekly\") {\n      return 8;\n    } else if (type === \"monthly\") {\n      return 3;\n    } else if (type === \"quarterly\") {\n      return 1;\n    } else if (type === \"yearly\") {\n      return 1;\n    }\n  }\n\n  getCalendarRowItemColspan(type: string): number {\n    if (type === \"monthly\") {\n      return 3;\n    } else if (type === \"quarterly\") {\n      return 6;\n    } else if (type === \"yearly\") {\n      return 6;\n    }\n  }\n\n  getDateCharacteristics(config: Config, state: State, date: string, month: string, side: string): DateCharacteristics {\n    const currentDate: number = moment(date, DEFAULT_DATE_FORMAT)\n      .startOf(\"day\")\n      .valueOf();\n\n    let _date: string = this.formatDateToDefaultFormat(config.minDate, DEFAULT_DATE_FORMAT);\n    const minDate: number = moment(_date, DEFAULT_DATE_FORMAT)\n      .startOf(\"day\")\n      .valueOf();\n\n    _date = this.formatDateToDefaultFormat(config.maxDate, DEFAULT_DATE_FORMAT);\n    const maxDate: number = moment(_date, DEFAULT_DATE_FORMAT)\n      .startOf(\"day\")\n      .valueOf();\n\n    _date = this.formatDateToDefaultFormat(config.startDate, DEFAULT_DATE_FORMAT);\n    const startDate: number = moment(_date, DEFAULT_DATE_FORMAT)\n      .startOf(\"day\")\n      .valueOf();\n\n    _date = this.formatDateToDefaultFormat(config.endDate, DEFAULT_DATE_FORMAT);\n    const endDate: number = moment(_date, DEFAULT_DATE_FORMAT)\n      .startOf(\"day\")\n      .valueOf();\n\n    const currentMonthStartDate: number = moment(month, \"MMM YYYY\")\n      .startOf(\"month\")\n      .startOf(\"day\")\n      .valueOf();\n    const currentMonthEndDate: number = moment(month, \"MMM YYYY\")\n      .endOf(\"month\")\n      .startOf(\"day\")\n      .valueOf();\n\n    const available: boolean = this.isDateAvailable(\n      currentDate,\n      minDate,\n      maxDate,\n      startDate,\n      endDate,\n      currentMonthStartDate,\n      currentMonthEndDate,\n      config\n    );\n    const inRange: boolean = this.isDateInRange(\n      currentDate,\n      minDate,\n      maxDate,\n      startDate,\n      endDate,\n      currentMonthStartDate,\n      currentMonthEndDate,\n      available,\n      config\n    );\n    const active: boolean = this.isDateActive(currentDate, startDate, endDate, side);\n    const today: boolean = this.isDateToday(currentDate, config);\n\n    // Active\n    if (currentDate === startDate && side === \"left\") {\n      state.activeStartDate = date;\n    } else if (currentDate === endDate && side === \"right\") {\n      state.activeEndDate = date;\n    }\n\n    return { available, inRange, active, today };\n  }\n\n  getLabelProps(\n    state: State,\n    calendarType: string,\n    side: string\n  ): { label: string; labelFormat: string; type: string } {\n    let label: string, labelFormat: string, type: string;\n\n    if (calendarType === \"daily\") {\n      label = `${state.selectedMonth[side]} ${state.selectedYear[side]}`;\n      labelFormat = \"MMM YYYY\";\n      type = \"month\";\n    } else {\n      label = `${state.selectedYear[side]}`;\n      labelFormat = \"YYYY\";\n      type = \"year\";\n    }\n\n    return { label, labelFormat, type };\n  }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\n/**\n * Iterate over {key: value}\n * Returns the keys of the object\n * Usage:\n *    let objKey of obj | ObjNgFor\n * Example:\n *    let obj = {a: 1, b: 2};\n *    *ngFor=\"let key of obj | ObjNgFor\"\n *    {{keys}}: {{obj[key]}}\n */\n\n@Pipe({ name: \"ObjNgFor\", pure: false })\nexport class ObjNgFor implements PipeTransform {\n  public transform(value: any, args: any[] = null): any {\n    return Object.keys(value); // .map(key => value[key]);\n  }\n}\n","import {\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnChanges,\n  Output,\n  SimpleChanges,\n  ViewChild,\n  ViewEncapsulation,\n  Renderer2\n} from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport {\n  DEFAULT_DATE_FORMAT,\n  NgxDatetimeRangePickerConstants as Constants\n} from \"./ngx-datetime-range-picker.constants\";\nimport { NgxDatetimeRangePickerService } from \"./ngx-datetime-range-picker.service\";\nimport { cloneDeep, isEmpty, mergeDeep, isNil } from \"./ngx-datetime-range-picker.utils\";\nimport {\n  Options,\n  Settings,\n  State,\n  RowItemVariables,\n  RowOptions,\n  RowItemOptions,\n  DateSide,\n  ActiveItemSide,\n  DateCharacteristics,\n  DateRangeModel,\n  Config,\n  TimeSide,\n  DateRow,\n  RowVariables,\n  DateTimeRangeChangeOutput,\n  DateTimeRangeModelChangeOutput\n} from \"./interfaces\";\n\ndeclare var require: any;\nconst moment = require(\"moment\");\n\nenum InputFocusBlur {\n  focus = 1,\n  blur = 2\n}\n\nconst DEFAULT_TIME_FORMAT = Constants.DEFAULT.TIME_FORMAT;\nconst USA_TZ_CODE = Constants.CONSTANT.USA_TZ_CODE;\n\n@Component({\n  selector: \"ngx-datetime-range-picker\",\n  templateUrl: \"./ngx-datetime-range-picker.component.html\",\n  styleUrls: [\"./ngx-datetime-range-picker.component.scss\"],\n  encapsulation: ViewEncapsulation.None\n})\nexport class NgxDatetimeRangePickerComponent implements OnChanges {\n  @Input() options: Options;\n  @Input() settings: Settings;\n  @Input() optionService: Observable<any>;\n  @Input() dateRangeModel: Options | DateRangeModel;\n  @Input() canBeEmpty = false;\n  @Output() dateRangeModelChange: EventEmitter<Options | DateRangeModel> = new EventEmitter<Options | DateRangeModel>();\n  @Output() dateRangeChanged: EventEmitter<Options> = new EventEmitter<Options>();\n  @Output() inputFocusBlur: EventEmitter<Object> = new EventEmitter<Object>();\n  @Output() selectedDate: EventEmitter<Options> = new EventEmitter<Options>();\n  @ViewChild(\"filterInputBox\", { static: false }) filterInputBox: any;\n\n  state: State = this.service.getDefaultState();\n\n  config: Config;\n\n  constructor(public element: ElementRef, private renderer: Renderer2, private service: NgxDatetimeRangePickerService) {\n    this.options = this.service.getDefaultOptions();\n    this.settings = this.service.getDefaultSettings();\n    this.config = Object.assign(this.options, this.settings);\n\n    this.state.todayTime = this.service.getZoneToday(this.state.selectedTimezone, this.config.viewDateFormat);\n\n    this.renderer.listen(\"document\", \"click\", (event: MouseEvent) => {\n      if (\n        this.state.isCalendarVisible &&\n        <HTMLElement>event.target &&\n        !(<HTMLElement>event.target).parentElement.getElementsByClassName(\"ngx-datetime-range-picker-select-panel\")\n          .length &&\n        (<HTMLElement>event.target).className !== \"mat-option-text\" &&\n        this.element.nativeElement !== event.target &&\n        !this.element.nativeElement.contains(event.target)\n      ) {\n        this.onCalendarClose(event);\n      }\n    });\n  }\n\n  public ngOnChanges(changes: SimpleChanges) {\n    const { canBeEmpty, settings, dateRangeModel, optionService, options } = changes;\n\n    if (canBeEmpty) {\n      this.canBeEmpty = canBeEmpty.currentValue;\n    }\n\n    if (settings) {\n      this.service.checkSettingsValidity(settings.currentValue as Settings);\n      this.settings = mergeDeep(this.settings, settings.currentValue);\n    }\n\n    if (dateRangeModel) {\n      this.dateRangeModel = dateRangeModel.currentValue;\n    }\n\n    if (dateRangeModel && !dateRangeModel.firstChange) {\n      const previousValue = dateRangeModel.previousValue[this.config.type];\n      const currentValue = dateRangeModel.currentValue[this.config.type];\n      if (\n        previousValue &&\n        currentValue &&\n        previousValue.startDate === currentValue.startDate &&\n        previousValue.endDate === currentValue.endDate\n      ) {\n        return;\n      }\n    }\n\n    if (optionService && optionService.currentValue) {\n      optionService.currentValue.subscribe(\n        (dateOptions: any) => {\n          if (typeof dateOptions === \"object\" && !Array.isArray(dateOptions)) {\n            this.options = dateOptions.plain ? dateOptions.plain() : dateOptions;\n          }\n        },\n        (err) => {\n          console.error(`ERR_NGX_DATETIME_RANGE_PICKER:\n            Filter Call Failure:\n            ${err}\n          `);\n        },\n        () => {\n          this.init();\n        }\n      );\n    }\n\n    if (options) {\n      this.options = options ? options.currentValue : this.options;\n    }\n\n    if (!optionService) {\n      this.init();\n    }\n  }\n\n  // Events\n  onDateRangeInputChange(value: string) {\n    this.dateRangeSelected();\n  }\n\n  setDisabledState(disabled: boolean): void {\n    this.config.componentDisabled = disabled;\n  }\n\n  onComponentClick(): void {\n    this.state.isCalendarVisible = !this.state.isCalendarVisible;\n  }\n\n  onFocusInput(event: any): void {\n    this.inputFocusBlur.emit({\n      reason: InputFocusBlur.focus,\n      value: (<HTMLInputElement>event.target).value\n    });\n  }\n\n  onBlurInput(event: any): void {\n    const value = (<HTMLInputElement>event.target).value;\n    this.state.selectedDateText = value;\n    this.inputFocusBlur.emit({\n      reason: InputFocusBlur.blur,\n      value\n    });\n  }\n\n  onCalendarClose(event: any): void {\n    if (this.config.startDate && this.config.endDate) {\n      if (this.filterInputBox) {\n        this.filterInputBox.nativeElement.classList.remove(\"empty-filter\");\n      }\n      this.state.isCalendarVisible = false;\n    } else {\n      // this.filterInputBox.nativeElement.classList.add('empty-filter');\n    }\n  }\n\n  isPrevAvailable(side): boolean {\n    const { label, labelFormat, type } = this.service.getLabelProps(this.state, this.config.type, side);\n\n    return (\n      moment(label, labelFormat)\n        .startOf(type)\n        .valueOf() >\n      moment(this.config.minDate, DEFAULT_DATE_FORMAT)\n        .startOf(type)\n        .valueOf()\n    );\n  }\n\n  isNextAvailable(side): boolean {\n    const { label, labelFormat, type } = this.service.getLabelProps(this.state, this.config.type, side);\n\n    return (\n      moment(label, labelFormat)\n        .endOf(type)\n        .valueOf() <\n      moment(this.config.maxDate, DEFAULT_DATE_FORMAT)\n        .endOf(type)\n        .valueOf()\n    );\n  }\n\n  getCalendarColspan() {\n    return this.service.getCalendarColspan(this.config.type);\n  }\n\n  getCalendarRowItemColspan() {\n    return this.service.getCalendarRowItemColspan(this.config.type);\n  }\n\n  onClickPrevious(side: string) {\n    const { label, labelFormat, type } = this.service.getLabelProps(this.state, this.config.type, side);\n    const startDate = moment(label, labelFormat)\n      .subtract(1, type)\n      .startOf(type)\n      .format(DEFAULT_DATE_FORMAT);\n\n    this.state.dates[side] = this.generateCalendar(startDate, side);\n  }\n\n  onClickNext(side: string) {\n    const { label, labelFormat, type } = this.service.getLabelProps(this.state, this.config.type, side);\n    const endDate = moment(label, labelFormat)\n      .add(1, type)\n      .endOf(type)\n      .format(DEFAULT_DATE_FORMAT);\n\n    this.state.dates[side] = this.generateCalendar(endDate, side);\n  }\n\n  onCellClick(item: DateCharacteristics, itemCell, side: string) {\n    const date: number = moment(item.date, DEFAULT_DATE_FORMAT).valueOf();\n    const startDate: number = moment(this.config.startDate, DEFAULT_DATE_FORMAT).valueOf();\n    const endDate: number = moment(this.config.endDate, DEFAULT_DATE_FORMAT).valueOf();\n    const minDate: number = moment(this.config.minDate, DEFAULT_DATE_FORMAT).valueOf();\n    const maxDate: number = moment(this.config.maxDate, DEFAULT_DATE_FORMAT).valueOf();\n\n    if (!item.available) {\n      if (date < minDate || date > maxDate) {\n        return;\n      }\n      this.state.dates[side] = this.generateCalendar(item.date, side);\n    }\n\n    if (endDate || date < startDate) {\n      this.config.endDate = null;\n      this.config.startDate = item.date;\n      this.state.activeItem.left = item;\n    } else if (!endDate && date < startDate) {\n      this.config.endDate = cloneDeep(this.config.startDate) as string;\n      this.state.activeItem.right = item;\n    } else {\n      this.config.endDate = item.date;\n      this.state.activeItem.right = item;\n    }\n\n    if (this.config.singleDatePicker) {\n      this.config.endDate = cloneDeep(this.config.startDate) as string;\n      this.state.activeItem.right = this.state.activeItem.left = item;\n    }\n\n    this.doApply();\n  }\n\n  onCellMouseEnter(item: DateCharacteristics, itemCell) {\n    if (!item.available) {\n      return;\n    }\n\n    const date: number = moment(item.date, DEFAULT_DATE_FORMAT).valueOf();\n    const startDate: number = moment(this.config.startDate, DEFAULT_DATE_FORMAT).valueOf();\n    const endDate: number = moment(this.config.endDate, DEFAULT_DATE_FORMAT).valueOf();\n    const hoverItemText: string = itemCell ? itemCell.innerText : \"\";\n    let hoverItemFirstDate: string = itemCell ? itemCell.getAttribute(\"firstDay\") : \"\";\n    let hoverItemLastDate: string = itemCell ? itemCell.getAttribute(\"lastDay\") : \"\";\n\n    hoverItemFirstDate = moment(hoverItemFirstDate, DEFAULT_DATE_FORMAT).format(this.config.viewDateFormat);\n    hoverItemLastDate = moment(hoverItemLastDate, DEFAULT_DATE_FORMAT).format(this.config.viewDateFormat);\n\n    let activeItemInputFieldText = `${hoverItemText} (${hoverItemFirstDate} - ${hoverItemLastDate})`;\n\n    if (this.config.type === \"daily\") {\n      activeItemInputFieldText = `${hoverItemLastDate}`;\n    }\n\n    if (!endDate) {\n      const func = (rowItem) => {\n        if (rowItem.available) {\n          const hoverItemDate = rowItem.date ? moment(rowItem.date, DEFAULT_DATE_FORMAT).valueOf() : rowItem.date;\n          if ((hoverItemDate > startDate && hoverItemDate < date) || date === hoverItemDate) {\n            rowItem.inRange = true;\n            this.state.dateTitleText.right = activeItemInputFieldText;\n          }\n        }\n      };\n\n      this.service.iterateOverDateObj(this.state.dates, func.bind(this));\n    } else {\n      if (this.config.singleDatePicker) {\n        this.state.dateTitleText.right = activeItemInputFieldText;\n      } else {\n        this.state.dateTitleText.left = activeItemInputFieldText;\n      }\n    }\n  }\n\n  onCellMouseLeave() {\n    if (!this.config.endDate) {\n      const func = (rowItem) => {\n        rowItem.inRange = false;\n      };\n      this.service.iterateOverDateObj(this.state.dates, func.bind(this));\n    } else {\n      this.updateActiveItemInputField();\n    }\n  }\n\n  onRangeClick(rangeLabel: string, dateRangeModel: Options) {\n    this.state.activeRange = rangeLabel;\n    if (rangeLabel === \"Custom Range\") {\n      this.state.customRange = true;\n    } else {\n      this.state.customRange = false;\n      this.config.startDate = dateRangeModel.startDate;\n      this.config.endDate = dateRangeModel.endDate;\n      if (this.config.timePicker) {\n        this.state.times = {};\n      }\n      this.setActiveItemOnRangeClick();\n    }\n  }\n\n  updateCalendar() {\n    this.state.sides.length = 0;\n    this.state.dates = {};\n    // takes 223 milliSeconds\n    // Order is important left - right\n    if (!this.config.singleDatePicker) {\n      this.state.sides.push(\"left\");\n      this.state.dates.left = this.generateCalendar(this.config.startDate, \"left\");\n      if (this.config.timePicker) {\n        this.state.times.left = this.generateTimePicker(this.config.startTime, \"left\");\n      }\n    }\n    this.state.sides.push(\"right\");\n    this.state.dates.right = this.generateCalendar(this.config.endDate, \"right\");\n    if (this.config.timePicker) {\n      this.state.times.right = this.generateTimePicker(this.config.endTime, \"right\");\n    }\n  }\n\n  onCalendarLabelChange(label: string, side: string, type: string) {\n    this.state.isCalendarVisible = true;\n    if (type === \"month\") {\n      this.state.selectedMonth[side] = label;\n    } else if (type === \"year\") {\n      this.state.selectedYear[side] = label;\n    }\n\n    if (this.config.type !== \"daily\") {\n      this.state.selectedMonth[side] = \"Jun\";\n    }\n\n    if (this.config.type !== \"yearly\") {\n      const selectedMonth = `${this.state.selectedMonth[side]} ${this.state.selectedYear[side]}`;\n      const date: string = moment(selectedMonth, \"MMM YYYY\")\n        .startOf(\"month\")\n        .format(DEFAULT_DATE_FORMAT);\n      this.state.dates[side] = this.generateCalendar(date, side);\n    } else {\n      if (this.state.selectedYear.left <= this.state.selectedYear.right && side === \"right\") {\n        this.config.startDate = moment(this.state.selectedYear.left, \"YYYY\")\n          .startOf(\"year\")\n          .format(DEFAULT_DATE_FORMAT);\n        this.config.endDate = moment(this.state.selectedYear.right, \"YYYY\")\n          .endOf(\"year\")\n          .format(DEFAULT_DATE_FORMAT);\n\n        this.doApply();\n      }\n      const config = {\n        startDate: moment(this.state.selectedYear.left, \"YYYY\")\n          .startOf(\"year\")\n          .format(DEFAULT_DATE_FORMAT),\n        type: \"yearly\"\n      };\n      const startDate: string = this.service.formatStartDate(config, this.config.viewDateFormat);\n      const endDate: string = this.config.endDate\n        ? moment(this.config.endDate, DEFAULT_DATE_FORMAT).format(this.config.viewDateFormat)\n        : \"\";\n      this.state.dateTitleText.left = `${startDate}`;\n      this.state.dateTitleText.right = `${endDate}`;\n    }\n  }\n\n  onTimeLabelChange(item: string, side: string, timeItem: string) {\n    let time = null;\n    if (side === \"left\") {\n      time = this.config.startTime.split(\":\");\n      if (timeItem === \"hour\") {\n        this.config.startTime = `${item}:${time[1]}`;\n      } else {\n        this.config.startTime = `${time[0]}:${item}`;\n      }\n\n      const startDateEpoch: number = moment(this.config.startDate, DEFAULT_DATE_FORMAT).valueOf();\n      const endDateEpoch: number = moment(this.config.endDate, DEFAULT_DATE_FORMAT).valueOf();\n      if (startDateEpoch === endDateEpoch) {\n        this.state.times.right = this.generateTimePicker(this.config.startTime, \"right\");\n      }\n    } else {\n      time = this.config.endTime.split(\":\");\n      if (timeItem === \"hour\") {\n        this.config.endTime = `${item}:${time[1]}`;\n      } else {\n        this.config.endTime = `${time[0]}:${item}`;\n      }\n    }\n\n    if (timeItem === \"hour\") {\n      this.state.selectedHour[side] = this.service.convertToViewTimeItem(item);\n    } else {\n      this.state.selectedMinute[side] = this.service.convertToViewTimeItem(item);\n    }\n  }\n\n  onTimeApply() {\n    this.dateRangeSelected();\n    this.updateInputField();\n  }\n\n  // Helpers\n  init() {\n    this.state.isValidFilter = false;\n    if (!this.config) {\n      this.config = Object.assign(this.service.getDefaultOptions(), this.service.getDefaultSettings());\n    }\n    this.initialize();\n    this.parseOptions();\n    this.updateInputField();\n  }\n\n  initialize() {\n    this.state = this.service.getDefaultState();\n  }\n\n  parseOptions() {\n    if (this.options !== undefined) {\n      Object.keys(this.options).forEach((k) => {\n        if (!isNil(this.options[k])) {\n          this.config[k] = this.options[k];\n        } else {\n          console.warn(`WARN_NGX_DATETIME_RANGE_PICKER:\n            'options.${k}' is undefined or null. Setting default value.\n          `);\n        }\n      });\n    }\n    if (this.settings !== undefined) {\n      Object.keys(this.settings).forEach((k) => {\n        if (!isNil(this.settings[k])) {\n          this.config[k] = this.settings[k];\n        } else {\n          console.warn(`WARN_NGX_DATETIME_RANGE_PICKER:\n            'settings.${k}' is undefined or null. Setting default value.\n          `);\n        }\n      });\n    }\n\n    // check if inputDateFormat is provided\n    if (!this.config.inputDateFormat) {\n      console.warn(`WARN_NGX_DATETIME_RANGE_PICKER:\n        'inputDateFormat' is required to convert dates.\n        'inputDateFormat' not provided. Setting it to YYYY-MM-DD.\n      `);\n      this.config.inputDateFormat = DEFAULT_DATE_FORMAT;\n    }\n\n    if (this.config.type === \"weekly\" || this.config.type === \"yearly\") {\n      this.config.showRowNumber = false;\n    }\n    if (this.config.singleDatePicker) {\n      this.config.startDate = cloneDeep(this.config.endDate) as string;\n    }\n\n    this.selectTimeZone();\n    this.parseOptionsToDefaultDateFormat();\n    this.processDateRangeModel();\n    this.sanitizeDates();\n    this.processRanges();\n    this.doDateRangeModelChange();\n    this.updateCalendar();\n  }\n\n  selectTimeZone() {\n    if (this.config.timezoneSupport) {\n      if (!this.config.defaultTimezone) {\n        this.config.defaultTimezone = USA_TZ_CODE;\n      }\n      this.state.selectedTimezone = this.config.defaultTimezone;\n    }\n\n    if (this.config.useLocalTimezone) {\n      this.state.selectedTimezone = this.state.localTimezone;\n    }\n    this.onTimezoneChange(this.state.selectedTimezone);\n  }\n\n  parseOptionsToDefaultDateFormat() {\n    this.config.minDate = this.service.formatDateToDefaultFormat(this.config.minDate, this.config.inputDateFormat);\n    this.config.maxDate = this.service.formatDateToDefaultFormat(this.config.maxDate, this.config.inputDateFormat);\n    this.config.startDate = this.service.formatDateToDefaultFormat(this.config.startDate, this.config.inputDateFormat);\n    this.config.endDate = this.service.formatDateToDefaultFormat(this.config.endDate, this.config.inputDateFormat);\n\n    if (this.config.timePicker) {\n      this.config.minTime = this.service.formatTimeToDefaultFormat(this.config.minTime);\n      this.config.maxTime = this.service.formatTimeToDefaultFormat(this.config.maxTime);\n      this.config.startTime = this.service.formatTimeToDefaultFormat(this.config.startTime);\n      this.config.endTime = this.service.formatTimeToDefaultFormat(this.config.endTime);\n    }\n  }\n\n  /**\n   * @desc sets startDate, endDate\n   */\n  processDateRangeModel() {\n    if (undefined === this.dateRangeModel || isEmpty(this.dateRangeModel)) {\n      return;\n    }\n\n    if (!this.dateRangeModel[this.config.type]) {\n      const _optionsKeys: string[] = Object.keys(this.service.getDefaultOptions());\n      const _model = {};\n      Object.keys(this.dateRangeModel).forEach((key: string) => {\n        if (_optionsKeys.includes(key)) {\n          _model[key] = this.dateRangeModel[key];\n          delete this.dateRangeModel[key];\n        }\n      });\n      this.dateRangeModel[this.config.type] = _model;\n      if (!this.dateRangeModel[this.config.type]) {\n        return;\n      }\n    }\n\n    this.config.dateArray = this.dateRangeModel[this.config.type].dateArray || this.config.dateArray;\n\n    this.handleDateArray();\n\n    if (this.config.dateArray.length) {\n      if (!this.dateRangeModel[this.config.type].minDate) {\n        this.dateRangeModel[this.config.type].minDate = this.config.dateArray[0] || this.config.minDate;\n      }\n      if (!this.dateRangeModel[this.config.type].maxDate) {\n        this.dateRangeModel[this.config.type].maxDate =\n          this.config.dateArray[this.config.dateArray.length - 1] || this.config.maxDate;\n      }\n      if (!this.dateRangeModel[this.config.type].startDate) {\n        this.dateRangeModel[this.config.type].startDate = this.config.dateArray[0] || this.config.startDate;\n      }\n      if (!this.dateRangeModel[this.config.type].endDate) {\n        this.dateRangeModel[this.config.type].endDate =\n          this.config.dateArray[this.config.dateArray.length - 1] || this.config.endDate;\n      }\n    }\n\n    const dateRangeMinDate = this.dateRangeModel[this.config.type].minDate || this.config.minDate;\n    const dateRangeMaxDate = this.dateRangeModel[this.config.type].maxDate || this.config.maxDate;\n    const dateRangeStartDate = this.dateRangeModel[this.config.type].startDate || this.config.startDate;\n    const dateRangeEndDate = this.dateRangeModel[this.config.type].endDate || this.config.endDate;\n\n    this.config.minDate = this.service.formatDateToDefaultFormat(dateRangeMinDate, this.config.inputDateFormat);\n    this.config.maxDate = this.service.formatDateToDefaultFormat(dateRangeMaxDate, this.config.inputDateFormat);\n    this.config.startDate = this.service.formatDateToDefaultFormat(dateRangeStartDate, this.config.inputDateFormat);\n    this.config.endDate = this.service.formatDateToDefaultFormat(dateRangeEndDate, this.config.inputDateFormat);\n\n    if (this.config.timePicker) {\n      const dateRangeMinTime = this.dateRangeModel[this.config.type].minTime || this.config.minTime;\n      const dateRangeMaxTime = this.dateRangeModel[this.config.type].maxTime || this.config.maxTime;\n      const dateRangeStartTime = this.dateRangeModel[this.config.type].startTime || this.config.startTime;\n      const dateRangeEndTime = this.dateRangeModel[this.config.type].endTime || this.config.endTime;\n\n      this.config.minTime = this.service.formatTimeToDefaultFormat(dateRangeMinTime);\n      this.config.maxTime = this.service.formatTimeToDefaultFormat(dateRangeMaxTime);\n      this.config.startTime = this.service.formatTimeToDefaultFormat(dateRangeStartTime);\n      this.config.endTime = this.service.formatTimeToDefaultFormat(dateRangeEndTime);\n    }\n  }\n\n  /**\n   * @desc sets minDate, maxDate, startDate, endDate if not passed\n   */\n  handleDateArray() {\n    if (this.config.dateArray && this.config.dateArray.length) {\n      // converts all the dates to DEFAULT_DATE_FORMAT\n      this.config.dateArray = this.service.getSanitizedDateArray(this.config);\n\n      // sort in asc order\n      this.config.dateArray = this.config.dateArray.sort((date1, date2) => {\n        const value1: number = moment(date1, DEFAULT_DATE_FORMAT).valueOf();\n        const value2: number = moment(date2, DEFAULT_DATE_FORMAT).valueOf();\n        return value1 - value2;\n      });\n    }\n  }\n\n  sanitizeDates() {\n    const subtractWeekCount = 0;\n    const setDate = (type: string) => {\n      this.config.minDate = moment(this.config.minDate, DEFAULT_DATE_FORMAT)\n        .endOf(type)\n        .format(DEFAULT_DATE_FORMAT);\n      this.config.maxDate =\n        type === \"week\"\n          ? moment(this.config.maxDate, DEFAULT_DATE_FORMAT)\n              .subtract(subtractWeekCount, \"week\")\n              .endOf(type)\n              .format(DEFAULT_DATE_FORMAT)\n          : moment(this.config.maxDate, DEFAULT_DATE_FORMAT)\n              .endOf(type)\n              .format(DEFAULT_DATE_FORMAT);\n      this.config.startDate = moment(this.config.startDate, DEFAULT_DATE_FORMAT)\n        .endOf(type)\n        .format(DEFAULT_DATE_FORMAT);\n      this.config.endDate =\n        type === \"week\"\n          ? moment(this.config.endDate, DEFAULT_DATE_FORMAT)\n              .subtract(subtractWeekCount, \"week\")\n              .endOf(type)\n              .format(DEFAULT_DATE_FORMAT)\n          : moment(this.config.endDate, DEFAULT_DATE_FORMAT)\n              .endOf(type)\n              .format(DEFAULT_DATE_FORMAT);\n    };\n\n    if (this.config.type === \"weekly\") {\n      setDate.bind(this)(\"week\");\n    } else if (this.config.type === \"monthly\") {\n      setDate.bind(this)(\"month\");\n    } else if (this.config.type === \"quarterly\") {\n      setDate.bind(this)(\"quarter\");\n    } else if (this.config.type === \"yearly\") {\n      setDate.bind(this)(\"year\");\n    }\n\n    if (\n      moment(this.config.startDate, DEFAULT_DATE_FORMAT).valueOf() <\n      moment(this.config.minDate, DEFAULT_DATE_FORMAT).valueOf()\n    ) {\n      this.config.minDate = this.config.startDate;\n    }\n\n    if (\n      moment(this.config.endDate, DEFAULT_DATE_FORMAT).valueOf() >\n      moment(this.config.maxDate, DEFAULT_DATE_FORMAT).valueOf()\n    ) {\n      this.config.maxDate = this.config.endDate;\n    }\n  }\n\n  processRanges() {\n    if (this.config.showRanges && !this.config.singleDatePicker) {\n      this.config.availableRanges = this.service.createDefaultRanges(this.config);\n      this.selectActiveRange();\n    } else {\n      this.state.activeRange = \"Custom Range\";\n      this.onRangeClick(this.state.activeRange, null);\n    }\n  }\n\n  selectActiveRange() {\n    for (const range in this.config.availableRanges) {\n      if (range) {\n        const rangeModel = this.config.availableRanges[range];\n        if (this.config.startDate === rangeModel.startDate && this.config.endDate === rangeModel.endDate) {\n          this.state.activeRange = range;\n          this.updateActiveItem();\n        }\n      }\n    }\n\n    if (!this.state.activeRange) {\n      this.state.activeRange = \"Custom Range\";\n      this.onRangeClick(this.state.activeRange, null);\n    }\n  }\n\n  generateCalendar(date: string | number, side: string): DateSide {\n    this.state.selectedMonth[side] = moment(date, DEFAULT_DATE_FORMAT).format(\"MMM\");\n    this.state.selectedYear[side] = this.service.getSelectedYear(date);\n    const calendarLabel = `${this.state.selectedMonth[side]} ${this.state.selectedYear[side]}`;\n\n    const dates: DateSide = {\n      label: calendarLabel,\n      months: this.service.getMonthsAvailable(this.config.minDate, this.config.maxDate, this.state.selectedYear[side]),\n      years: this.service.getYearsAvailable(this.config),\n      itemRows: [] as Object[]\n    };\n\n    this.state.weekDayOptions = [\"\"];\n\n    if (this.config.type !== \"yearly\") {\n      // moment returns wrong week number\n      const monthStartWeekNumber: number = moment(date, DEFAULT_DATE_FORMAT)\n        .year(this.state.selectedYear[side])\n        .startOf(\"month\")\n        .week(); // previousMonthLastWeek\n      const yearStartDate = moment(this.state.selectedYear[side], \"YYYY\")\n        .startOf(\"year\")\n        .format(DEFAULT_DATE_FORMAT);\n      let numberOfRows = 1;\n\n      if (this.config.type === \"daily\") {\n        numberOfRows = this.service.getNumberOfWeeks(date);\n        this.state.weekDayOptions = [\"su\", \"mo\", \"tu\", \"we\", \"th\", \"fr\", \"sa\"];\n      } else if (this.config.type === \"weekly\") {\n        numberOfRows = 8;\n        this.state.weekDayOptions = [\"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n      } else if (this.config.type === \"monthly\") {\n        numberOfRows = 4;\n        this.state.weekDayOptions = [\"\", \"\", \"\"];\n      } else if (this.config.type === \"quarterly\") {\n        numberOfRows = 4;\n        this.state.weekDayOptions = [\"\"];\n      }\n\n      for (let dateRows = 0; dateRows < numberOfRows; dateRows++) {\n        const dateRowObj: DateRow = {\n          rowNumber: null as string,\n          rowNumberText: null as string,\n          items: [] as DateCharacteristics[]\n        };\n\n        const rowOptions: RowOptions = {\n          type: this.config.type,\n          monthStartWeekNumber: monthStartWeekNumber,\n          dateRows: dateRows,\n          year: this.state.selectedYear[side],\n          itemCount: null\n        };\n\n        const { rowNumber, columns }: RowVariables = this.service.getCalendarRowVariables(rowOptions);\n\n        dateRowObj.rowNumber = rowNumber;\n        dateRowObj.rowNumberText = this.service.getCalendarRowNumberText(this.config.type, rowNumber);\n\n        for (let rowItem = 0; rowItem <= columns; rowItem++) {\n          const rowItemOptions: RowItemOptions = {\n            type: this.config.type,\n            monthStartWeekNumber,\n            dateRows,\n            rowNumber,\n            yearStartDate,\n            year: this.state.selectedYear[side],\n            rowItem,\n            columns\n          };\n\n          const {\n            currentItemDate,\n            rowItemText,\n            firstDay,\n            lastDay,\n            itemCount\n          }: RowItemVariables = this.service.getCalendarRowItemVariables(rowItemOptions);\n\n          rowOptions.itemCount = itemCount;\n\n          const { available, inRange, active, today }: DateCharacteristics = this.service.getDateCharacteristics(\n            this.config,\n            this.state,\n            currentItemDate,\n            calendarLabel,\n            side\n          );\n\n          const itemObj: ActiveItemSide = {\n            date: currentItemDate,\n            rowItemText,\n            firstDay,\n            lastDay,\n            available,\n            inRange,\n            active,\n            today\n          };\n          if (this.service.isRowIemValid(rowOptions)) {\n            if (active) {\n              this.state.activeItem[side] = itemObj;\n            }\n            dateRowObj.items.push(itemObj);\n          }\n        }\n        dates.itemRows.push(dateRowObj);\n      }\n    }\n\n    this.state.calendarAvailable[side] = true;\n\n    // generate month/year select\n    setTimeout(() => {\n      const options = {\n        side,\n        onChange: this.onCalendarLabelChange.bind(this),\n        type: \"month\",\n        items: dates[\"months\"],\n        selected: this.state.selectedMonth[side]\n      };\n      this.printSelect(options);\n\n      options.type = \"year\";\n      options.items = dates[\"years\"];\n      options.selected = this.state.selectedYear[side];\n      this.printSelect(options);\n    });\n    return dates;\n  }\n\n  generateTimePicker(time: string, side: string): TimeSide {\n    const timeObject: TimeSide = {\n      hour: [],\n      minute: [],\n      meridian: []\n    };\n\n    let startHour = 0;\n    const endHour = 23;\n    let startMinute = 0;\n    const endMinute = 59;\n    let selectedHour = side === \"left\" ? startHour : endHour;\n    let selectedMinute = side === \"left\" ? startMinute : endMinute;\n    const startDateEpoch = moment(this.config.startDate, DEFAULT_DATE_FORMAT).valueOf();\n    const endDateEpoch = moment(this.config.endDate, DEFAULT_DATE_FORMAT).valueOf();\n\n    if (time) {\n      selectedHour = moment(time, DEFAULT_TIME_FORMAT).format(\"H\");\n      selectedMinute = moment(time, DEFAULT_TIME_FORMAT).format(\"m\");\n\n      if (side === \"right\" && startDateEpoch === endDateEpoch) {\n        startHour = selectedHour;\n        startMinute = selectedMinute;\n      }\n    }\n\n    // let dateOptions = {\n    //   timeZone: TZ_NAMES[this.state.selectedTimezone],\n    //   timeZoneName: 'short',\n    //   hour12: false\n    // }\n    // let startDateObj = new Date(`Jan 1 1970 ${startHour}:${startMinute}:00 GMT-0700 (Mountain Standard Time)`);\n    // let endDateObj = new Date(`Jan 1 1970 ${endHour}:${endMinute}:00 GMT-0700 (Mountain Standard Time)`);\n    // startTime = startDateObj.toLocaleTimeString('en-US', dateOptions);\n    // endTime = endDateObj.toLocaleTimeString('en-US', dateOptions);\n\n    // startHour = moment(startTime, 'HH:mm:ss').format('H');\n    // endHour = moment(endTime, 'HH:mm:ss').format('H');\n    // startMinute = moment(startTime, 'HH:mm:ss').format('m');\n    // endMinute = moment(endTime, 'HH:mm:ss').format('m');\n\n    for (let h = startHour; h <= 23; h++) {\n      const stringified_h = this.service.convertToViewTimeItem(h);\n      timeObject.hour.push(stringified_h);\n    }\n    for (let m = startMinute; m <= 59; m++) {\n      const stringified_m = this.service.convertToViewTimeItem(m);\n      timeObject.minute.push(stringified_m);\n    }\n\n    this.state.selectedHour[side] = this.service.convertToViewTimeItem(selectedHour);\n    this.state.selectedMinute[side] = this.service.convertToViewTimeItem(selectedMinute);\n\n    if (side === \"left\") {\n      this.config.startTime = `${this.state.selectedHour[side]}:${this.state.selectedMinute[side]}`;\n    } else if (side === \"right\") {\n      this.config.endTime = `${this.state.selectedHour[side]}:${this.state.selectedMinute[side]}`;\n    }\n\n    // generate hour/minute select\n    setTimeout(() => {\n      const options = {\n        side,\n        onChange: this.onTimeLabelChange.bind(this),\n        type: \"hour\",\n        items: timeObject[\"hour\"],\n        selected: this.state.selectedHour[side]\n      };\n      this.printSelect(options);\n\n      options.type = \"minute\";\n      options.items = timeObject[\"minute\"];\n      options.selected = this.state.selectedMinute[side];\n      this.printSelect(options);\n    });\n    return timeObject;\n  }\n\n  updateInputField() {\n    const startDate = this.service.formatStartDate(this.config, this.config.viewDateFormat);\n    const endDate = this.config.endDate\n      ? moment(this.config.endDate, DEFAULT_DATE_FORMAT).format(this.config.viewDateFormat)\n      : \"\";\n\n    if (this.config.singleDatePicker) {\n      let startDateText = startDate;\n      let endDataText = endDate;\n      let dateText = \"\";\n\n      if (this.config.timePicker) {\n        startDateText = `${startDate} ${this.config.startTime}`;\n        endDataText = `${endDate} ${this.config.endTime}`;\n      }\n      if (this.config.displayBeginDate) {\n        dateText = `${startDateText}`;\n      } else if (this.config.displayEndDate) {\n        dateText = `${endDataText}`;\n      } else {\n        dateText = `${startDateText} - ${endDataText}`;\n      }\n\n      this.state.selectedDateText = dateText;\n    } else {\n      let startDateText = startDate;\n      let endDataText = endDate;\n\n      if (this.config.timePicker) {\n        startDateText = `${startDate} ${this.config.startTime}`;\n        endDataText = `${endDate} ${this.config.endTime}`;\n      }\n\n      this.state.selectedDateText = `${startDateText} - ${endDataText}`;\n    }\n\n    if (this.canBeEmpty || this.state.selectedDateText.indexOf(\"nvalid\") < 0) {\n      this.state.isValidFilter = true;\n    }\n\n    if (this.config.type === \"yearly\") {\n      this.state.dateTitleText.left = `${startDate}`;\n      this.state.dateTitleText.right = `${endDate}`;\n    } else {\n      this.updateActiveItemInputField();\n    }\n  }\n\n  updateActiveItemInputField() {\n    if (!this.config.singleDatePicker) {\n      this.updateSide(\"left\");\n    }\n    this.updateSide(\"right\");\n  }\n\n  updateSide(side: string) {\n    let itemFirstDate = this.state.activeItem[side].firstDay;\n    let itemLastDate = this.state.activeItem[side].lastDay;\n    const itemText = this.state.activeItem[side].rowItemText;\n    itemFirstDate = moment(itemFirstDate, DEFAULT_DATE_FORMAT).format(this.config.viewDateFormat);\n    itemLastDate = moment(itemLastDate, DEFAULT_DATE_FORMAT).format(this.config.viewDateFormat);\n    if (this.config.type !== \"daily\") {\n      this.state.dateTitleText[side] = `${itemText} (${itemFirstDate} - ${itemLastDate})`;\n    } else {\n      this.state.dateTitleText[side] = `${itemFirstDate}`;\n    }\n  }\n\n  dateRangeSelected() {\n    const dateRangeModel: DateTimeRangeChangeOutput = this.getNgxDatetimeRangeChangeOutput();\n    this.state.isCalendarVisible = false;\n    if (this.filterInputBox) {\n      this.filterInputBox.nativeElement.classList.remove(\"empty-filter\");\n    }\n    this.doDateRangeModelChange();\n    this.dateRangeChanged.emit(dateRangeModel);\n  }\n\n  doDateRangeModelChange() {\n    const dateRangeModel: DateTimeRangeModelChangeOutput = this.getDateRangeModel(this.config.inputDateFormat);\n    this.dateRangeModelChange.emit(dateRangeModel);\n  }\n\n  getDateRangeModel(format?: string): DateTimeRangeModelChangeOutput {\n    let dRModel: DateTimeRangeModelChangeOutput = {};\n    if (undefined !== this.dateRangeModel && !isEmpty(this.dateRangeModel)) {\n      dRModel = cloneDeep(this.dateRangeModel) as {};\n    }\n    dRModel[this.config.type] = this.getNgxDatetimeRangeChangeOutput(format);\n    return dRModel;\n  }\n\n  getNgxDatetimeRangeChangeOutput(format?: string): DateTimeRangeChangeOutput {\n    let dateRangeChangeOutput: DateTimeRangeChangeOutput;\n    let outputDateFormat: string = this.config.outputDateFormat;\n    if (undefined !== format) {\n      outputDateFormat = format;\n    }\n    let startDate = this.service.formatStartDate(this.config, outputDateFormat);\n    let endDate = moment(this.config.endDate, DEFAULT_DATE_FORMAT).format(outputDateFormat);\n\n    if (this.config.selectedTimezone) {\n      startDate = this.service.formatToZoneDate(this.config.selectedTimezone, outputDateFormat, startDate);\n      endDate = this.service.formatToZoneDate(this.config.selectedTimezone, outputDateFormat, endDate);\n    }\n\n    dateRangeChangeOutput = {\n      activeRange: this.state.activeRange,\n      startDate,\n      endDate\n    };\n\n    if (this.config.timePicker) {\n      const startTime = this.config.startTime;\n      const endTime = this.config.endTime;\n\n      dateRangeChangeOutput = {\n        activeRange: this.state.activeRange,\n        startDate,\n        endDate,\n        startTime,\n        endTime\n      };\n    }\n\n    return dateRangeChangeOutput;\n  }\n\n  doApply() {\n    const startDate = this.config.startDate;\n    const endDate = this.config.endDate;\n\n    this.state.activeStartDate = startDate as string;\n    this.state.activeEndDate = endDate as string;\n\n    if (this.config.startDate && this.config.endDate) {\n      if (!this.config.timePicker) {\n        this.dateRangeSelected();\n      } else {\n        if (this.config.timePicker) {\n          this.state.sides.forEach((side) => {\n            this.state.times[side] = this.generateTimePicker(null, side);\n          });\n        }\n      }\n    }\n\n    let outputStartDate = startDate ? moment(startDate, DEFAULT_DATE_FORMAT).valueOf() : null;\n    let outputEndDate = endDate ? moment(endDate, DEFAULT_DATE_FORMAT).valueOf() : null;\n    if (this.config.outputDateFormat) {\n      outputStartDate = startDate ? moment(startDate, DEFAULT_DATE_FORMAT).format(this.config.outputDateFormat) : null;\n      outputEndDate = endDate ? moment(endDate, DEFAULT_DATE_FORMAT).format(this.config.outputDateFormat) : null;\n    }\n    this.selectedDate.emit({\n      startDate: outputStartDate,\n      endDate: outputEndDate\n    });\n\n    this.updateInputField();\n  }\n\n  onTimezoneChange(tz: string) {\n    this.state.selectedTimezone = tz;\n    this.state.todayTime = this.service.getZoneToday(this.state.selectedTimezone, this.config.viewDateFormat);\n\n    this.parseOptionsToDefaultDateFormat();\n    this.state.sides.forEach((side) => {\n      let date = this.config.startDate;\n      let time = this.config.startTime;\n      if (side === \"right\") {\n        date = this.config.endDate;\n        time = this.config.endTime;\n      }\n      this.state.dates[side] = this.generateCalendar(date, side);\n      if (this.config.timePicker) {\n        this.state.times[side] = this.generateTimePicker(time, side);\n      }\n    });\n  }\n\n  getSelectedTimeItemText(item: string, side: string) {\n    if (item === \"hour\") {\n      return this.state.selectedHour[side];\n    } else if (item === \"minute\") {\n      return this.state.selectedMinute[side];\n    }\n  }\n\n  setActiveItemOnRangeClick() {\n    this.updateActiveItem();\n    this.doApply();\n  }\n\n  updateActiveItem() {\n    const startDate: ActiveItemSide = this.service.getFirstLastDay(this.config.startDate as string, this.config.type);\n    const endDate: ActiveItemSide = this.service.getFirstLastDay(this.config.endDate as string, this.config.type);\n\n    if (this.config.type === \"weekly\") {\n      startDate.rowItemText = `W${this.service.getWeekNumber(startDate.firstDay)}`;\n      endDate.rowItemText = `W${this.service.getWeekNumber(endDate.firstDay)}`;\n    } else if (this.config.type === \"monthly\") {\n      startDate.rowItemText = `${moment(startDate.firstDay, DEFAULT_DATE_FORMAT).format(\"MMM\")}`;\n      endDate.rowItemText = `${moment(endDate.firstDay, DEFAULT_DATE_FORMAT).format(\"MMM\")}`;\n    } else if (this.config.type === \"quarterly\") {\n      startDate.rowItemText = `Quarter ${moment(startDate.firstDay, DEFAULT_DATE_FORMAT).quarter()}`;\n      endDate.rowItemText = `Quarter ${moment(endDate.firstDay, DEFAULT_DATE_FORMAT).quarter()}`;\n    }\n\n    Object.assign(this.state.activeItem.left, startDate);\n    Object.assign(this.state.activeItem.right, endDate);\n\n    // this.doApply();\n  }\n\n  /* ------------------------------------------ */\n  printSelect(options: { type: string; side: string; items: string[]; selected: string; onChange: Function }) {\n    let optionHTML = \"\";\n    options.items.forEach((item) => {\n      optionHTML += `\n        <option\n          class=\"dropdown-item\"\n          value=${item}\n          selected=${options.selected === item}\n        >\n          ${item}\n        </option>\n      `;\n    });\n\n    const selectEl = `\n      <select\n        class=\"${options.type}-select ngx-datetime-range-picker-select-panel ${options.type}-select-panel\">\n        ${optionHTML}\n      </select>\n    `;\n\n    const selectContainerEl = document.getElementById(`${options.type}Select`);\n    if (selectContainerEl) {\n      selectContainerEl.innerHTML = selectEl;\n      selectContainerEl.getElementsByTagName(\"select\")[0].addEventListener(\"change\", (e) => {\n        options.onChange(e, options.side, options.type);\n      });\n    }\n  }\n}\n","<div class=\"ngx-datetime-range-picker\">\n  <div class=\"date-input\">\n    <mat-form-field class=\"full-width\">\n      <span matPrefix>\n        <mat-icon fontSet=\"fa\" fontIcon=\"fa-calendar\"></mat-icon>\n        &nbsp;&nbsp;\n      </span>\n\n      <span matPrefix *ngIf=\"state.selectedTimezone\" class=\"timezone-info active-timezone\">\n        {{ state.selectedTimezone }}\n      </span>\n      <input\n        matInput\n        #filterInputBox\n        type=\"text\"\n        [ngClass]=\"{\n          'config.inputClass': 'config.inputClass'\n        }\"\n        class=\"dateSelect\"\n        [attr.aria-label]=\"config.ariaLabels.inputField\"\n        (click)=\"onComponentClick()\"\n        placeholder=\"{{ config.placeholder }}\"\n        [ngModel]=\"state.selectedDateText\"\n        (ngModelChange)=\"onDateRangeInputChange($event)\"\n        (keyup)=\"onCalendarClose($event)\"\n        (focus)=\"onFocusInput($event)\"\n        (blur)=\"onBlurInput($event)\"\n        [value]=\"state.selectedDateText\"\n        [disabled]=\"config.componentDisabled\"\n        autocomplete=\"off\"\n        spellcheck=\"false\"\n        autocorrect=\"off\"\n        readonly\n      />\n    </mat-form-field>\n  </div>\n  <div *ngIf=\"state.isCalendarVisible\" class=\"calendar-view\">\n    <div class=\"date-select\">\n      <div style=\"position: relative;\">\n        <div *ngIf=\"config.timezoneSupport\" class=\"list-inline timezone-select\">\n          <div class=\"timeZones\">\n            <div\n              *ngFor=\"let tz of state.timeZones; let last = last\"\n              class=\"timezone\"\n              [ngClass]=\"{\n                'border-separator': !last,\n                'active-timezone': state.selectedTimezone == tz\n              }\"\n              (click)=\"onTimezoneChange(tz)\"\n            >\n              {{ tz }}\n            </div>\n          </div>\n          <div class=\"currentTime\">\n            <span class=\"today-text\">Today</span>: <span class=\"active-timezone\">{{ state.todayTime }}</span>\n          </div>\n        </div>\n        <ul class=\"list-inline calendar-container\">\n          <li *ngFor=\"let side of state.sides; let lastSide = last\" class=\"calendar\" [ngClass]=\"side\">\n            <div class=\"dateTitleInput\">\n              <mat-form-field class=\"full-width\">\n                <input matInput type=\"text\" class=\"dateSelect\" [ngModel]=\"state.dateTitleText[side]\" readonly />\n              </mat-form-field>\n            </div>\n            <div class=\"calendar-table\">\n              <div *ngIf=\"!state.calendarAvailable[side]\" class=\"calendar-loading\">\n                <!-- <m-loading></m-loading> -->\n              </div>\n              <div\n                *ngIf=\"state.calendarAvailable[side]\"\n                class=\"calendar-side-container\"\n                style=\"min-width: 250px; position: relative;\"\n              >\n                <div class=\"calendar-label-container\">\n                  <div class=\"prev\">\n                    <mat-icon\n                      [ngClass]=\"{\n                        disabled: !isPrevAvailable(side),\n                        available: isPrevAvailable(side)\n                      }\"\n                      fontSet=\"fa\"\n                      fontIcon=\"fa-chevron-left\"\n                      (click)=\"onClickPrevious(side)\"\n                    ></mat-icon>\n                  </div>\n                  <div [attr.colspan]=\"getCalendarColspan()\" class=\"calendar-label\">\n                    <div class=\"date-dropdown-container\" style=\"position: relative;\">\n                      <div *ngIf=\"config.type == 'daily'\" class=\"date-dropdown\">\n                        <mat-form-field>\n                          <mat-select\n                            class=\"month-select\"\n                            panelClass=\"ngx-datetime-range-picker-select-panel month-select-panel\"\n                            [value]=\"state.selectedMonth[side]\"\n                            (selectionChange)=\"onCalendarLabelChange($event.value, side, 'month')\"\n                          >\n                            <mat-option\n                              class=\"dropdown-item\"\n                              *ngFor=\"let month of state.dates[side]['months']\"\n                              [value]=\"month\"\n                            >\n                              {{ month }}\n                            </mat-option>\n                          </mat-select>\n                        </mat-form-field>\n                      </div>\n                      <div class=\"date-dropdown\">\n                        <mat-form-field>\n                          <mat-select\n                            class=\"year-select\"\n                            panelClass=\"ngx-datetime-range-picker-select-panel year-select-panel\"\n                            [value]=\"state.selectedYear[side]\"\n                            (selectionChange)=\"onCalendarLabelChange($event.value, side, 'year')\"\n                          >\n                            <mat-option\n                              class=\"dropdown-item\"\n                              *ngFor=\"let year of state.dates[side]['years']\"\n                              [value]=\"year\"\n                            >\n                              {{ year }}\n                            </mat-option>\n                          </mat-select>\n                        </mat-form-field>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"next\">\n                    <mat-icon\n                      [ngClass]=\"{\n                        disabled: !isNextAvailable(side),\n                        available: isNextAvailable(side)\n                      }\"\n                      fontSet=\"fa\"\n                      fontIcon=\"fa-chevron-right\"\n                      (click)=\"onClickNext(side)\"\n                    ></mat-icon>\n                  </div>\n                </div>\n                <table>\n                  <thead>\n                    <tr>\n                      <th *ngIf=\"config.showRowNumber\" class=\"rowNumber\"></th>\n                      <th *ngFor=\"let day of state.weekDayOptions\" class=\"calendar-week-day capitalize\">{{ day }}</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr *ngFor=\"let row of state.dates[side]['itemRows']\">\n                      <td *ngIf=\"config.showRowNumber && row.rowNumberText\" class=\"rowNumber\">\n                        {{ row.rowNumberText }}\n                      </td>\n                      <td\n                        #itemCell\n                        *ngFor=\"let item of row.items\"\n                        [attr.firstDay]=\"item.firstDay\"\n                        [attr.lastDay]=\"item.lastDay\"\n                        [ngClass]=\"{\n                          available: item.available,\n                          'in-range': item.inRange,\n                          active:\n                            (state.activeStartDate == item.date && side == 'left') ||\n                            (state.activeEndDate == item.date && side == 'right'),\n                          today: item.today\n                        }\"\n                        (click)=\"onCellClick(item, itemCell, side)\"\n                        (mouseover)=\"onCellMouseEnter(item, itemCell)\"\n                        (mouseleave)=\"onCellMouseLeave()\"\n                      >\n                        <div>{{ item.rowItemText }}</div>\n                      </td>\n                    </tr>\n                  </tbody>\n                </table>\n              </div>\n            </div>\n          </li>\n        </ul>\n        <ul *ngIf=\"config.timePicker\" class=\"list-inline time-picker-container\">\n          <li *ngFor=\"let side of state.sides; let lastSide = last\" class=\"time-select\" [ngClass]=\"side\">\n            <div class=\"clock-icon-container\">\n              <mat-icon fontSet=\"fa\" fontIcon=\"fa-clock-o\" class=\"fa-lg\" aria-hidden=\"true\"></mat-icon>\n            </div>\n            <div *ngFor=\"let timeItem of state.timeItems\" class=\"d-inline-block time-item-container\">\n              <mat-form-field>\n                <mat-select\n                  class=\"timeItem-select\"\n                  panelClass=\"ngx-datetime-range-picker-select-panel timeItem-select-panel\"\n                  [value]=\"getSelectedTimeItemText(timeItem, side)\"\n                  (selectionChange)=\"onTimeLabelChange(timeItem, side, $event.value)\"\n                >\n                  <mat-option class=\"dropdown-item\" *ngFor=\"let item of state.times[side][timeItem]\" [value]=\"item\">\n                    {{ item }}\n                  </mat-option>\n                </mat-select>\n              </mat-form-field>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div *ngIf=\"(!config.singleDatePicker && config.showRanges) || config.timePicker\" class=\"ranges\">\n        <button\n          mat-button\n          *ngFor=\"let range of config.availableRanges | ObjNgFor\"\n          class=\"calendar-range\"\n          [ngClass]=\"{ 'active-range': range == state.activeRange }\"\n          (click)=\"onRangeClick(range, config.availableRanges[range])\"\n        >\n          {{ range }}\n        </button>\n        <div\n          *ngIf=\"config.timePicker && state.customRange\"\n          class=\"range-select-button-container\"\n          [ngClass]=\"{\n            'range-select-button-bottom': (config.availableRanges | json) != '{}'\n          }\"\n        >\n          <button mat-button class=\"range-select-button range-select-apply-button\" (click)=\"onTimeApply()\">\n            Apply\n          </button>\n          <button mat-button class=\"range-select-button range-select-cancel-button\" (click)=\"onTimeApply()\">\n            Cancel\n          </button>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n","import {NgModule} from \"@angular/core\";\nimport {MatButtonModule} from \"@angular/material/button\";\nimport {MatFormFieldModule} from \"@angular/material/form-field\";\nimport {MatIconModule} from \"@angular/material/icon\";\nimport {MatInputModule} from \"@angular/material/input\";\nimport {MatSelectModule} from \"@angular/material/select\";\n\nconst modules = [MatFormFieldModule, MatButtonModule, MatInputModule, MatIconModule, MatSelectModule];\n\n@NgModule({\n  imports: modules,\n  exports: modules\n})\nexport class MaterialModule {\n}\n","import { NgModule, ModuleWithProviders, Optional, SkipSelf } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\nimport { MaterialModule } from \"./material/material.module\";\nimport { NgxDatetimeRangePickerComponent } from \"./ngx-datetime-range-picker.component\";\nimport { ObjNgFor } from \"./pipes/objNgFor.pipe\";\nimport { NgxDatetimeRangePickerService } from \"./ngx-datetime-range-picker.service\";\n\n@NgModule({\n  declarations: [ObjNgFor, NgxDatetimeRangePickerComponent],\n  imports: [CommonModule, FormsModule, MaterialModule],\n  exports: [NgxDatetimeRangePickerComponent, MaterialModule]\n})\nexport class NgxDatetimeRangePickerModule {\n  constructor(@Optional() @SkipSelf() parentModule: NgxDatetimeRangePickerModule) {\n    if (parentModule) {\n      throw new Error(`ERR_NGX_DATETIME_RANGE_PICKER:\n        NgxDatetimeRangePickerModule is already loaded. Import it in the AppModule only`);\n    }\n  }\n\n  public static forRoot(): ModuleWithProviders<NgxDatetimeRangePickerModule> {\n    return {\n      ngModule: NgxDatetimeRangePickerModule,\n      providers: [NgxDatetimeRangePickerService]\n    };\n  }\n}\n","/*\n * Public API Surface of ngx-datetime-range-picker\n */\n\nexport * from \"./lib/ngx-datetime-range-picker.service\";\nexport * from \"./lib/ngx-datetime-range-picker.component\";\nexport * from \"./lib/ngx-datetime-range-picker.module\";\nexport * from \"./lib/interfaces\";\nexport * from \"./lib/material/material.module\"\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["moment","USA_TZ_CODE","DEFAULT_TIME_FORMAT","Constants"],"mappings":"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"}