angular-hijri-gregorian-date-time-picker 1.5.9 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27978,6 +27978,8 @@ class HijriGregorianDatepickerComponent {
27978
27978
  constructor(formBuilder, _dateUtilsService) {
27979
27979
  this.formBuilder = formBuilder;
27980
27980
  this._dateUtilsService = _dateUtilsService;
27981
+ // Local storage key for persisting calendar mode
27982
+ this.STORAGE_KEY = 'hg_datepicker_mode';
27981
27983
  /// Inputs
27982
27984
  this.markToday = true;
27983
27985
  this.canChangeMode = true;
@@ -28078,6 +28080,16 @@ class HijriGregorianDatepickerComponent {
28078
28080
  if (this.enableTime) {
28079
28081
  this.initializeTime();
28080
28082
  }
28083
+ // Load persisted calendar mode if available
28084
+ try {
28085
+ const stored = localStorage.getItem(this.STORAGE_KEY);
28086
+ if (stored) {
28087
+ this.mode = stored;
28088
+ }
28089
+ }
28090
+ catch (e) {
28091
+ // ignore storage errors (e.g., SSR or disabled storage)
28092
+ }
28081
28093
  }
28082
28094
  ngAfterViewInit() {
28083
28095
  // Double-check time initialization after view is ready
@@ -28413,6 +28425,13 @@ class HijriGregorianDatepickerComponent {
28413
28425
  this.periodForm.controls['year'].value);
28414
28426
  // Reapply selection after mode change
28415
28427
  this.reapplySelection();
28428
+ // Persist new mode
28429
+ try {
28430
+ localStorage.setItem(this.STORAGE_KEY, this.mode);
28431
+ }
28432
+ catch (e) {
28433
+ // ignore storage errors
28434
+ }
28416
28435
  }
28417
28436
  /**
28418
28437
  * Reapply selection state after calendar regeneration
@@ -29155,6 +29174,8 @@ class HijriGregorianDatetimeInputComponent {
29155
29174
  // ============================================================
29156
29175
  constructor(dateUtilitiesService) {
29157
29176
  this.dateUtilitiesService = dateUtilitiesService;
29177
+ // Local storage key for persisting calendar mode
29178
+ this.STORAGE_KEY = 'hg_datepicker_mode';
29158
29179
  // ============================================================
29159
29180
  // CONFIGURATION INPUTS
29160
29181
  // ============================================================
@@ -29255,7 +29276,14 @@ class HijriGregorianDatetimeInputComponent {
29255
29276
  // ============================================================
29256
29277
  ngOnInit() {
29257
29278
  // Initialize current mode from input
29258
- this.currentMode = this.mode;
29279
+ // Prefer persisted mode if available, otherwise use input
29280
+ try {
29281
+ const stored = localStorage.getItem(this.STORAGE_KEY);
29282
+ this.currentMode = stored ? stored : this.mode;
29283
+ }
29284
+ catch (e) {
29285
+ this.currentMode = this.mode;
29286
+ }
29259
29287
  // Initialize with initialDate if provided
29260
29288
  if (this.initialDate) {
29261
29289
  this.initializeWithDate(this.initialDate);
@@ -29331,6 +29359,12 @@ class HijriGregorianDatetimeInputComponent {
29331
29359
  // Save the current mode from the calendar before closing
29332
29360
  if (this.calendarComponent) {
29333
29361
  this.currentMode = this.calendarComponent.mode;
29362
+ try {
29363
+ localStorage.setItem(this.STORAGE_KEY, this.currentMode);
29364
+ }
29365
+ catch (e) {
29366
+ // ignore storage errors
29367
+ }
29334
29368
  }
29335
29369
  this.isDropdownOpen = false;
29336
29370
  this.dropdownClosed.emit();
@@ -29376,6 +29410,10 @@ class HijriGregorianDatetimeInputComponent {
29376
29410
  // Update currentMode from calendar before formatting
29377
29411
  if (this.calendarComponent) {
29378
29412
  this.currentMode = this.calendarComponent.mode;
29413
+ try {
29414
+ localStorage.setItem(this.STORAGE_KEY, this.currentMode);
29415
+ }
29416
+ catch (e) { }
29379
29417
  }
29380
29418
  this.currentValue = event;
29381
29419
  this.updateDisplayValue(event);
@@ -29392,6 +29430,10 @@ class HijriGregorianDatetimeInputComponent {
29392
29430
  // Update currentMode from calendar before formatting
29393
29431
  if (this.calendarComponent) {
29394
29432
  this.currentMode = this.calendarComponent.mode;
29433
+ try {
29434
+ localStorage.setItem(this.STORAGE_KEY, this.currentMode);
29435
+ }
29436
+ catch (e) { }
29395
29437
  }
29396
29438
  // Update current value
29397
29439
  this.currentValue = event;
@@ -1 +1 @@
1
- {"version":3,"file":"angular-hijri-gregorian-date-time-picker.mjs","sources":["../../../projects/hijri-gregorian-datepicker/src/_services/date-utilities.service.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.component.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.component.html","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datetime-input.component.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datetime-input.component.html","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.module.ts","../../../projects/hijri-gregorian-datepicker/src/public-api.ts","../../../projects/hijri-gregorian-datepicker/src/angular-hijri-gregorian-date-time-picker.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport * as datesDictionary from '../_data/dictionary.json';\nimport { Data, DayInfo, MonthDays } from '../_interfaces/calendar-model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DateUtilitiesService {\n public calendarData: Data;\n\n constructor() {\n this.calendarData = (datesDictionary as any)['default'];\n }\n\n parseDate(dateStr: string): Date | null {\n if (!dateStr) {\n return null;\n }\n const parts = dateStr?.split('/');\n if (parts.length !== 3) {\n return null;\n }\n const [day, month, year] = parts.map(Number);\n if (\n isNaN(day) ||\n isNaN(month) ||\n isNaN(year) ||\n day < 1 ||\n day > 31 ||\n month < 1 ||\n month > 12 ||\n year < 1\n ) {\n return null;\n }\n return new Date(year, month - 1, day);\n }\n\n formatDate(date: Date): string {\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n return `${day}/${month}/${year}`;\n }\n\n /**\n * Format date string according to specified format pattern\n * Supported formats: 'DD/MM/YYYY', 'MM/DD/YYYY', 'YYYY/MM/DD', 'YYYY-MM-DD', 'DD-MM-YYYY', 'MM-DD-YYYY'\n * @param dateStr - Date string in DD/MM/YYYY format\n * @param format - Desired output format pattern\n * @returns Formatted date string\n */\n formatDateString(dateStr: string, format: string = 'DD/MM/YYYY'): string {\n if (!dateStr) return '';\n\n const parts = dateStr.split('/');\n if (parts.length !== 3) return dateStr;\n\n const [day, month, year] = parts;\n\n // Determine separator from format\n const separator = format.includes('-') ? '-' : '/';\n\n // Build date according to format pattern\n const formatUpper = format.toUpperCase().replace(/[-/]/g, '/');\n\n switch (formatUpper) {\n case 'DD/MM/YYYY':\n return `${day}${separator}${month}${separator}${year}`;\n case 'MM/DD/YYYY':\n return `${month}${separator}${day}${separator}${year}`;\n case 'YYYY/MM/DD':\n return `${year}${separator}${month}${separator}${day}`;\n case 'YYYY/DD/MM':\n return `${year}${separator}${day}${separator}${month}`;\n case 'DD/YYYY/MM':\n return `${day}${separator}${year}${separator}${month}`;\n case 'MM/YYYY/DD':\n return `${month}${separator}${year}${separator}${day}`;\n default:\n // Default to DD/MM/YYYY\n return `${day}${separator}${month}${separator}${year}`;\n }\n }\n\n getDayShortHand(date: Date): string {\n return date.toLocaleString('en-US', { weekday: 'short' });\n }\n\n generateDates(fD: DayInfo, lD: DayInfo, uC: number): MonthDays {\n const startDate = this.parseDate(fD?.gD);\n const endDate = this.parseDate(lD?.gD);\n const daysInMonth: MonthDays = [];\n let currentGregorianDate = new Date(startDate);\n let currentUmmAlQuraDay = parseInt(fD?.uD?.split('/')[0]);\n let currentUmmAlQuraMonth = parseInt(fD?.uD?.split('/')[1]);\n let currentUmmAlQuraYear = parseInt(fD?.uD?.split('/')[2]);\n let daysInCurrentUmmAlQuraMonth = uC;\n while (currentGregorianDate <= endDate) {\n const ummAlQuraDate = `${currentUmmAlQuraDay\n .toString()\n .padStart(2, '0')}/${currentUmmAlQuraMonth\n .toString()\n .padStart(2, '0')}/${currentUmmAlQuraYear}`;\n daysInMonth.push({\n gD: this.formatDate(currentGregorianDate),\n uD: ummAlQuraDate,\n dN: this.getDayShortHand(currentGregorianDate),\n uC: 0,\n });\n currentGregorianDate.setDate(currentGregorianDate.getDate() + 1);\n currentUmmAlQuraDay += 1;\n if (currentUmmAlQuraDay > daysInCurrentUmmAlQuraMonth) {\n currentUmmAlQuraDay = 1;\n currentUmmAlQuraMonth += 1;\n if (currentUmmAlQuraMonth > 12) {\n currentUmmAlQuraMonth = 1;\n currentUmmAlQuraYear += 1;\n }\n const nextMonthData =\n this.calendarData[currentUmmAlQuraYear.toString()]?.[\n currentUmmAlQuraMonth.toString()\n ];\n daysInCurrentUmmAlQuraMonth = nextMonthData ? nextMonthData.fD.uC : 30;\n }\n }\n return daysInMonth;\n }\n\n convertDate(dateStr: string, isGregorian: boolean): DayInfo | null {\n if (!dateStr) return null;\n\n if (isGregorian) {\n // Preprocess Gregorian date\n const gregorianDate = this.parseDate(dateStr);\n if (!gregorianDate) return null;\n const formattedDate = this.formatDate(gregorianDate);\n\n for (const yearKey in this.calendarData) {\n for (const monthKey in this.calendarData[yearKey]) {\n const monthData = this.calendarData[yearKey][monthKey];\n\n if (\n this.isDateInMonthRange(\n formattedDate,\n monthData.fD?.gD,\n monthData.lD?.gD\n )\n ) {\n const daysInMonth = this.generateDates(\n monthData.fD,\n monthData.lD,\n monthData.fD?.uC\n );\n\n const dayMatch = daysInMonth.find((d) => d.gD === formattedDate);\n if (dayMatch) return dayMatch;\n }\n }\n }\n } else {\n const [day, month, year] = dateStr.split('/').map(Number);\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null;\n\n for (const yearKey in this.calendarData) {\n for (const monthKey in this.calendarData[yearKey]) {\n const monthData = this.calendarData[yearKey][monthKey];\n\n if (\n this.isDateInMonthRange(\n `${day}/${month}/${year}`,\n monthData.fD?.uD,\n monthData.lD?.uD\n )\n ) {\n const daysInMonth = this.generateDates(\n monthData.fD,\n monthData.lD,\n monthData.fD?.uC\n );\n\n const dayMatch = daysInMonth.find((d) => {\n const [uDay, uMonth, uYear] = d?.uD?.split('/').map(Number);\n return uDay === day && uMonth === month && uYear === year;\n });\n\n if (dayMatch) return dayMatch;\n }\n }\n }\n }\n\n return null;\n }\n\n private isDateInMonthRange(\n dateToCheck: string,\n monthStartDate: string | undefined,\n monthEndDate: string | undefined\n ): boolean {\n if (!monthStartDate || !monthEndDate) return false;\n\n const checkDate = this.parseDate(dateToCheck);\n const startDate = this.parseDate(monthStartDate);\n const endDate = this.parseDate(monthEndDate);\n\n if (!checkDate || !startDate || !endDate) return false;\n\n return checkDate >= startDate && checkDate <= endDate;\n }\n\n getMonthData(inputDate: string, type: string): DayInfo[] | null {\n const [day, month, year] = inputDate?.split('/').map(Number);\n let isGregorian: boolean;\n if (type == 'greg') {\n isGregorian = true;\n } else {\n isGregorian = false;\n }\n if (isGregorian) {\n return this.getGregorianMonthData(day, month, year);\n } else {\n return this.getUmAlQurraMonthData(day, month, year);\n }\n }\n\n getGregorianMonthData(\n day: number,\n month: number,\n year: number\n ): DayInfo[] | null {\n const yearData = this.calendarData[year];\n if (!yearData) return null;\n const monthData = yearData[month];\n if (!monthData) return null;\n const monthArray: DayInfo[] = [];\n const endDate = new Date(year, month, 0);\n for (let d = 1; d <= endDate.getDate(); d++) {\n const offset = d - 1;\n\n monthArray.push({\n gD: `${d.toString().padStart(2, '0')}/${month\n .toString()\n .padStart(2, '0')}/${year}`,\n uD: this.calculateUmAlQurraDate(\n monthData.fD.uD,\n offset,\n monthData.fD.uC\n ),\n dN: this.getDayName(new Date(year, month - 1, d).getDay()),\n uC: monthData.fD.uC,\n });\n }\n\n return monthArray;\n }\n\n getUmAlQurraMonthData(\n day: number,\n month: number,\n year: number\n ): DayInfo[] | null {\n for (const gregorianYear in this.calendarData) {\n const yearData = this.calendarData[parseInt(gregorianYear)];\n\n for (const monthIndex in yearData) {\n const monthData = yearData[parseInt(monthIndex)];\n const [fDay, fMonth, fYear] = monthData?.fD?.uD?.split('/').map(Number);\n\n if (fYear === year && fMonth === month) {\n const totalDays = monthData.fD.uC;\n const monthArray: DayInfo[] = [];\n const umAlQurraStartDate = `01/${month\n .toString()\n .padStart(2, '0')}/${year}`;\n const dayDifference = fDay - 1;\n\n const startGregorianDate = this.calculateGregorianDate(\n monthData.fD.gD,\n -dayDifference\n );\n\n for (let i = 0; i < totalDays; i++) {\n const uDate = this.calculateUmAlQurraDate(\n umAlQurraStartDate,\n i,\n totalDays\n );\n const gDate = this.calculateGregorianDate(startGregorianDate, i);\n const [gDay, gMonth, gYear] = gDate?.split('/').map(Number);\n const dayName = this.getDayName(\n new Date(gYear, gMonth - 1, gDay).getDay()\n );\n\n monthArray.push({\n gD: gDate,\n uD: uDate,\n dN: dayName,\n uC: totalDays,\n });\n }\n\n return monthArray;\n }\n }\n }\n\n return null;\n }\n\n calculateGregorianDate(startGDate: string, offset: number): string {\n const [day, month, year] = startGDate?.split('/').map(Number);\n const newDate = new Date(year, month - 1, day + offset);\n\n return `${newDate.getDate().toString().padStart(2, '0')}/${(\n newDate.getMonth() + 1\n )\n .toString()\n .padStart(2, '0')}/${newDate.getFullYear()}`;\n }\n\n calculateUmAlQurraDate(\n startUDate: string,\n offset: number,\n uC: number\n ): string {\n const [day, month, year] = startUDate?.split('/').map(Number);\n\n let newDay = day + offset;\n let newMonth = month;\n let newYear = year;\n\n while (newDay > uC) {\n newDay -= uC;\n newMonth += 1;\n }\n\n while (newMonth > 12) {\n newMonth = 1;\n newYear += 1;\n }\n\n return `${newDay.toString().padStart(2, '0')}/${newMonth\n .toString()\n .padStart(2, '0')}/${newYear}`;\n }\n\n getDayName(dayIndex: number): string {\n const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n return days[dayIndex];\n }\n\n /// Check date is it in past or future\n checkPastOrFuture(inputDate: any, targetDate: any) {\n if (inputDate) {\n const [day, month, year] = inputDate?.split('/').map(Number);\n const dateToCheck = new Date(year, month - 1, day);\n const today = targetDate;\n today.setHours(0, 0, 0, 0);\n if (dateToCheck > today) {\n return 'Future';\n } else if (dateToCheck < today) {\n return 'Past';\n } else {\n return 'Today';\n }\n }\n }\n\n /// Convert english numbers to arabic equivalent\n parseEnglish(englishNum: any) {\n if (!englishNum) return englishNum;\n const numStr = String(englishNum);\n const arabicNumbers = [\n '\\u0660',\n '\\u0661',\n '\\u0662',\n '\\u0663',\n '\\u0664',\n '\\u0665',\n '\\u0666',\n '\\u0667',\n '\\u0668',\n '\\u0669',\n ];\n return numStr.replace(/[0-9]/g, (digit) => {\n return arabicNumbers[Number(digit)] || digit;\n });\n }\n\n /// Convert arabic numbers to english equivalent\n parseArabic(arabicNum: any) {\n return arabicNum.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function (d: string) {\n return d.charCodeAt(0) - 1632;\n });\n }\n\n ///\n convertDateNumerals(date: string, targetLang: 'en' | 'ar'): string {\n const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\n const toArabic = (value: string) =>\n value\n .split('')\n .map((char) => (/\\d/.test(char) ? arabicNumbers[+char] : char))\n .join('');\n\n const toEnglish = (value: string) =>\n value\n .split('')\n .map((char) => {\n const index = arabicNumbers.indexOf(char);\n return index > -1 ? englishNumbers[index] : char;\n })\n .join('');\n\n if (targetLang === 'ar') {\n const [day, month, year] = date.split('/');\n return `${toArabic(year)}/${toArabic(month)}/${toArabic(day)}`;\n } else {\n const [year, month, day] = date.split('/');\n return `${toEnglish(day)}/${toEnglish(month)}/${toEnglish(year)}`;\n }\n }\n\n /**\n * Normalize input date to DD/MM/YYYY string format (Gregorian)\n * Accepts Date object or DD/MM/YYYY string\n */\n normalizeDateToString(date: Date | string | undefined): string | null {\n if (!date) return null;\n\n if (date instanceof Date) {\n return this.formatDate(date);\n }\n\n // Already a string - validate format\n const parsed = this.parseDate(date);\n return parsed ? this.formatDate(parsed) : null;\n }\n\n /**\n * Compare two dates (Gregorian format DD/MM/YYYY)\n * Returns: -1 if date1 < date2, 0 if equal, 1 if date1 > date2\n */\n compareDates(date1Str: string, date2Str: string): number {\n const d1 = this.parseDate(date1Str);\n const d2 = this.parseDate(date2Str);\n\n if (!d1 || !d2) return 0;\n\n if (d1 < d2) return -1;\n if (d1 > d2) return 1;\n return 0;\n }\n\n /**\n * Compare two Hijri dates (UM format DD/MM/YYYY)\n * Converts to Gregorian for comparison\n */\n compareHijriDates(hijri1: string, hijri2: string): number {\n const day1 = this.convertDate(hijri1, false);\n const day2 = this.convertDate(hijri2, false);\n\n if (!day1?.gD || !day2?.gD) return 0;\n\n return this.compareDates(day1.gD, day2.gD);\n }\n\n /**\n * Check if a date is within the specified range (inclusive)\n * All dates in Gregorian DD/MM/YYYY format\n */\n isDateInRange(\n dateStr: string,\n minDateStr: string | null,\n maxDateStr: string | null\n ): boolean {\n if (!dateStr) return false;\n\n // If no constraints, date is valid\n if (!minDateStr && !maxDateStr) return true;\n\n // Check minimum constraint\n if (minDateStr && this.compareDates(dateStr, minDateStr) < 0) {\n return false;\n }\n\n // Check maximum constraint\n if (maxDateStr && this.compareDates(dateStr, maxDateStr) > 0) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if a Hijri date is within the specified range\n * Converts to Gregorian for comparison\n */\n isHijriDateInRange(\n hijriDateStr: string,\n minDateStr: string | null,\n maxDateStr: string | null\n ): boolean {\n if (!hijriDateStr) return false;\n\n const dayInfo = this.convertDate(hijriDateStr, false);\n if (!dayInfo?.gD) return false;\n\n return this.isDateInRange(dayInfo.gD, minDateStr, maxDateStr);\n }\n\n transformDate(dateString: string) {\n const date = new Date(dateString);\n // Gregorian date (DD/MM/YYYY)\n const gD = `${String(date.getDate()).padStart(2, '0')}/${String(\n date.getMonth() + 1\n ).padStart(2, '0')}/${date.getFullYear()}`;\n\n // Day name\n const dN = date.toLocaleDateString('en-US', { weekday: 'long' });\n\n // Time\n const time = {\n hour: date.getHours(),\n minute: date.getMinutes(),\n };\n\n // Hijri (Umm Al-Qura)\n const hijriFormatter = new Intl.DateTimeFormat(\n 'ar-SA-u-ca-islamic-umalqura-nu-latn',\n {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }\n );\n\n const hijriParts = hijriFormatter.formatToParts(date);\n\n const day = hijriParts.find((p) => p.type === 'day')?.value;\n const month = hijriParts.find((p) => p.type === 'month')?.value;\n const year = hijriParts.find((p) => p.type === 'year')?.value;\n\n const uD = `${day}/${month}/${year}`;\n\n return {\n gD,\n uD,\n dN,\n uC: 0,\n selected: true,\n time,\n };\n }\n}\n","import {\n Component,\n Input,\n OnInit,\n Output,\n EventEmitter,\n HostBinding,\n OnChanges,\n SimpleChanges,\n AfterViewInit,\n} from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { stylesConfig } from '../_interfaces/styles-config.model';\nimport { DateUtilitiesService } from '../_services/date-utilities.service';\nimport { TodayDate, DayInfo } from '../_interfaces/calendar-model';\nimport * as themesConfig from '../themes/themes.json';\n@Component({\n standalone: false,\n selector: 'hijri-gregorian-datepicker',\n templateUrl: './hijri-gregorian-datepicker.component.html',\n styleUrls: ['./hijri-gregorian-datepicker.component.scss'],\n})\nexport class HijriGregorianDatepickerComponent\n implements OnInit, OnChanges, AfterViewInit\n{\n /// Inputs\n @Input() markToday: boolean = true;\n @Input() canChangeMode: boolean = true;\n @Input() todaysDateSection: boolean = true;\n @Input() futureValidation: boolean = true;\n @Input() disableYearPicker: boolean = false;\n @Input() disableMonthPicker: boolean = false;\n @Input() disableDayPicker: boolean = false;\n @Input() isRequired: boolean = false;\n @Input() showConfirmButton: boolean = true;\n @Input() futureValidationMessage: boolean = false;\n @Input() mode: string = 'greg';\n @Input() dir: string = 'ltr';\n @Input() locale: string = 'en';\n @Input() submitTextButton: string = 'Confirm';\n @Input() todaysDateText: string = \"Today's Date\";\n @Input() ummAlQuraDateText: string = 'Hijri Date';\n @Input() monthSelectLabel: string = 'Month';\n @Input() yearSelectLabel: string = 'Year';\n @Input() amLabel: string = 'AM'; // Label for AM in 12-hour format\n @Input() pmLabel: string = 'PM'; // Label for PM in 12-hour format\n @Input() futureValidationMessageEn: string;\n @Input() futureValidationMessageAr: string;\n @Input() theme?: string = '';\n @Input() pastYearsLimit: number = 90;\n @Input() futureYearsLimit: number = 0;\n @Input() styles?: stylesConfig = {};\n\n // New inputs for extended functionality\n @Input() enableTime: boolean = false; // Enable time picker (hours & minutes)\n @Input() minDate?: Date | string; // Minimum allowed date (Gregorian Date or DD/MM/YYYY string)\n @Input() maxDate?: Date | string; // Maximum allowed date (Gregorian Date or DD/MM/YYYY string)\n @Input() initialDate?: Date | string; // Initial date to navigate to when picker opens\n\n // Range selection initial dates\n @Input() initialRangeStart?: Date | string; // Initial start date for range selection\n @Input() initialRangeEnd?: Date | string; // Initial end date for range selection\n\n // BACKWARD COMPATIBILITY: Default to false (24-hour format)\n // When true, displays 12-hour format with AM/PM toggle\n @Input() useMeridian: boolean = false; // Enable 12-hour format with AM/PM\n\n // BACKWARD COMPATIBILITY: Default to 'single' (existing behavior)\n // 'multiple' enables multi-date selection, 'range' enables range selection (start to end)\n @Input() selectionMode: 'single' | 'multiple' | 'range' = 'single';\n\n // Date display format for input fields\n // Supported formats: 'DD/MM/YYYY', 'MM/DD/YYYY', 'YYYY/MM/DD', 'YYYY-MM-DD', 'DD-MM-YYYY', 'MM-DD-YYYY'\n @Input() dateDisplayFormat: string = 'DD/MM/YYYY';\n /// Outputs\n @Output() onSubmit = new EventEmitter<object>();\n @Output() onDaySelect = new EventEmitter<object>();\n @Output() onMonthChange = new EventEmitter<object>();\n @Output() onYearChange = new EventEmitter<object>();\n /// Variables\n ummAlQuraMonths = [\n { labelAr: 'محرم', labelEn: 'Muharram', value: 1 },\n { labelAr: 'صفر', labelEn: 'Safar', value: 2 },\n { labelAr: 'ربيع الأول', labelEn: 'Rabi al-Awwal', value: 3 },\n { labelAr: 'ربيع الثاني', labelEn: 'Rabi al-Thani', value: 4 },\n { labelAr: 'جمادى الأولى', labelEn: 'Jumada al-Awwal', value: 5 },\n { labelAr: 'جمادى الآخرة', labelEn: 'Jumada al-Thani', value: 6 },\n { labelAr: 'رجب', labelEn: 'Rajab', value: 7 },\n { labelAr: 'شعبان', labelEn: 'Shaban', value: 8 },\n { labelAr: 'رمضان', labelEn: 'Ramadan', value: 9 },\n { labelAr: 'شوال', labelEn: 'Shawwal', value: 10 },\n { labelAr: 'ذو القعدة', labelEn: 'Dhu al-Qadah', value: 11 },\n { labelAr: 'ذو الحجة', labelEn: 'Dhu al-Hijjah', value: 12 },\n ];\n gregMonths = [\n { labelAr: 'يناير', labelEn: 'January', value: 1 },\n { labelAr: 'فبراير', labelEn: 'February', value: 2 },\n { labelAr: 'مارس', labelEn: 'March', value: 3 },\n { labelAr: 'ابريل', labelEn: 'April', value: 4 },\n { labelAr: 'مايو', labelEn: 'May', value: 5 },\n { labelAr: 'يونيو', labelEn: 'June', value: 6 },\n { labelAr: 'يوليو', labelEn: 'July', value: 7 },\n { labelAr: 'اغسطس', labelEn: 'August', value: 8 },\n { labelAr: 'سبتمبر', labelEn: 'September', value: 9 },\n { labelAr: 'اكتوبر', labelEn: 'October', value: 10 },\n { labelAr: 'نوفمبر', labelEn: 'November', value: 11 },\n { labelAr: 'ديسمبر', labelEn: 'December', value: 12 },\n ];\n ummAlQuraYear: number;\n gregYear: number;\n years: any[];\n weeks: any[];\n months: any[];\n weekdaysEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n weekdaysAr = ['سبت', 'جمعة', 'خميس', 'أربعاء', 'ثلاثاء', 'اثنين', 'أحد'];\n todaysDate: TodayDate = {};\n selectedDay: DayInfo;\n periodForm: UntypedFormGroup;\n multipleSelectedDates = [] as DayInfo[];\n themes = [] as any;\n\n // Time picker variables\n // BACKWARD COMPATIBILITY: selectedTime defaults to 0:0 to preserve existing behavior when enableTime=false\n // When enableTime=true, this will be initialized to current system time in ngOnInit\n selectedTime: { hour: number; minute: number } = { hour: 0, minute: 0 };\n\n // Track if time has been initialized to avoid re-initializing at midnight\n private timeInitialized: boolean = false;\n\n // BACKWARD COMPATIBILITY: Meridian only used when useMeridian=true\n // Tracks AM/PM state for 12-hour format\n meridian: 'AM' | 'PM' = 'AM';\n\n // Range selection state\n // BACKWARD COMPATIBILITY: These are only used when selectionMode='range'\n // They do not affect single or multiple selection modes\n rangeStart?: DayInfo = undefined;\n rangeEnd?: DayInfo = undefined;\n\n @HostBinding('style.font-family') fontFamilyStyle: string;\n constructor(\n public formBuilder: UntypedFormBuilder,\n public _dateUtilsService: DateUtilitiesService\n ) {}\n\n ngOnInit(): void {\n this.initTheme();\n this.initializeForm();\n this.getTodaysDateInfo();\n this.initializeYearsAndMonths();\n\n // Initialize time from current system time or initialDate\n // BACKWARD COMPATIBILITY: This only runs when enableTime=true\n if (this.enableTime) {\n this.initializeTime();\n }\n }\n\n ngAfterViewInit(): void {\n // Double-check time initialization after view is ready\n // This handles cases where enableTime might be set after ngOnInit\n if (this.enableTime && !this.timeInitialized) {\n this.initializeTime();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['mode'] && !changes['mode'].isFirstChange()) {\n // Don't emit during initialization, only when mode changes after init\n const previousMode = changes['mode'].previousValue;\n const currentMode = changes['mode'].currentValue;\n if (previousMode !== currentMode) {\n this.changeCalendarMode();\n }\n }\n }\n\n initTheme() {\n if (this.theme != '') {\n this.themes = themesConfig;\n for (const themeItem of this.themes['default']) {\n if (themeItem.name == this.theme) {\n this.styles = themeItem.stylesConfig;\n break;\n }\n }\n }\n this.fontFamilyStyle = this.styles.fontFamily;\n }\n\n /// Initialize form control for month and year select\n initializeForm() {\n this.periodForm = this.formBuilder.group({\n year: [{ value: '', disabled: this.disableYearPicker }, []],\n month: [{ value: '', disabled: this.disableMonthPicker }, []],\n });\n }\n\n // Initialize years and months for calendar\n initializeYearsAndMonths() {\n this.years = [];\n this.months = [];\n\n // Determine the date to use for initialization (initialDate or today)\n let referenceDate: string;\n if (this.initialDate) {\n const normalizedInitialDate =\n this._dateUtilsService.normalizeDateToString(this.initialDate);\n if (normalizedInitialDate) {\n if (this.mode == 'greg') {\n referenceDate = normalizedInitialDate;\n } else {\n const hijriDate = this._dateUtilsService.convertDate(\n normalizedInitialDate,\n true\n );\n referenceDate = hijriDate?.uD || this.todaysDate.ummAlQura;\n }\n } else {\n referenceDate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n } else {\n referenceDate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n\n if (this.mode == 'greg') {\n this.gregYear =\n this.futureYearsLimit == 0\n ? Number(referenceDate?.split('/')[2])\n : Number(referenceDate?.split('/')[2]) + this.futureYearsLimit;\n for (let i = 0; i < this.gregYear; i++) {\n if (i < this.pastYearsLimit) {\n let val = this.gregYear--;\n this.years.push(val);\n } else {\n break;\n }\n }\n this.months = this.gregMonths;\n } else {\n this.ummAlQuraYear =\n this.futureYearsLimit == 0\n ? Number(referenceDate?.split('/')[2])\n : Number(referenceDate?.split('/')[2]) + this.futureYearsLimit;\n for (let i = 0; i < this.ummAlQuraYear; i++) {\n if (i < this.pastYearsLimit) {\n let val = this.ummAlQuraYear--;\n this.years.push(val);\n } else {\n break;\n }\n }\n this.months = this.ummAlQuraMonths;\n }\n this.years.map((year: any) => {\n if (year == referenceDate?.split('/')[2]) {\n this.periodForm.controls['year'].setValue(year);\n }\n });\n this.months.map((month: any) => {\n if (month.value == referenceDate?.split('/')[1]) {\n this.periodForm.controls['month'].setValue(month.value);\n }\n });\n }\n\n /// On change event of years and months\n onPeriodChange(type: string) {\n if (type == 'year') {\n this.onYearChange.emit(this.periodForm.controls['year'].value);\n } else {\n this.onMonthChange.emit(this.periodForm.controls['month'].value);\n }\n const days = this._dateUtilsService.getMonthData(\n '01/' +\n this.periodForm.controls['month'].value +\n '/' +\n this.periodForm.controls['year'].value,\n this.mode\n );\n this.weeks = this.generateWeeksArray(days);\n }\n\n /// Get todays(greg and umm al qura) date info\n getTodaysDateInfo() {\n this.todaysDate.gregorian = this._dateUtilsService.formatDate(new Date());\n this.todaysDate.ummAlQura = this._dateUtilsService.convertDate(\n this.todaysDate.gregorian,\n true\n )?.uD;\n\n // Use initialDate if provided, otherwise use today's date\n let dateToNavigate: string;\n\n if (this.initialDate) {\n // Normalize initialDate to DD/MM/YYYY format\n const normalizedInitialDate =\n this._dateUtilsService.normalizeDateToString(this.initialDate);\n\n if (normalizedInitialDate) {\n if (this.mode == 'greg') {\n dateToNavigate = normalizedInitialDate;\n } else {\n // Convert to Hijri for ummAlQura mode\n const hijriDate = this._dateUtilsService.convertDate(\n normalizedInitialDate,\n true\n );\n dateToNavigate = hijriDate?.uD || this.todaysDate.ummAlQura;\n }\n } else {\n // Invalid initialDate, fall back to today\n dateToNavigate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n } else {\n // No initialDate provided, use today\n dateToNavigate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n\n this.generatetMonthData(dateToNavigate);\n\n // Highlight initialDate or initialRange if provided\n if (\n this.selectionMode === 'range' &&\n (this.initialRangeStart || this.initialRangeEnd)\n ) {\n this.highlightInitialRange();\n } else if (this.initialDate) {\n this.highlightInitialDate();\n }\n }\n\n /// Generate month days from JSON\n generatetMonthData(date: string) {\n const days = this._dateUtilsService.getMonthData(date, this.mode);\n this.weeks = this.generateWeeksArray(days);\n }\n\n /// Highlight initialDate on the calendar\n private highlightInitialDate() {\n if (!this.initialDate) {\n return;\n }\n\n const normalizedInitialDate = this._dateUtilsService.normalizeDateToString(\n this.initialDate\n );\n\n if (!normalizedInitialDate) {\n return;\n }\n\n // Find the day in the weeks array that matches initialDate\n for (const week of this.weeks) {\n for (const day of week) {\n if (day && day.gD === normalizedInitialDate) {\n // Don't select if date is disabled\n if (!this.isDateDisabled(day)) {\n // Mark as selected without triggering events\n day.selected = true;\n\n // Set as selectedDay based on selection mode\n if (this.selectionMode === 'range') {\n this.rangeStart = day;\n } else if (this.selectionMode === 'multiple') {\n this.multipleSelectedDates = [day];\n } else {\n this.selectedDay = day;\n }\n\n // Initialize time if enableTime is active\n if (this.enableTime && !this.timeInitialized) {\n this.initializeTime();\n }\n\n // Attach time to the day if it's a Date object with time\n if (this.enableTime && this.initialDate instanceof Date) {\n day.time = {\n hour: this.initialDate.getHours(),\n minute: this.initialDate.getMinutes(),\n };\n }\n }\n return;\n }\n }\n }\n }\n\n /// Highlight initial range (start and end dates) on the calendar\n private highlightInitialRange() {\n if (!this.initialRangeStart && !this.initialRangeEnd) {\n return;\n }\n\n const normalizedStartDate = this.initialRangeStart\n ? this._dateUtilsService.normalizeDateToString(this.initialRangeStart)\n : null;\n const normalizedEndDate = this.initialRangeEnd\n ? this._dateUtilsService.normalizeDateToString(this.initialRangeEnd)\n : null;\n\n let startDay: DayInfo | null = null;\n let endDay: DayInfo | null = null;\n\n // Find both start and end dates in the weeks array\n for (const week of this.weeks) {\n for (const day of week) {\n if (day && normalizedStartDate && day.gD === normalizedStartDate) {\n if (!this.isDateDisabled(day)) {\n startDay = day;\n }\n }\n if (day && normalizedEndDate && day.gD === normalizedEndDate) {\n if (!this.isDateDisabled(day)) {\n endDay = day;\n }\n }\n }\n }\n\n // Set range start\n if (startDay) {\n startDay.selected = true;\n this.rangeStart = startDay;\n this.selectedDay = startDay;\n\n // Initialize and attach time to start date\n if (this.enableTime) {\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n if (this.initialRangeStart instanceof Date) {\n startDay.time = {\n hour: this.initialRangeStart.getHours(),\n minute: this.initialRangeStart.getMinutes(),\n };\n } else {\n startDay.time = { ...this.selectedTime };\n }\n }\n }\n\n // Set range end if provided\n if (endDay && startDay) {\n // Swap if end is before start\n const startDate = this._dateUtilsService.parseDate(startDay.gD);\n const endDate = this._dateUtilsService.parseDate(endDay.gD);\n\n if (endDate && startDate && endDate < startDate) {\n // Swap\n this.rangeEnd = startDay;\n this.rangeStart = endDay;\n endDay.selected = true;\n } else {\n this.rangeEnd = endDay;\n }\n\n // Attach time to end date (inherit from start)\n if (this.enableTime) {\n const timeToUse = this.rangeStart.time || { ...this.selectedTime };\n if (this.initialRangeEnd instanceof Date) {\n this.rangeEnd.time = {\n hour: this.initialRangeEnd.getHours(),\n minute: this.initialRangeEnd.getMinutes(),\n };\n } else {\n this.rangeEnd.time = { ...timeToUse };\n }\n // Ensure start also has time\n this.rangeStart.time = { ...timeToUse };\n }\n\n // Highlight the range\n this.highlightRange();\n this.selectedDay = this.rangeEnd;\n }\n }\n\n /// Generate month weeks\n generateWeeksArray(daysArray: any) {\n const firstDayName = daysArray[0]?.dN;\n const startIndex = this.weekdaysEn.indexOf(firstDayName);\n const weeks = [[]] as any;\n let currentWeek = 0;\n let currentDayIndex = startIndex;\n\n daysArray?.forEach((day: any) => {\n if (!weeks[currentWeek]) {\n weeks[currentWeek] = [];\n }\n\n weeks[currentWeek][currentDayIndex] = day;\n currentDayIndex++;\n\n if (currentDayIndex === 7) {\n currentDayIndex = 0;\n currentWeek++;\n }\n });\n weeks.forEach((week: any) => {\n while (week.length < 7) {\n week.push({});\n }\n });\n return weeks;\n }\n\n /// Change calendar mode 'greg' or 'ummAlQura'\n changeCalendarMode() {\n this.mode = this.mode == 'greg' ? 'ummAlQura' : 'greg';\n this.initializeYearsAndMonths();\n this.generatetMonthData(\n '01/' +\n this.periodForm.controls['month'].value +\n '/' +\n this.periodForm.controls['year'].value\n );\n\n // Reapply selection after mode change\n this.reapplySelection();\n }\n\n /**\n * Reapply selection state after calendar regeneration\n * This ensures selected days remain highlighted when switching between modes\n */\n private reapplySelection(): void {\n if (!this.weeks || this.weeks.length === 0) {\n return;\n }\n\n // Handle range selection mode\n if (this.selectionMode === 'range') {\n if (this.rangeStart && this.rangeEnd) {\n this.highlightRange();\n // Restore time to range dates\n if (this.enableTime) {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD === this.rangeStart?.gD && this.rangeStart.time) {\n day.time = { ...this.rangeStart.time };\n }\n if (day && day.gD === this.rangeEnd?.gD && this.rangeEnd.time) {\n day.time = { ...this.rangeEnd.time };\n }\n });\n });\n }\n } else if (this.rangeStart) {\n // Only start date selected\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD === this.rangeStart?.gD) {\n day.selected = true;\n // Restore time\n if (this.enableTime && this.rangeStart.time) {\n day.time = { ...this.rangeStart.time };\n this.selectedTime = { ...this.rangeStart.time };\n }\n }\n });\n });\n }\n return;\n }\n\n // Handle single/multiple selection mode\n if (this.selectedDay) {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD === this.selectedDay?.gD) {\n day.selected = true;\n // Restore time\n if (this.enableTime && this.selectedDay.time) {\n day.time = { ...this.selectedDay.time };\n this.selectedTime = { ...this.selectedDay.time };\n }\n }\n });\n });\n }\n\n // Handle multiple selection\n if (this.multipleSelectedDates && this.multipleSelectedDates.length > 0) {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD) {\n const matchingDay = this.multipleSelectedDates.find(\n (selectedDay) => selectedDay.gD === day.gD\n );\n if (matchingDay) {\n day.selected = true;\n // Restore time\n if (this.enableTime && matchingDay.time) {\n day.time = { ...matchingDay.time };\n }\n }\n }\n });\n });\n }\n }\n\n /// On day clicked handler\n onDayClicked(day: DayInfo) {\n if (day && day?.gD) {\n // Check if day is disabled by min/max constraints\n if (this.isDateDisabled(day)) {\n return; // Don't allow selection of disabled dates\n }\n\n if (this.futureValidation) {\n if (this.checkFutureValidation(day)) {\n this.futureValidationMessage = true;\n } else {\n this.futureValidationMessage = false;\n this.markDaySelected(day);\n }\n } else {\n this.markDaySelected(day);\n }\n }\n }\n\n /// Mark day as selected\n markDaySelected(dayInfo: DayInfo) {\n // BACKWARD COMPATIBILITY: Range selection only when selectionMode='range'\n if (this.selectionMode === 'range') {\n this.handleRangeSelection(dayInfo);\n return;\n }\n\n // BACKWARD COMPATIBILITY: Original behavior for single/multiple selection\n if (dayInfo.selected) {\n dayInfo.selected = false;\n this.multipleSelectedDates = this.multipleSelectedDates.filter(\n (day) => day !== dayInfo\n );\n if (this.selectionMode !== 'multiple') {\n this.selectedDay = undefined;\n }\n } else {\n if (this.selectionMode !== 'multiple') {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n day.selected = false;\n });\n });\n\n dayInfo.selected = true;\n this.selectedDay = dayInfo;\n this.multipleSelectedDates = [dayInfo];\n\n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure time is initialized before attaching\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n\n this.onDaySelect.emit(dayInfo);\n } else {\n dayInfo.selected = true;\n\n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure time is initialized before attaching\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n\n this.onDaySelect.emit(dayInfo);\n if (!this.multipleSelectedDates.includes(dayInfo)) {\n this.multipleSelectedDates.push(dayInfo);\n }\n }\n }\n }\n\n /**\n * Handle range selection logic\n * BACKWARD COMPATIBILITY: Only called when selectionMode='range'\n *\n * Range selection lifecycle:\n * 1. First click → Sets rangeStart\n * 2. Second click → Sets rangeEnd, highlights range\n * 3. Third click → Resets range, starts new selection\n */\n private handleRangeSelection(dayInfo: DayInfo): void {\n // First click or resetting range\n if (!this.rangeStart || (this.rangeStart && this.rangeEnd)) {\n this.resetRange();\n this.rangeStart = dayInfo;\n dayInfo.selected = true;\n this.selectedDay = dayInfo;\n\n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure selectedTime is initialized\n // If time hasn't been initialized yet, initialize it now\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n\n this.onDaySelect.emit({ start: dayInfo, end: null });\n }\n // Second click - complete the range\n else if (this.rangeStart && !this.rangeEnd) {\n const startDate = this._dateUtilsService.parseDate(this.rangeStart.gD);\n const endDate = this._dateUtilsService.parseDate(dayInfo.gD);\n\n // Swap if end is before start\n if (endDate && startDate && endDate < startDate) {\n this.rangeEnd = this.rangeStart;\n this.rangeStart = dayInfo;\n } else {\n this.rangeEnd = dayInfo;\n }\n\n // Attach time if enableTime is active\n // IMPORTANT: Range end inherits time from range start (not current selectedTime)\n if (this.enableTime) {\n // Use rangeStart's time if it exists, otherwise use current selectedTime\n const timeToUse = this.rangeStart.time || { ...this.selectedTime };\n this.rangeStart.time = { ...timeToUse };\n this.rangeEnd.time = { ...timeToUse };\n }\n\n this.highlightRange();\n this.selectedDay = this.rangeEnd;\n\n this.onDaySelect.emit({ start: this.rangeStart, end: this.rangeEnd });\n }\n }\n\n /// On confirm button clicked\n onConfirmClicked() {\n // BACKWARD COMPATIBILITY: Range selection output when selectionMode='range'\n if (this.selectionMode === 'range') {\n if (this.rangeStart && this.rangeEnd) {\n // Collect all dates in range\n const rangeDates: DayInfo[] = [];\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (\n day &&\n day.gD &&\n (this.isInRange(day) ||\n this.isRangeStart(day) ||\n this.isRangeEnd(day))\n ) {\n // Attach current time if enableTime is active\n if (this.enableTime && !day.time) {\n day.time = { ...this.selectedTime };\n }\n rangeDates.push(day);\n }\n });\n });\n\n this.onSubmit.emit({\n start: this.rangeStart,\n end: this.rangeEnd,\n dates: rangeDates,\n });\n } else {\n // Incomplete range\n this.onSubmit.emit({ start: this.rangeStart, end: null, dates: [] });\n }\n return;\n }\n\n // BACKWARD COMPATIBILITY: Original behavior for multiple/single selection\n if (this.selectionMode === 'multiple') {\n // For multiple dates, attach time to each if enableTime is active\n if (this.enableTime) {\n this.multipleSelectedDates.forEach((day) => {\n if (!day.time) {\n day.time = { ...this.selectedTime };\n }\n });\n }\n this.onSubmit.emit(this.multipleSelectedDates);\n } else {\n // For single date, attach time if enableTime is active\n if (this.enableTime && this.selectedDay) {\n this.selectedDay.time = { ...this.selectedTime };\n }\n this.onSubmit.emit(this.selectedDay);\n }\n }\n\n /// Check if date from future\n checkFutureValidation(day: DayInfo) {\n if (\n this._dateUtilsService.checkPastOrFuture(day?.gD, new Date()) == 'Future'\n ) {\n return true;\n }\n }\n\n /// Check if passed day is today or not\n checkTodaysDate(day: DayInfo) {\n return (\n this.todaysDate?.gregorian == day?.gD ||\n this.todaysDate?.ummAlQura == day?.uD\n );\n }\n\n /**\n * Check if a day is disabled based on min/max date constraints\n * Works for both Gregorian and Hijri modes\n */\n isDateDisabled(day: DayInfo): boolean {\n if (!day || !day.gD) return true;\n\n // Normalize min/max dates to Gregorian DD/MM/YYYY format\n const minDateStr = this.minDate\n ? this._dateUtilsService.normalizeDateToString(this.minDate)\n : null;\n const maxDateStr = this.maxDate\n ? this._dateUtilsService.normalizeDateToString(this.maxDate)\n : null;\n\n // Check if the day's Gregorian date is within range\n return !this._dateUtilsService.isDateInRange(\n day.gD,\n minDateStr,\n maxDateStr\n );\n }\n\n /**\n * Initialize time from current system time or initialDate\n * BACKWARD COMPATIBILITY: Only called when enableTime=true\n *\n * Priority:\n * 1. If initialDate has time, use that\n * 2. If selectedDay has time, use that\n * 3. Otherwise, use current system time\n */\n initializeTime(): void {\n let timeSet = false;\n\n // Check if initialDate has time information\n if (this.initialDate && this.initialDate instanceof Date) {\n this.selectedTime = {\n hour: this.initialDate.getHours(),\n minute: this.initialDate.getMinutes(),\n };\n timeSet = true;\n }\n\n // If no time from initialDate, use current system time\n if (!timeSet) {\n const now = new Date();\n this.selectedTime = {\n hour: now.getHours(),\n minute: now.getMinutes(),\n };\n }\n\n // Mark that time has been initialized\n this.timeInitialized = true;\n\n // BACKWARD COMPATIBILITY: Only set meridian when useMeridian=true\n if (this.useMeridian) {\n this.meridian = this.selectedTime.hour >= 12 ? 'PM' : 'AM';\n }\n }\n\n /**\n * Increment hour value with wraparound (0-23)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n incrementHour(): void {\n this.selectedTime.hour = (this.selectedTime.hour + 1) % 24;\n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement hour value with wraparound (0-23)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n decrementHour(): void {\n this.selectedTime.hour = (this.selectedTime.hour - 1 + 24) % 24;\n this.updateSelectedDayTime();\n }\n\n /**\n * Increment minute value with wraparound (0-59)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n incrementMinute(): void {\n this.selectedTime.minute = (this.selectedTime.minute + 1) % 60;\n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement minute value with wraparound (0-59)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n decrementMinute(): void {\n this.selectedTime.minute = (this.selectedTime.minute - 1 + 60) % 60;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard input for hours\n * Validates and clamps to 0-23 range\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onHourInputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n\n if (isNaN(value) || value < 0) {\n value = 0;\n } else if (value > 23) {\n value = 23;\n }\n\n this.selectedTime.hour = value;\n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard input for minutes\n * Validates and clamps to 0-59 range\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onMinuteInputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n\n if (isNaN(value) || value < 0) {\n value = 0;\n } else if (value > 59) {\n value = 59;\n }\n\n this.selectedTime.minute = value;\n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard arrow keys for hour/minute input\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onTimeKeydown(event: KeyboardEvent, type: 'hour' | 'minute'): void {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (type === 'hour') {\n this.incrementHour();\n } else {\n this.incrementMinute();\n }\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (type === 'hour') {\n this.decrementHour();\n } else {\n this.decrementMinute();\n }\n }\n }\n\n /**\n * Update the selected day's time property when time changes\n * BACKWARD COMPATIBILITY: Only called when enableTime=true\n */\n private updateSelectedDayTime(): void {\n if (this.selectedDay) {\n this.selectedDay.time = { ...this.selectedTime };\n // Emit the updated day info so datetime-input can capture time-only changes\n this.onDaySelect.emit(this.selectedDay);\n }\n // Handle range mode time updates\n if (this.selectionMode === 'range') {\n if (this.rangeStart) {\n this.rangeStart.time = { ...this.selectedTime };\n }\n if (this.rangeEnd) {\n this.rangeEnd.time = { ...this.selectedTime };\n }\n // Emit the updated range\n if (this.rangeStart && this.rangeEnd) {\n this.onDaySelect.emit({ start: this.rangeStart, end: this.rangeEnd });\n } else if (this.rangeStart) {\n this.onDaySelect.emit({ start: this.rangeStart, end: null });\n }\n }\n }\n\n /**\n * Get display hour for 12-hour format\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n *\n * Conversion:\n * - 0 (midnight) → 12 AM\n * - 1-11 (AM) → 1-11 AM\n * - 12 (noon) → 12 PM\n * - 13-23 (PM) → 1-11 PM\n *\n * IMPORTANT: Hour 0 is NEVER displayed as 0, always as 12\n */\n getDisplayHour(): number {\n if (!this.useMeridian) {\n return this.selectedTime.hour;\n }\n\n const hour = this.selectedTime.hour;\n\n // Midnight (0) → 12\n if (hour === 0) {\n return 12;\n }\n // 1-12 → 1-12 (no change)\n else if (hour <= 12) {\n return hour;\n }\n // 13-23 → 1-11 (subtract 12)\n else {\n return hour - 12;\n }\n }\n\n /**\n * Toggle AM/PM meridian\n * BACKWARD COMPATIBILITY: Only available when useMeridian=true\n *\n * When toggling:\n * - Adds or subtracts 12 hours\n * - Maintains internal 24-hour format\n */\n toggleMeridian(): void {\n if (this.meridian === 'AM') {\n this.meridian = 'PM';\n // Add 12 hours if not already in PM range\n if (this.selectedTime.hour < 12) {\n this.selectedTime.hour += 12;\n }\n } else {\n this.meridian = 'AM';\n // Subtract 12 hours if in PM range\n if (this.selectedTime.hour >= 12) {\n this.selectedTime.hour -= 12;\n }\n }\n this.updateSelectedDayTime();\n }\n\n /**\n * Increment hour in 12-hour mode\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n */\n incrementHour12(): void {\n let displayHour = this.getDisplayHour();\n displayHour = (displayHour % 12) + 1; // 1-12 cycle\n\n // Convert back to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = displayHour === 12 ? 0 : displayHour;\n } else {\n this.selectedTime.hour = displayHour === 12 ? 12 : displayHour + 12;\n }\n\n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement hour in 12-hour mode\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n */\n decrementHour12(): void {\n let displayHour = this.getDisplayHour();\n displayHour = displayHour === 1 ? 12 : displayHour - 1; // 1-12 cycle\n\n // Convert back to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = displayHour === 12 ? 0 : displayHour;\n } else {\n this.selectedTime.hour = displayHour === 12 ? 12 : displayHour + 12;\n }\n\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle 12-hour input change\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n *\n * IMPORTANT: Input must be 1-12, never 0\n * - User types 0 → converted to 12\n * - User types > 12 → clamped to 12\n */\n onHour12InputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n\n // Validate 1-12 range (0 is not allowed in 12-hour format)\n if (isNaN(value) || value < 1 || value === 0) {\n value = 12; // Default to 12 if invalid or 0\n } else if (value > 12) {\n value = 12;\n }\n\n // Convert to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = value === 12 ? 0 : value;\n } else {\n this.selectedTime.hour = value === 12 ? 12 : value + 12;\n }\n\n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Check if a date is within the current range\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isInRange(day: DayInfo): boolean {\n if (\n this.selectionMode !== 'range' ||\n !this.rangeStart ||\n !this.rangeEnd ||\n !day?.gD\n ) {\n return false;\n }\n\n const dayDate = this._dateUtilsService.parseDate(day.gD);\n const startDate = this._dateUtilsService.parseDate(this.rangeStart.gD);\n const endDate = this._dateUtilsService.parseDate(this.rangeEnd.gD);\n\n if (!dayDate || !startDate || !endDate) {\n return false;\n }\n\n return dayDate >= startDate && dayDate <= endDate;\n }\n\n /**\n * Check if a date is the range start\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isRangeStart(day: DayInfo): boolean {\n return this.selectionMode === 'range' && this.rangeStart?.gD === day?.gD;\n }\n\n /**\n * Check if a date is the range end\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isRangeEnd(day: DayInfo): boolean {\n return this.selectionMode === 'range' && this.rangeEnd?.gD === day?.gD;\n }\n\n /**\n * Reset range selection\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n private resetRange(): void {\n if (this.selectionMode !== 'range') {\n return;\n }\n\n // Clear range highlighting\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD) {\n day.selected = false;\n }\n });\n });\n\n this.rangeStart = undefined;\n this.rangeEnd = undefined;\n this.selectedDay = undefined;\n }\n\n /**\n * Highlight all dates in range\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n private highlightRange(): void {\n if (this.selectionMode !== 'range' || !this.rangeStart || !this.rangeEnd) {\n return;\n }\n\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD) {\n day.selected =\n this.isInRange(day) ||\n this.isRangeStart(day) ||\n this.isRangeEnd(day);\n }\n });\n });\n }\n\n /**\n * Format a date string according to the dateDisplayFormat\n * @param dateStr - Date string in DD/MM/YYYY format\n * @returns Formatted date string\n */\n formatDisplayDate(dateStr: string): string {\n if (!dateStr) return '';\n return this._dateUtilsService.formatDateString(dateStr, this.dateDisplayFormat);\n }\n}","<div class=\"calendar-container\" [dir]=\"dir\" [attr.lang]=\"locale\">\n <div\n class=\"toggle-section\"\n [dir]=\"dir\"\n *ngIf=\"canChangeMode\"\n [ngStyle]=\"{ color: styles.primaryColor }\"\n >\n <span> {{ ummAlQuraDateText }} </span>\n <label class=\"switch\">\n <input\n type=\"checkbox\"\n [disabled]=\"!canChangeMode\"\n [checked]=\"mode === 'ummAlQura'\"\n (change)=\"changeCalendarMode()\"\n #calendarCheckbox\n />\n <span\n class=\"slider\"\n [ngStyle]=\"\n calendarCheckbox.checked\n ? { 'background-color': styles.primaryColor }\n : { 'background-color': styles.secondaryColor }\n \"\n ></span>\n </label>\n </div>\n\n <div\n class=\"todays-date-section\"\n *ngIf=\"todaysDateSection\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n color: styles.primaryColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <div class=\"text-info\">\n <p>{{ todaysDateText }}</p>\n </div>\n\n <div\n class=\"data\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n 'background-color': styles.todaysDateBgColor,\n color: styles.todaysDateTextColor\n }\"\n >\n <p *ngIf=\"mode == 'ummAlQura'\">\n {{ formatDisplayDate(todaysDate.ummAlQura) }}\n </p>\n <p *ngIf=\"mode == 'greg'\">\n {{ formatDisplayDate(todaysDate.gregorian) }}\n </p>\n </div>\n </div>\n\n <div class=\"period-container\">\n <form [formGroup]=\"periodForm\" class=\"period-form\">\n <div\n class=\"select-item\"\n [ngClass]=\"{\n order: dir == 'ltr'\n }\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <label *ngIf=\"!periodForm.controls['year'].value\">{{\n yearSelectLabel\n }}</label>\n\n <select\n formControlName=\"year\"\n class=\"{{ 'icon-' + dir }}\"\n placeholder=\"السنة\"\n (change)=\"onPeriodChange('year')\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n color: styles.primaryColor,\n 'font-family': styles.fontFamily\n }\"\n >\n <option *ngFor=\"let year of years\" [ngValue]=\"year\">\n {{ year }}\n </option>\n </select>\n </div>\n\n <div\n class=\"select-item\"\n [ngClass]=\"{\n order: dir == 'rtl'\n }\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <label *ngIf=\"!periodForm.controls['month'].value\">{{\n monthSelectLabel\n }}</label>\n <select\n class=\"{{ 'icon-' + dir }}\"\n formControlName=\"month\"\n (change)=\"onPeriodChange('month')\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n color: styles.primaryColor,\n 'font-family': styles.fontFamily\n }\"\n >\n <option *ngFor=\"let month of months\" [ngValue]=\"month.value\">\n {{ locale == \"ar\" ? month?.labelAr : month?.labelEn }}\n </option>\n </select>\n </div>\n </form>\n </div>\n\n <div\n class=\"calendar-layout\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <div class=\"week-days\">\n <div\n class=\"week-day\"\n [ngStyle]=\"{ color: styles.dayNameColor }\"\n *ngFor=\"let date of locale == 'ar' ? weekdaysAr : weekdaysEn\"\n >\n {{ date }}\n </div>\n </div>\n\n <div [dir]=\"dir\">\n <div class=\"week\" *ngFor=\"let week of weeks\">\n <div\n class=\"day\"\n *ngFor=\"let day of week\"\n (click)=\"disableDayPicker == false ? onDayClicked(day) : ''\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n color: styles.dayColor\n }\"\n >\n <div\n id=\"greg-day\"\n [ngClass]=\"{\n 'todays-date': checkTodaysDate(day),\n 'selected-date': day?.selected == true,\n 'disabled-day':\n isDateDisabled(day) ||\n (checkFutureValidation(day) && futureValidation),\n 'range-start': isRangeStart(day),\n 'range-end': isRangeEnd(day),\n 'in-range': isInRange(day)\n }\"\n [ngStyle]=\"{\n border:\n markToday && checkTodaysDate(day)\n ? '1px solid ' + styles.primaryColor\n : '',\n 'background-color':\n day?.selected == true || isRangeStart(day) || isRangeEnd(day)\n ? styles.primaryColor\n : isInRange(day)\n ? styles.primaryColor + '33'\n : '',\n color:\n (day?.selected == true ||\n isRangeStart(day) ||\n isRangeEnd(day) ||\n isInRange(day)\n ? styles.todaysDateTextColor\n : '') ||\n (checkFutureValidation(day) && futureValidation\n ? styles.disabledDayColor\n : '') ||\n (isDateDisabled(day) ? styles.disabledDayColor : ''),\n opacity: isDateDisabled(day) ? '0.4' : '1',\n cursor: isDateDisabled(day) ? 'not-allowed' : 'pointer'\n }\"\n >\n <span *ngIf=\"mode == 'greg'\">{{ day?.gD?.split(\"/\")[0] | number }}</span>\n\n <span id=\"ummAlQura-day\" *ngIf=\"mode == 'ummAlQura'\">{{ day?.uD?.split(\"/\")[0] | number }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"future-validation\" dir=\"auto\" *ngIf=\"futureValidationMessage\">\n <span *ngIf=\"locale == 'ar'\">\n {{ futureValidationMessageAr }}\n </span>\n <span *ngIf=\"locale == 'en'\">\n {{ futureValidationMessageEn }}\n </span>\n </div>\n\n <!-- Time Picker Section -->\n <!-- BACKWARD COMPATIBILITY: This section only renders when enableTime=true -->\n <div class=\"time-picker-section\" *ngIf=\"enableTime\" [dir]=\"'ltr'\">\n <div class=\"time-picker-wrapper\">\n <!-- Hour Input with Arrows -->\n <div class=\"time-input-container\">\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-up\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerArrowColor || '#5b479c'\n }\"\n (click)=\"useMeridian ? incrementHour12() : incrementHour()\"\n tabindex=\"-1\"\n aria-label=\"Increment hour\"\n >\n <i class=\"ri-arrow-drop-up-line\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-field\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerTextColor || '#333'\n }\"\n [value]=\"getDisplayHour().toString().padStart(2, '0')\"\n (input)=\"\n useMeridian\n ? onHour12InputChange($event)\n : onHourInputChange($event)\n \"\n (keydown)=\"onTimeKeydown($event, 'hour')\"\n [min]=\"useMeridian ? 1 : 0\"\n [max]=\"useMeridian ? 12 : 23\"\n aria-label=\"Hour\"\n />\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-down\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerArrowColor || '#5b479c'\n }\"\n (click)=\"useMeridian ? decrementHour12() : decrementHour()\"\n tabindex=\"-1\"\n aria-label=\"Decrement hour\"\n >\n <i class=\"ri-arrow-drop-down-line\"></i>\n </button>\n </div>\n\n <!-- Colon Separator -->\n <span\n class=\"time-colon\"\n [ngStyle]=\"{\n color: styles.timePickerColonColor || '#5b479c'\n }\"\n >:</span\n >\n\n <!-- Minute Input with Arrows -->\n <div class=\"time-input-container\">\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-up\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerArrowColor || '#5b479c'\n }\"\n (click)=\"incrementMinute()\"\n tabindex=\"-1\"\n aria-label=\"Increment minute\"\n >\n <i class=\"ri-arrow-drop-up-line\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-field\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerTextColor || '#333'\n }\"\n [value]=\"selectedTime.minute.toString().padStart(2, '0')\"\n (input)=\"onMinuteInputChange($event)\"\n (keydown)=\"onTimeKeydown($event, 'minute')\"\n min=\"0\"\n max=\"59\"\n aria-label=\"Minute\"\n />\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-down\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerArrowColor || '#5b479c'\n }\"\n (click)=\"decrementMinute()\"\n tabindex=\"-1\"\n aria-label=\"Decrement minute\"\n >\n <i class=\"ri-arrow-drop-down-line\"></i>\n </button>\n </div>\n\n <!-- AM/PM Button Group (only when useMeridian=true) -->\n <!-- BACKWARD COMPATIBILITY: This only renders when useMeridian=true -->\n <div class=\"meridian-toggle-group\" *ngIf=\"useMeridian\">\n <button\n type=\"button\"\n class=\"meridian-btn\"\n [class.active]=\"meridian === 'AM'\"\n [ngStyle]=\"\n meridian === 'AM'\n ? {\n 'background-color':\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\n 'border-color':\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\n color: styles.meridianActiveTextColor || '#ffffff'\n }\n : {\n 'background-color': styles.meridianBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.meridianTextColor || '#666'\n }\n \"\n (click)=\"meridian !== 'AM' && toggleMeridian()\"\n [attr.aria-label]=\"'Select ' + amLabel\"\n >\n {{ amLabel }}\n </button>\n <button\n type=\"button\"\n class=\"meridian-btn\"\n [class.active]=\"meridian === 'PM'\"\n [ngStyle]=\"\n meridian === 'PM'\n ? {\n 'background-color':\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\n 'border-color':\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\n color: styles.meridianActiveTextColor || '#ffffff'\n }\n : {\n 'background-color': styles.meridianBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.meridianTextColor || '#666'\n }\n \"\n (click)=\"meridian !== 'PM' && toggleMeridian()\"\n [attr.aria-label]=\"'Select ' + pmLabel\"\n >\n {{ pmLabel }}\n </button>\n </div>\n </div>\n </div>\n\n <div>\n <button\n type=\"button\"\n class=\"confirm-btn\"\n [disabled]=\"\n isRequired &&\n ((!selectedDay && selectionMode !== 'multiple') ||\n (!multipleSelectedDates.length && selectionMode === 'multiple'))\n \"\n (click)=\"onConfirmClicked()\"\n *ngIf=\"showConfirmButton\"\n [ngStyle]=\"{\n 'background-color': styles.secondaryColor,\n color: styles.confirmBtnTextColor,\n 'font-family': styles.fontFamily,\n 'border-radius': styles.borderRadius\n }\"\n >\n {{ submitTextButton }}\n </button>\n </div>\n</div>\n","/**\n * DateTime Input Component\n *\n * A reusable input field with dropdown calendar picker.\n * This component wraps the existing hijri-gregorian-datepicker component\n * and provides form integration via ControlValueAccessor.\n *\n * Features:\n * - Input field that opens dropdown on click\n * - Integrates with Reactive and Template-driven forms\n * - Configurable date/time formats\n * - Min/Max date constraints\n * - Confirm/Cancel actions\n * - Click-outside to close\n * - Accessibility support (keyboard)\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ViewChild,\n ElementRef,\n HostListener,\n OnInit,\n OnDestroy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DayInfo } from '../_interfaces/calendar-model';\nimport { stylesConfig } from '../_interfaces/styles-config.model';\nimport { HijriGregorianDatepickerComponent } from './hijri-gregorian-datepicker.component';\nimport { DateUtilitiesService } from '../_services/date-utilities.service';\n\n@Component({\n standalone: false,\n selector: 'hijri-gregorian-datetime-input',\n templateUrl: './hijri-gregorian-datetime-input.component.html',\n styleUrls: ['./hijri-gregorian-datetime-input.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => HijriGregorianDatetimeInputComponent),\n multi: true,\n },\n ],\n})\nexport class HijriGregorianDatetimeInputComponent\n implements ControlValueAccessor, OnInit, OnDestroy\n{\n // ============================================================\n // CONFIGURATION INPUTS\n // ============================================================\n\n /** Placeholder text for input field */\n @Input() placeholder: string = 'Select date and time';\n\n /** Date format for display (e.g., 'DD/MM/YYYY') */\n @Input() dateFormat: string = 'DD/MM/YYYY';\n\n /** Time format for display (e.g., 'HH:mm' or 'hh:mm A') */\n @Input() timeFormat: string = 'HH:mm';\n\n /** Enable/disable the input */\n @Input() disabled: boolean = false;\n\n /** Enable time picker in the calendar */\n @Input() enableTime: boolean = false;\n\n /** Minimum allowed date (Date object or DD/MM/YYYY string) */\n @Input() minDate?: Date | string;\n\n /** Maximum allowed date (Date object or DD/MM/YYYY string) */\n @Input() maxDate?: Date | string;\n\n /** Initial date to display when opening calendar */\n @Input() initialDate?: Date | string;\n\n /** Calendar mode: 'greg' (Gregorian) or 'ummAlQura' (Hijri) */\n @Input() mode: string = 'greg';\n\n /** Internal mode that persists between open/close */\n currentMode: string = 'greg';\n\n /** Locale: 'en' or 'ar' */\n @Input() locale: string = 'en';\n\n /** Layout direction: 'ltr' or 'rtl' */\n @Input() dir: string = 'ltr';\n\n /** Show confirm button in calendar */\n @Input() showConfirmButton: boolean = true;\n\n /** Confirm button text */\n @Input() submitTextButton: string = 'Confirm';\n\n /** Theme name for calendar styling */\n @Input() theme?: string = '';\n\n /** Allow future dates */\n @Input() futureValidation: boolean = true;\n\n /** Mark today's date */\n @Input() markToday: boolean = true;\n\n /** Show today's date section */\n @Input() todaysDateSection: boolean = true;\n\n /** Enable 12-hour format with AM/PM */\n @Input() useMeridian: boolean = false;\n\n /** Selection mode: 'single', 'multiple', or 'range' */\n @Input() selectionMode: 'single' | 'multiple' | 'range' = 'single';\n\n /** Custom CSS class for input field */\n @Input() inputClass: string = '';\n\n /** Custom CSS class for dropdown panel */\n @Input() dropdownClass: string = '';\n\n /** Custom styles configuration for calendar */\n @Input() styles?: stylesConfig = {};\n\n /** Text label for today's date section */\n @Input() todaysDateText: string = \"Today's Date\";\n\n /** Text label for Hijri date section */\n @Input() ummAlQuraDateText: string = 'Hijri Date';\n\n /** Label for AM in 12-hour format */\n @Input() amLabel: string = 'AM';\n\n /** Label for PM in 12-hour format */\n @Input() pmLabel: string = 'PM';\n\n /** Allow user to toggle between calendar modes (Gregorian/Hijri) */\n @Input() canChangeMode: boolean = true;\n\n /** Disable year picker dropdown */\n @Input() disableYearPicker: boolean = false;\n\n /** Disable month picker dropdown */\n @Input() disableMonthPicker: boolean = false;\n\n /** Disable day selection in calendar */\n @Input() disableDayPicker: boolean = false;\n\n /** Show future validation message when selecting future dates */\n @Input() futureValidationMessage: boolean = false;\n\n /** Label for year select dropdown */\n @Input() yearSelectLabel: string = 'Year';\n\n /** Label for month select dropdown */\n @Input() monthSelectLabel: string = 'Month';\n\n /** English future validation message */\n @Input() futureValidationMessageEn: string =\n 'Selected date cannot be in the future!';\n\n /** Arabic future validation message */\n @Input() futureValidationMessageAr: string =\n 'التاريخ المحدد لا يمكن ان يكون في المستقبل!';\n\n /** Number of past years to show in year picker */\n @Input() pastYearsLimit: number = 90;\n\n /** Number of future years to show in year picker */\n @Input() futureYearsLimit: number = 0;\n\n /** Initial start date for range selection mode */\n @Input() initialRangeStart?: Date | string;\n\n /** Initial end date for range selection mode */\n @Input() initialRangeEnd?: Date | string;\n\n // ============================================================\n // OUTPUTS\n // ============================================================\n\n /** Emitted when date is selected and confirmed */\n @Output() dateSelected = new EventEmitter<DayInfo | DayInfo[]>();\n\n /** Emitted when dropdown opens */\n @Output() dropdownOpened = new EventEmitter<void>();\n\n /** Emitted when dropdown closes */\n @Output() dropdownClosed = new EventEmitter<void>();\n\n // ============================================================\n // INTERNAL STATE\n // ============================================================\n\n /** Whether dropdown is currently open */\n isDropdownOpen: boolean = false;\n\n /** Current displayed value in input field */\n displayValue: string = '';\n\n /** Current selected date/time value */\n currentValue: DayInfo | DayInfo[] | null = null;\n\n /** Reference to the input element */\n @ViewChild('inputElement', { static: false })\n inputElement!: ElementRef<HTMLInputElement>;\n\n /** Reference to the dropdown container */\n @ViewChild('dropdownContainer', { static: false })\n dropdownContainer!: ElementRef<HTMLDivElement>;\n\n /** Reference to the calendar component */\n @ViewChild(HijriGregorianDatepickerComponent, { static: false })\n calendarComponent?: HijriGregorianDatepickerComponent;\n\n // ControlValueAccessor callbacks\n private onChange: (value: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n // ============================================================\n // CONSTRUCTOR\n // ============================================================\n\n constructor(private dateUtilitiesService: DateUtilitiesService) {}\n\n // ============================================================\n // LIFECYCLE HOOKS\n // ============================================================\n\n ngOnInit(): void {\n // Initialize current mode from input\n this.currentMode = this.mode;\n\n // Initialize with initialDate if provided\n if (this.initialDate) {\n this.initializeWithDate(this.initialDate);\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n // ============================================================\n // CONTROL VALUE ACCESSOR IMPLEMENTATION\n // ============================================================\n\n /**\n * Write a new value to the element (from form control)\n */\n writeValue(value: any): void {\n if (value) {\n this.currentValue = value;\n this.updateDisplayValue(value);\n } else {\n this.currentValue = null;\n this.displayValue = '';\n }\n }\n\n /**\n * Register callback for value changes\n */\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n /**\n * Register callback for touch events\n */\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n /**\n * Set the disabled state\n */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // ============================================================\n // DROPDOWN MANAGEMENT\n // ============================================================\n\n /**\n * Toggle dropdown open/close\n */\n toggleDropdown(): void {\n if (this.disabled) return;\n\n if (this.isDropdownOpen) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n /**\n * Open the dropdown panel\n */\n openDropdown(): void {\n if (this.disabled) return;\n\n this.isDropdownOpen = true;\n this.onTouched();\n this.dropdownOpened.emit();\n }\n\n /**\n * Close the dropdown panel\n */\n closeDropdown(): void {\n // Save the current mode from the calendar before closing\n if (this.calendarComponent) {\n this.currentMode = this.calendarComponent.mode;\n }\n this.isDropdownOpen = false;\n this.dropdownClosed.emit();\n }\n\n /**\n * Handle click outside to close dropdown\n */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.isDropdownOpen) return;\n\n const target = event.target as HTMLElement;\n const clickedInside =\n this.inputElement?.nativeElement.contains(target) ||\n this.dropdownContainer?.nativeElement.contains(target);\n\n if (!clickedInside) {\n this.closeDropdown();\n }\n }\n\n /**\n * Handle Escape key to close dropdown\n */\n @HostListener('document:keydown.escape', ['$event'])\n onEscapeKey(event: Event): void {\n if (this.isDropdownOpen) {\n event.preventDefault();\n this.closeDropdown();\n }\n }\n\n /**\n * Handle Enter key to open dropdown when input is focused\n */\n onInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !this.isDropdownOpen) {\n event.preventDefault();\n this.openDropdown();\n }\n }\n\n // ============================================================\n // CALENDAR EVENT HANDLERS\n // ============================================================\n\n /**\n * Handle date selection from calendar (Confirm button or day click)\n */\n onCalendarSubmit(event: DayInfo | DayInfo[]): void {\n // Update currentMode from calendar before formatting\n if (this.calendarComponent) {\n this.currentMode = this.calendarComponent.mode;\n }\n this.currentValue = event;\n this.updateDisplayValue(event);\n this.onChange(event);\n this.dateSelected.emit(event);\n this.closeDropdown();\n }\n\n /**\n * Handle day selection from calendar\n * In range mode, only close when both dates are selected\n * When time picker is enabled, emit value but keep dropdown open\n */\n onDaySelect(event: DayInfo | DayInfo[] | any): void {\n // Update currentMode from calendar before formatting\n if (this.calendarComponent) {\n this.currentMode = this.calendarComponent.mode;\n }\n // Update current value\n this.currentValue = event;\n this.updateDisplayValue(event);\n\n // Always emit the change immediately\n this.onChange(event);\n this.dateSelected.emit(event);\n\n // If time picker is enabled, keep dropdown open for time adjustments\n // User can click outside to close\n if (this.enableTime) {\n // Don't close - let user adjust time or click outside\n return;\n }\n\n // In single selection mode (without time), close immediately\n if (this.selectionMode === 'single') {\n this.closeDropdown();\n return;\n }\n\n // In range selection mode, check if both dates are selected\n if (this.selectionMode === 'range') {\n // Check if event has both start and end (range complete)\n const isRangeComplete =\n event &&\n ((Array.isArray(event) && event.length === 2) ||\n (event.start && event.end));\n\n if (isRangeComplete) {\n // Range is complete, close dropdown\n this.closeDropdown();\n }\n // Otherwise, keep dropdown open for second date selection\n }\n }\n\n /**\n * Handle cancel action\n */\n onCancelClicked(): void {\n this.closeDropdown();\n }\n\n // ============================================================\n // HELPER METHODS\n // ============================================================\n\n /**\n * Initialize component with a date value\n */\n private initializeWithDate(date: Date | string): void {\n // Convert date to DayInfo format if needed\n // This is simplified - in production you'd use DateUtilitiesService\n if (date instanceof Date) {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear();\n const formattedDate = `${day}/${month}/${year}`;\n\n const dayInfo: DayInfo = {\n gD: formattedDate,\n uD: '', // Would need conversion\n dN: '',\n uC: 0,\n selected: true,\n };\n\n if (this.enableTime) {\n dayInfo.time = {\n hour: date.getHours(),\n minute: date.getMinutes(),\n };\n }\n\n this.currentValue = dayInfo;\n this.updateDisplayValue(dayInfo);\n }\n }\n\n /**\n * Update the display value in the input field\n */\n private updateDisplayValue(value: DayInfo | DayInfo[] | any): void {\n if (!value) {\n this.displayValue = '';\n return;\n }\n\n // Handle range selection with start/end properties\n if (value.start) {\n const start = this.formatDayInfo(value.start);\n if (value.end) {\n const end = this.formatDayInfo(value.end);\n this.displayValue = `${start} - ${end}`;\n } else {\n // Only start date selected so far\n this.displayValue = `${start} - ...`;\n }\n return;\n }\n\n if (Array.isArray(value)) {\n // Range selection mode with array\n if (value.length === 2) {\n const start = this.formatDayInfo(value[0]);\n const end = this.formatDayInfo(value[1]);\n this.displayValue = `${start} - ${end}`;\n } else if (value.length === 1) {\n this.displayValue = `${this.formatDayInfo(value[0])} - ...`;\n } else {\n this.displayValue = '';\n }\n } else {\n // Single selection mode\n this.displayValue = this.formatDayInfo(value);\n }\n }\n\n /**\n * Format DayInfo object to display string\n */\n private formatDayInfo(dayInfo: DayInfo): string {\n let result = '';\n\n // Use currentMode instead of mode to respect the active calendar mode\n if (this.currentMode === 'greg') {\n // Use the dateFormat property to format the display\n result = this.dateUtilitiesService.formatDateString(\n dayInfo.gD,\n this.dateFormat\n );\n } else {\n // For Hijri dates, also apply the format\n result = this.dateUtilitiesService.formatDateString(\n dayInfo.uD,\n this.dateFormat\n );\n }\n\n // Append time if available\n if (dayInfo.time && this.enableTime) {\n const hour = dayInfo.time.hour;\n const minute = dayInfo.time.minute.toString().padStart(2, '0');\n\n if (this.useMeridian) {\n // 12-hour format\n const period = hour >= 12 ? this.pmLabel : this.amLabel;\n const displayHour = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n result += ` ${displayHour}:${minute} ${period}`;\n } else {\n // 24-hour format\n result += ` ${hour.toString().padStart(2, '0')}:${minute}`;\n }\n }\n\n return result;\n }\n\n /**\n * Clear the current value\n */\n clearValue(): void {\n this.currentValue = null;\n this.displayValue = '';\n this.onChange(null);\n this.dateSelected.emit(null as any);\n }\n\n /**\n * Get current value (useful for programmatic access)\n */\n getValue(): DayInfo | DayInfo[] | null {\n return this.currentValue;\n }\n\n /**\n * Get the initial date for the calendar picker\n * Handles conversion of currentValue to format accepted by calendar\n */\n getInitialDateForCalendar(): Date | string | undefined {\n if (this.initialDate) {\n return this.initialDate;\n }\n\n // If currentValue is a single DayInfo, create a Date object with time\n if (\n this.currentValue &&\n !Array.isArray(this.currentValue) &&\n !(this.currentValue as any).start\n ) {\n if (this.enableTime && this.currentValue.time) {\n return this.createDateFromDayInfo(this.currentValue);\n }\n return this.currentValue.gD;\n }\n\n return undefined;\n }\n\n /**\n * Get the initial range start for the calendar picker\n * Used to restore range selection when reopening calendar\n */\n getInitialRangeStart(): Date | string | undefined {\n if (!this.currentValue || this.selectionMode !== 'range') {\n return undefined;\n }\n\n // Handle range object with start property\n if ((this.currentValue as any).start) {\n const start = (this.currentValue as any).start;\n if (this.enableTime && start.time) {\n return this.createDateFromDayInfo(start);\n }\n return start.gD;\n }\n\n // Handle array format\n if (Array.isArray(this.currentValue) && this.currentValue.length > 0) {\n const start = this.currentValue[0];\n if (this.enableTime && start.time) {\n return this.createDateFromDayInfo(start);\n }\n return start.gD;\n }\n\n return undefined;\n }\n\n /**\n * Get the initial range end for the calendar picker\n * Used to restore range selection when reopening calendar\n */\n getInitialRangeEnd(): Date | string | undefined {\n if (!this.currentValue || this.selectionMode !== 'range') {\n return undefined;\n }\n\n // Handle range object with end property\n if ((this.currentValue as any).start && (this.currentValue as any).end) {\n const end = (this.currentValue as any).end;\n if (this.enableTime && end.time) {\n return this.createDateFromDayInfo(end);\n }\n return end.gD;\n }\n\n // Handle array format\n if (Array.isArray(this.currentValue) && this.currentValue.length === 2) {\n const end = this.currentValue[1];\n if (this.enableTime && end.time) {\n return this.createDateFromDayInfo(end);\n }\n return end.gD;\n }\n\n return undefined;\n }\n\n /**\n * Create a Date object from DayInfo with time information\n */\n private createDateFromDayInfo(dayInfo: DayInfo): Date {\n // Use service to parse date string\n const date = new Date();\n const parts = dayInfo.gD.split('/');\n const day = parseInt(parts[0], 10);\n const month = parseInt(parts[1], 10) - 1;\n const year = parseInt(parts[2], 10);\n\n date.setFullYear(year, month, day);\n\n // Set time if available\n if (dayInfo.time) {\n date.setHours(dayInfo.time.hour, dayInfo.time.minute, 0, 0);\n } else {\n date.setHours(0, 0, 0, 0);\n }\n\n return date;\n }\n}\n","<!--\r\n DateTime Input Component Template\r\n \r\n Structure:\r\n 1. Input field (click to open dropdown)\r\n 2. Dropdown container (positioned absolutely)\r\n 3. Calendar component (reuses existing hijri-gregorian-datepicker)\r\n 4. Action buttons (Confirm/Cancel)\r\n-->\r\n\r\n<div class=\"datetime-input-wrapper\" [attr.dir]=\"dir\">\r\n <!-- INPUT FIELD -->\r\n <div class=\"input-container\">\r\n <input\r\n #inputElement\r\n type=\"text\"\r\n class=\"datetime-input\"\r\n [class]=\"'datetime-input ' + inputClass\"\r\n [class.rtl-input]=\"dir === 'rtl'\"\r\n [value]=\"displayValue\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled\"\r\n (click)=\"toggleDropdown()\"\r\n (keydown)=\"onInputKeydown($event)\"\r\n readonly\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-haspopup]=\"true\"\r\n [attr.aria-label]=\"placeholder\"\r\n />\r\n\r\n <!-- Calendar Icon -->\r\n <span\r\n class=\"input-icon\"\r\n [class.rtl-icon]=\"dir === 'rtl'\"\r\n (click)=\"!disabled && toggleDropdown()\"\r\n [class.disabled]=\"disabled\"\r\n >\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line>\r\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n </svg>\r\n </span>\r\n\r\n <!-- Clear Button (only if value exists) -->\r\n <button\r\n *ngIf=\"displayValue && !disabled\"\r\n type=\"button\"\r\n class=\"clear-button\"\r\n [class.rtl-clear]=\"dir === 'rtl'\"\r\n (click)=\"clearValue(); $event.stopPropagation()\"\r\n aria-label=\"Clear value\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- DROPDOWN PANEL -->\r\n <div\r\n #dropdownContainer\r\n class=\"dropdown-panel\"\r\n [class]=\"'dropdown-panel ' + dropdownClass\"\r\n [class.open]=\"isDropdownOpen\"\r\n [class.closed]=\"!isDropdownOpen\"\r\n *ngIf=\"isDropdownOpen\"\r\n >\r\n <!-- Calendar Component (reuses existing component) -->\r\n <div class=\"calendar-wrapper\">\r\n <hijri-gregorian-datepicker\r\n [mode]=\"currentMode\"\r\n [locale]=\"locale\"\r\n [dir]=\"dir\"\r\n [enableTime]=\"enableTime\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"maxDate\"\r\n [initialDate]=\"getInitialDateForCalendar()\"\r\n [initialRangeStart]=\"getInitialRangeStart()\"\r\n [initialRangeEnd]=\"getInitialRangeEnd()\"\r\n [theme]=\"theme\"\r\n [styles]=\"styles\"\r\n [futureValidation]=\"futureValidation\"\r\n [markToday]=\"markToday\"\r\n [todaysDateSection]=\"todaysDateSection\"\r\n [todaysDateText]=\"todaysDateText\"\r\n [ummAlQuraDateText]=\"ummAlQuraDateText\"\r\n [amLabel]=\"amLabel\"\r\n [pmLabel]=\"pmLabel\"\r\n [useMeridian]=\"useMeridian\"\r\n [selectionMode]=\"selectionMode\"\r\n [showConfirmButton]=\"false\"\r\n [submitTextButton]=\"submitTextButton\"\r\n [canChangeMode]=\"canChangeMode\"\r\n [disableYearPicker]=\"disableYearPicker\"\r\n [disableMonthPicker]=\"disableMonthPicker\"\r\n [disableDayPicker]=\"disableDayPicker\"\r\n [futureValidationMessage]=\"futureValidationMessage\"\r\n [yearSelectLabel]=\"yearSelectLabel\"\r\n [monthSelectLabel]=\"monthSelectLabel\"\r\n [futureValidationMessageEn]=\"futureValidationMessageEn\"\r\n [futureValidationMessageAr]=\"futureValidationMessageAr\"\r\n [pastYearsLimit]=\"pastYearsLimit\"\r\n [futureYearsLimit]=\"futureYearsLimit\"\r\n [dateDisplayFormat]=\"dateFormat\"\r\n (onSubmit)=\"onCalendarSubmit($any($event))\"\r\n (onDaySelect)=\"onDaySelect($any($event))\"\r\n >\r\n </hijri-gregorian-datepicker>\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\nimport { HijriGregorianDatepickerComponent } from './hijri-gregorian-datepicker.component';\nimport { HijriGregorianDatetimeInputComponent } from './hijri-gregorian-datetime-input.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [\n HijriGregorianDatepickerComponent,\n HijriGregorianDatetimeInputComponent, // NEW: DateTime input component\n ],\n imports: [FormsModule, ReactiveFormsModule, CommonModule],\n exports: [\n HijriGregorianDatepickerComponent,\n HijriGregorianDatetimeInputComponent, // NEW: Export for external use\n ],\n})\nexport class HijriGregorianDatepickerModule {}\n","/*\n * Public API Surface of hijri-gregorian-datepicker\n */\n\nexport * from './_services/date-utilities.service';\nexport * from './lib/hijri-gregorian-datepicker.component';\nexport * from './lib/hijri-gregorian-datetime-input.component'; // NEW: Export datetime input component\nexport * from './lib/hijri-gregorian-datepicker.module';\nexport * from './_interfaces/calendar-model'; // Export interfaces including TimeValue\nexport * from './_interfaces/styles-config.model'; // Export stylesConfig interface\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["datesDictionary['default']","i2.DateUtilitiesService","i1.DateUtilitiesService","i2","i3.HijriGregorianDatepickerComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"angular-hijri-gregorian-date-time-picker.mjs","sources":["../../../projects/hijri-gregorian-datepicker/src/_services/date-utilities.service.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.component.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.component.html","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datetime-input.component.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datetime-input.component.html","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.module.ts","../../../projects/hijri-gregorian-datepicker/src/public-api.ts","../../../projects/hijri-gregorian-datepicker/src/angular-hijri-gregorian-date-time-picker.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport * as datesDictionary from '../_data/dictionary.json';\nimport { Data, DayInfo, MonthDays } from '../_interfaces/calendar-model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DateUtilitiesService {\n public calendarData: Data;\n\n constructor() {\n this.calendarData = (datesDictionary as any)['default'];\n }\n\n parseDate(dateStr: string): Date | null {\n if (!dateStr) {\n return null;\n }\n const parts = dateStr?.split('/');\n if (parts.length !== 3) {\n return null;\n }\n const [day, month, year] = parts.map(Number);\n if (\n isNaN(day) ||\n isNaN(month) ||\n isNaN(year) ||\n day < 1 ||\n day > 31 ||\n month < 1 ||\n month > 12 ||\n year < 1\n ) {\n return null;\n }\n return new Date(year, month - 1, day);\n }\n\n formatDate(date: Date): string {\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n return `${day}/${month}/${year}`;\n }\n\n /**\n * Format date string according to specified format pattern\n * Supported formats: 'DD/MM/YYYY', 'MM/DD/YYYY', 'YYYY/MM/DD', 'YYYY-MM-DD', 'DD-MM-YYYY', 'MM-DD-YYYY'\n * @param dateStr - Date string in DD/MM/YYYY format\n * @param format - Desired output format pattern\n * @returns Formatted date string\n */\n formatDateString(dateStr: string, format: string = 'DD/MM/YYYY'): string {\n if (!dateStr) return '';\n\n const parts = dateStr.split('/');\n if (parts.length !== 3) return dateStr;\n\n const [day, month, year] = parts;\n\n // Determine separator from format\n const separator = format.includes('-') ? '-' : '/';\n\n // Build date according to format pattern\n const formatUpper = format.toUpperCase().replace(/[-/]/g, '/');\n\n switch (formatUpper) {\n case 'DD/MM/YYYY':\n return `${day}${separator}${month}${separator}${year}`;\n case 'MM/DD/YYYY':\n return `${month}${separator}${day}${separator}${year}`;\n case 'YYYY/MM/DD':\n return `${year}${separator}${month}${separator}${day}`;\n case 'YYYY/DD/MM':\n return `${year}${separator}${day}${separator}${month}`;\n case 'DD/YYYY/MM':\n return `${day}${separator}${year}${separator}${month}`;\n case 'MM/YYYY/DD':\n return `${month}${separator}${year}${separator}${day}`;\n default:\n // Default to DD/MM/YYYY\n return `${day}${separator}${month}${separator}${year}`;\n }\n }\n\n getDayShortHand(date: Date): string {\n return date.toLocaleString('en-US', { weekday: 'short' });\n }\n\n generateDates(fD: DayInfo, lD: DayInfo, uC: number): MonthDays {\n const startDate = this.parseDate(fD?.gD);\n const endDate = this.parseDate(lD?.gD);\n const daysInMonth: MonthDays = [];\n let currentGregorianDate = new Date(startDate);\n let currentUmmAlQuraDay = parseInt(fD?.uD?.split('/')[0]);\n let currentUmmAlQuraMonth = parseInt(fD?.uD?.split('/')[1]);\n let currentUmmAlQuraYear = parseInt(fD?.uD?.split('/')[2]);\n let daysInCurrentUmmAlQuraMonth = uC;\n while (currentGregorianDate <= endDate) {\n const ummAlQuraDate = `${currentUmmAlQuraDay\n .toString()\n .padStart(2, '0')}/${currentUmmAlQuraMonth\n .toString()\n .padStart(2, '0')}/${currentUmmAlQuraYear}`;\n daysInMonth.push({\n gD: this.formatDate(currentGregorianDate),\n uD: ummAlQuraDate,\n dN: this.getDayShortHand(currentGregorianDate),\n uC: 0,\n });\n currentGregorianDate.setDate(currentGregorianDate.getDate() + 1);\n currentUmmAlQuraDay += 1;\n if (currentUmmAlQuraDay > daysInCurrentUmmAlQuraMonth) {\n currentUmmAlQuraDay = 1;\n currentUmmAlQuraMonth += 1;\n if (currentUmmAlQuraMonth > 12) {\n currentUmmAlQuraMonth = 1;\n currentUmmAlQuraYear += 1;\n }\n const nextMonthData =\n this.calendarData[currentUmmAlQuraYear.toString()]?.[\n currentUmmAlQuraMonth.toString()\n ];\n daysInCurrentUmmAlQuraMonth = nextMonthData ? nextMonthData.fD.uC : 30;\n }\n }\n return daysInMonth;\n }\n\n convertDate(dateStr: string, isGregorian: boolean): DayInfo | null {\n if (!dateStr) return null;\n\n if (isGregorian) {\n // Preprocess Gregorian date\n const gregorianDate = this.parseDate(dateStr);\n if (!gregorianDate) return null;\n const formattedDate = this.formatDate(gregorianDate);\n\n for (const yearKey in this.calendarData) {\n for (const monthKey in this.calendarData[yearKey]) {\n const monthData = this.calendarData[yearKey][monthKey];\n\n if (\n this.isDateInMonthRange(\n formattedDate,\n monthData.fD?.gD,\n monthData.lD?.gD\n )\n ) {\n const daysInMonth = this.generateDates(\n monthData.fD,\n monthData.lD,\n monthData.fD?.uC\n );\n\n const dayMatch = daysInMonth.find((d) => d.gD === formattedDate);\n if (dayMatch) return dayMatch;\n }\n }\n }\n } else {\n const [day, month, year] = dateStr.split('/').map(Number);\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null;\n\n for (const yearKey in this.calendarData) {\n for (const monthKey in this.calendarData[yearKey]) {\n const monthData = this.calendarData[yearKey][monthKey];\n\n if (\n this.isDateInMonthRange(\n `${day}/${month}/${year}`,\n monthData.fD?.uD,\n monthData.lD?.uD\n )\n ) {\n const daysInMonth = this.generateDates(\n monthData.fD,\n monthData.lD,\n monthData.fD?.uC\n );\n\n const dayMatch = daysInMonth.find((d) => {\n const [uDay, uMonth, uYear] = d?.uD?.split('/').map(Number);\n return uDay === day && uMonth === month && uYear === year;\n });\n\n if (dayMatch) return dayMatch;\n }\n }\n }\n }\n\n return null;\n }\n\n private isDateInMonthRange(\n dateToCheck: string,\n monthStartDate: string | undefined,\n monthEndDate: string | undefined\n ): boolean {\n if (!monthStartDate || !monthEndDate) return false;\n\n const checkDate = this.parseDate(dateToCheck);\n const startDate = this.parseDate(monthStartDate);\n const endDate = this.parseDate(monthEndDate);\n\n if (!checkDate || !startDate || !endDate) return false;\n\n return checkDate >= startDate && checkDate <= endDate;\n }\n\n getMonthData(inputDate: string, type: string): DayInfo[] | null {\n const [day, month, year] = inputDate?.split('/').map(Number);\n let isGregorian: boolean;\n if (type == 'greg') {\n isGregorian = true;\n } else {\n isGregorian = false;\n }\n if (isGregorian) {\n return this.getGregorianMonthData(day, month, year);\n } else {\n return this.getUmAlQurraMonthData(day, month, year);\n }\n }\n\n getGregorianMonthData(\n day: number,\n month: number,\n year: number\n ): DayInfo[] | null {\n const yearData = this.calendarData[year];\n if (!yearData) return null;\n const monthData = yearData[month];\n if (!monthData) return null;\n const monthArray: DayInfo[] = [];\n const endDate = new Date(year, month, 0);\n for (let d = 1; d <= endDate.getDate(); d++) {\n const offset = d - 1;\n\n monthArray.push({\n gD: `${d.toString().padStart(2, '0')}/${month\n .toString()\n .padStart(2, '0')}/${year}`,\n uD: this.calculateUmAlQurraDate(\n monthData.fD.uD,\n offset,\n monthData.fD.uC\n ),\n dN: this.getDayName(new Date(year, month - 1, d).getDay()),\n uC: monthData.fD.uC,\n });\n }\n\n return monthArray;\n }\n\n getUmAlQurraMonthData(\n day: number,\n month: number,\n year: number\n ): DayInfo[] | null {\n for (const gregorianYear in this.calendarData) {\n const yearData = this.calendarData[parseInt(gregorianYear)];\n\n for (const monthIndex in yearData) {\n const monthData = yearData[parseInt(monthIndex)];\n const [fDay, fMonth, fYear] = monthData?.fD?.uD?.split('/').map(Number);\n\n if (fYear === year && fMonth === month) {\n const totalDays = monthData.fD.uC;\n const monthArray: DayInfo[] = [];\n const umAlQurraStartDate = `01/${month\n .toString()\n .padStart(2, '0')}/${year}`;\n const dayDifference = fDay - 1;\n\n const startGregorianDate = this.calculateGregorianDate(\n monthData.fD.gD,\n -dayDifference\n );\n\n for (let i = 0; i < totalDays; i++) {\n const uDate = this.calculateUmAlQurraDate(\n umAlQurraStartDate,\n i,\n totalDays\n );\n const gDate = this.calculateGregorianDate(startGregorianDate, i);\n const [gDay, gMonth, gYear] = gDate?.split('/').map(Number);\n const dayName = this.getDayName(\n new Date(gYear, gMonth - 1, gDay).getDay()\n );\n\n monthArray.push({\n gD: gDate,\n uD: uDate,\n dN: dayName,\n uC: totalDays,\n });\n }\n\n return monthArray;\n }\n }\n }\n\n return null;\n }\n\n calculateGregorianDate(startGDate: string, offset: number): string {\n const [day, month, year] = startGDate?.split('/').map(Number);\n const newDate = new Date(year, month - 1, day + offset);\n\n return `${newDate.getDate().toString().padStart(2, '0')}/${(\n newDate.getMonth() + 1\n )\n .toString()\n .padStart(2, '0')}/${newDate.getFullYear()}`;\n }\n\n calculateUmAlQurraDate(\n startUDate: string,\n offset: number,\n uC: number\n ): string {\n const [day, month, year] = startUDate?.split('/').map(Number);\n\n let newDay = day + offset;\n let newMonth = month;\n let newYear = year;\n\n while (newDay > uC) {\n newDay -= uC;\n newMonth += 1;\n }\n\n while (newMonth > 12) {\n newMonth = 1;\n newYear += 1;\n }\n\n return `${newDay.toString().padStart(2, '0')}/${newMonth\n .toString()\n .padStart(2, '0')}/${newYear}`;\n }\n\n getDayName(dayIndex: number): string {\n const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n return days[dayIndex];\n }\n\n /// Check date is it in past or future\n checkPastOrFuture(inputDate: any, targetDate: any) {\n if (inputDate) {\n const [day, month, year] = inputDate?.split('/').map(Number);\n const dateToCheck = new Date(year, month - 1, day);\n const today = targetDate;\n today.setHours(0, 0, 0, 0);\n if (dateToCheck > today) {\n return 'Future';\n } else if (dateToCheck < today) {\n return 'Past';\n } else {\n return 'Today';\n }\n }\n }\n\n /// Convert english numbers to arabic equivalent\n parseEnglish(englishNum: any) {\n if (!englishNum) return englishNum;\n const numStr = String(englishNum);\n const arabicNumbers = [\n '\\u0660',\n '\\u0661',\n '\\u0662',\n '\\u0663',\n '\\u0664',\n '\\u0665',\n '\\u0666',\n '\\u0667',\n '\\u0668',\n '\\u0669',\n ];\n return numStr.replace(/[0-9]/g, (digit) => {\n return arabicNumbers[Number(digit)] || digit;\n });\n }\n\n /// Convert arabic numbers to english equivalent\n parseArabic(arabicNum: any) {\n return arabicNum.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function (d: string) {\n return d.charCodeAt(0) - 1632;\n });\n }\n\n ///\n convertDateNumerals(date: string, targetLang: 'en' | 'ar'): string {\n const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\n const toArabic = (value: string) =>\n value\n .split('')\n .map((char) => (/\\d/.test(char) ? arabicNumbers[+char] : char))\n .join('');\n\n const toEnglish = (value: string) =>\n value\n .split('')\n .map((char) => {\n const index = arabicNumbers.indexOf(char);\n return index > -1 ? englishNumbers[index] : char;\n })\n .join('');\n\n if (targetLang === 'ar') {\n const [day, month, year] = date.split('/');\n return `${toArabic(year)}/${toArabic(month)}/${toArabic(day)}`;\n } else {\n const [year, month, day] = date.split('/');\n return `${toEnglish(day)}/${toEnglish(month)}/${toEnglish(year)}`;\n }\n }\n\n /**\n * Normalize input date to DD/MM/YYYY string format (Gregorian)\n * Accepts Date object or DD/MM/YYYY string\n */\n normalizeDateToString(date: Date | string | undefined): string | null {\n if (!date) return null;\n\n if (date instanceof Date) {\n return this.formatDate(date);\n }\n\n // Already a string - validate format\n const parsed = this.parseDate(date);\n return parsed ? this.formatDate(parsed) : null;\n }\n\n /**\n * Compare two dates (Gregorian format DD/MM/YYYY)\n * Returns: -1 if date1 < date2, 0 if equal, 1 if date1 > date2\n */\n compareDates(date1Str: string, date2Str: string): number {\n const d1 = this.parseDate(date1Str);\n const d2 = this.parseDate(date2Str);\n\n if (!d1 || !d2) return 0;\n\n if (d1 < d2) return -1;\n if (d1 > d2) return 1;\n return 0;\n }\n\n /**\n * Compare two Hijri dates (UM format DD/MM/YYYY)\n * Converts to Gregorian for comparison\n */\n compareHijriDates(hijri1: string, hijri2: string): number {\n const day1 = this.convertDate(hijri1, false);\n const day2 = this.convertDate(hijri2, false);\n\n if (!day1?.gD || !day2?.gD) return 0;\n\n return this.compareDates(day1.gD, day2.gD);\n }\n\n /**\n * Check if a date is within the specified range (inclusive)\n * All dates in Gregorian DD/MM/YYYY format\n */\n isDateInRange(\n dateStr: string,\n minDateStr: string | null,\n maxDateStr: string | null\n ): boolean {\n if (!dateStr) return false;\n\n // If no constraints, date is valid\n if (!minDateStr && !maxDateStr) return true;\n\n // Check minimum constraint\n if (minDateStr && this.compareDates(dateStr, minDateStr) < 0) {\n return false;\n }\n\n // Check maximum constraint\n if (maxDateStr && this.compareDates(dateStr, maxDateStr) > 0) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if a Hijri date is within the specified range\n * Converts to Gregorian for comparison\n */\n isHijriDateInRange(\n hijriDateStr: string,\n minDateStr: string | null,\n maxDateStr: string | null\n ): boolean {\n if (!hijriDateStr) return false;\n\n const dayInfo = this.convertDate(hijriDateStr, false);\n if (!dayInfo?.gD) return false;\n\n return this.isDateInRange(dayInfo.gD, minDateStr, maxDateStr);\n }\n\n transformDate(dateString: string) {\n const date = new Date(dateString);\n // Gregorian date (DD/MM/YYYY)\n const gD = `${String(date.getDate()).padStart(2, '0')}/${String(\n date.getMonth() + 1\n ).padStart(2, '0')}/${date.getFullYear()}`;\n\n // Day name\n const dN = date.toLocaleDateString('en-US', { weekday: 'long' });\n\n // Time\n const time = {\n hour: date.getHours(),\n minute: date.getMinutes(),\n };\n\n // Hijri (Umm Al-Qura)\n const hijriFormatter = new Intl.DateTimeFormat(\n 'ar-SA-u-ca-islamic-umalqura-nu-latn',\n {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n }\n );\n\n const hijriParts = hijriFormatter.formatToParts(date);\n\n const day = hijriParts.find((p) => p.type === 'day')?.value;\n const month = hijriParts.find((p) => p.type === 'month')?.value;\n const year = hijriParts.find((p) => p.type === 'year')?.value;\n\n const uD = `${day}/${month}/${year}`;\n\n return {\n gD,\n uD,\n dN,\n uC: 0,\n selected: true,\n time,\n };\n }\n}\n","import {\n Component,\n Input,\n OnInit,\n Output,\n EventEmitter,\n HostBinding,\n OnChanges,\n SimpleChanges,\n AfterViewInit,\n} from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { stylesConfig } from '../_interfaces/styles-config.model';\nimport { DateUtilitiesService } from '../_services/date-utilities.service';\nimport { TodayDate, DayInfo } from '../_interfaces/calendar-model';\nimport * as themesConfig from '../themes/themes.json';\n@Component({\n standalone: false,\n selector: 'hijri-gregorian-datepicker',\n templateUrl: './hijri-gregorian-datepicker.component.html',\n styleUrls: ['./hijri-gregorian-datepicker.component.scss'],\n})\nexport class HijriGregorianDatepickerComponent\n implements OnInit, OnChanges, AfterViewInit\n{\n // Local storage key for persisting calendar mode\n private readonly STORAGE_KEY = 'hg_datepicker_mode';\n /// Inputs\n @Input() markToday: boolean = true;\n @Input() canChangeMode: boolean = true;\n @Input() todaysDateSection: boolean = true;\n @Input() futureValidation: boolean = true;\n @Input() disableYearPicker: boolean = false;\n @Input() disableMonthPicker: boolean = false;\n @Input() disableDayPicker: boolean = false;\n @Input() isRequired: boolean = false;\n @Input() showConfirmButton: boolean = true;\n @Input() futureValidationMessage: boolean = false;\n @Input() mode: string = 'greg';\n @Input() dir: string = 'ltr';\n @Input() locale: string = 'en';\n @Input() submitTextButton: string = 'Confirm';\n @Input() todaysDateText: string = \"Today's Date\";\n @Input() ummAlQuraDateText: string = 'Hijri Date';\n @Input() monthSelectLabel: string = 'Month';\n @Input() yearSelectLabel: string = 'Year';\n @Input() amLabel: string = 'AM'; // Label for AM in 12-hour format\n @Input() pmLabel: string = 'PM'; // Label for PM in 12-hour format\n @Input() futureValidationMessageEn: string;\n @Input() futureValidationMessageAr: string;\n @Input() theme?: string = '';\n @Input() pastYearsLimit: number = 90;\n @Input() futureYearsLimit: number = 0;\n @Input() styles?: stylesConfig = {};\n\n // New inputs for extended functionality\n @Input() enableTime: boolean = false; // Enable time picker (hours & minutes)\n @Input() minDate?: Date | string; // Minimum allowed date (Gregorian Date or DD/MM/YYYY string)\n @Input() maxDate?: Date | string; // Maximum allowed date (Gregorian Date or DD/MM/YYYY string)\n @Input() initialDate?: Date | string; // Initial date to navigate to when picker opens\n\n // Range selection initial dates\n @Input() initialRangeStart?: Date | string; // Initial start date for range selection\n @Input() initialRangeEnd?: Date | string; // Initial end date for range selection\n\n // BACKWARD COMPATIBILITY: Default to false (24-hour format)\n // When true, displays 12-hour format with AM/PM toggle\n @Input() useMeridian: boolean = false; // Enable 12-hour format with AM/PM\n\n // BACKWARD COMPATIBILITY: Default to 'single' (existing behavior)\n // 'multiple' enables multi-date selection, 'range' enables range selection (start to end)\n @Input() selectionMode: 'single' | 'multiple' | 'range' = 'single';\n\n // Date display format for input fields\n // Supported formats: 'DD/MM/YYYY', 'MM/DD/YYYY', 'YYYY/MM/DD', 'YYYY-MM-DD', 'DD-MM-YYYY', 'MM-DD-YYYY'\n @Input() dateDisplayFormat: string = 'DD/MM/YYYY';\n /// Outputs\n @Output() onSubmit = new EventEmitter<object>();\n @Output() onDaySelect = new EventEmitter<object>();\n @Output() onMonthChange = new EventEmitter<object>();\n @Output() onYearChange = new EventEmitter<object>();\n /// Variables\n ummAlQuraMonths = [\n { labelAr: 'محرم', labelEn: 'Muharram', value: 1 },\n { labelAr: 'صفر', labelEn: 'Safar', value: 2 },\n { labelAr: 'ربيع الأول', labelEn: 'Rabi al-Awwal', value: 3 },\n { labelAr: 'ربيع الثاني', labelEn: 'Rabi al-Thani', value: 4 },\n { labelAr: 'جمادى الأولى', labelEn: 'Jumada al-Awwal', value: 5 },\n { labelAr: 'جمادى الآخرة', labelEn: 'Jumada al-Thani', value: 6 },\n { labelAr: 'رجب', labelEn: 'Rajab', value: 7 },\n { labelAr: 'شعبان', labelEn: 'Shaban', value: 8 },\n { labelAr: 'رمضان', labelEn: 'Ramadan', value: 9 },\n { labelAr: 'شوال', labelEn: 'Shawwal', value: 10 },\n { labelAr: 'ذو القعدة', labelEn: 'Dhu al-Qadah', value: 11 },\n { labelAr: 'ذو الحجة', labelEn: 'Dhu al-Hijjah', value: 12 },\n ];\n gregMonths = [\n { labelAr: 'يناير', labelEn: 'January', value: 1 },\n { labelAr: 'فبراير', labelEn: 'February', value: 2 },\n { labelAr: 'مارس', labelEn: 'March', value: 3 },\n { labelAr: 'ابريل', labelEn: 'April', value: 4 },\n { labelAr: 'مايو', labelEn: 'May', value: 5 },\n { labelAr: 'يونيو', labelEn: 'June', value: 6 },\n { labelAr: 'يوليو', labelEn: 'July', value: 7 },\n { labelAr: 'اغسطس', labelEn: 'August', value: 8 },\n { labelAr: 'سبتمبر', labelEn: 'September', value: 9 },\n { labelAr: 'اكتوبر', labelEn: 'October', value: 10 },\n { labelAr: 'نوفمبر', labelEn: 'November', value: 11 },\n { labelAr: 'ديسمبر', labelEn: 'December', value: 12 },\n ];\n ummAlQuraYear: number;\n gregYear: number;\n years: any[];\n weeks: any[];\n months: any[];\n weekdaysEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n weekdaysAr = ['سبت', 'جمعة', 'خميس', 'أربعاء', 'ثلاثاء', 'اثنين', 'أحد'];\n todaysDate: TodayDate = {};\n selectedDay: DayInfo;\n periodForm: UntypedFormGroup;\n multipleSelectedDates = [] as DayInfo[];\n themes = [] as any;\n\n // Time picker variables\n // BACKWARD COMPATIBILITY: selectedTime defaults to 0:0 to preserve existing behavior when enableTime=false\n // When enableTime=true, this will be initialized to current system time in ngOnInit\n selectedTime: { hour: number; minute: number } = { hour: 0, minute: 0 };\n\n // Track if time has been initialized to avoid re-initializing at midnight\n private timeInitialized: boolean = false;\n\n // BACKWARD COMPATIBILITY: Meridian only used when useMeridian=true\n // Tracks AM/PM state for 12-hour format\n meridian: 'AM' | 'PM' = 'AM';\n\n // Range selection state\n // BACKWARD COMPATIBILITY: These are only used when selectionMode='range'\n // They do not affect single or multiple selection modes\n rangeStart?: DayInfo = undefined;\n rangeEnd?: DayInfo = undefined;\n\n @HostBinding('style.font-family') fontFamilyStyle: string;\n constructor(\n public formBuilder: UntypedFormBuilder,\n public _dateUtilsService: DateUtilitiesService\n ) {}\n\n ngOnInit(): void {\n this.initTheme();\n this.initializeForm();\n this.getTodaysDateInfo();\n this.initializeYearsAndMonths();\n\n // Initialize time from current system time or initialDate\n // BACKWARD COMPATIBILITY: This only runs when enableTime=true\n if (this.enableTime) {\n this.initializeTime();\n }\n\n // Load persisted calendar mode if available\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n if (stored) {\n this.mode = stored;\n }\n } catch (e) {\n // ignore storage errors (e.g., SSR or disabled storage)\n }\n }\n\n ngAfterViewInit(): void {\n // Double-check time initialization after view is ready\n // This handles cases where enableTime might be set after ngOnInit\n if (this.enableTime && !this.timeInitialized) {\n this.initializeTime();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['mode'] && !changes['mode'].isFirstChange()) {\n // Don't emit during initialization, only when mode changes after init\n const previousMode = changes['mode'].previousValue;\n const currentMode = changes['mode'].currentValue;\n if (previousMode !== currentMode) {\n this.changeCalendarMode();\n }\n }\n }\n\n initTheme() {\n if (this.theme != '') {\n this.themes = themesConfig;\n for (const themeItem of this.themes['default']) {\n if (themeItem.name == this.theme) {\n this.styles = themeItem.stylesConfig;\n break;\n }\n }\n }\n this.fontFamilyStyle = this.styles.fontFamily;\n }\n\n /// Initialize form control for month and year select\n initializeForm() {\n this.periodForm = this.formBuilder.group({\n year: [{ value: '', disabled: this.disableYearPicker }, []],\n month: [{ value: '', disabled: this.disableMonthPicker }, []],\n });\n }\n\n // Initialize years and months for calendar\n initializeYearsAndMonths() {\n this.years = [];\n this.months = [];\n\n // Determine the date to use for initialization (initialDate or today)\n let referenceDate: string;\n if (this.initialDate) {\n const normalizedInitialDate =\n this._dateUtilsService.normalizeDateToString(this.initialDate);\n if (normalizedInitialDate) {\n if (this.mode == 'greg') {\n referenceDate = normalizedInitialDate;\n } else {\n const hijriDate = this._dateUtilsService.convertDate(\n normalizedInitialDate,\n true\n );\n referenceDate = hijriDate?.uD || this.todaysDate.ummAlQura;\n }\n } else {\n referenceDate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n } else {\n referenceDate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n\n if (this.mode == 'greg') {\n this.gregYear =\n this.futureYearsLimit == 0\n ? Number(referenceDate?.split('/')[2])\n : Number(referenceDate?.split('/')[2]) + this.futureYearsLimit;\n for (let i = 0; i < this.gregYear; i++) {\n if (i < this.pastYearsLimit) {\n let val = this.gregYear--;\n this.years.push(val);\n } else {\n break;\n }\n }\n this.months = this.gregMonths;\n } else {\n this.ummAlQuraYear =\n this.futureYearsLimit == 0\n ? Number(referenceDate?.split('/')[2])\n : Number(referenceDate?.split('/')[2]) + this.futureYearsLimit;\n for (let i = 0; i < this.ummAlQuraYear; i++) {\n if (i < this.pastYearsLimit) {\n let val = this.ummAlQuraYear--;\n this.years.push(val);\n } else {\n break;\n }\n }\n this.months = this.ummAlQuraMonths;\n }\n this.years.map((year: any) => {\n if (year == referenceDate?.split('/')[2]) {\n this.periodForm.controls['year'].setValue(year);\n }\n });\n this.months.map((month: any) => {\n if (month.value == referenceDate?.split('/')[1]) {\n this.periodForm.controls['month'].setValue(month.value);\n }\n });\n }\n\n /// On change event of years and months\n onPeriodChange(type: string) {\n if (type == 'year') {\n this.onYearChange.emit(this.periodForm.controls['year'].value);\n } else {\n this.onMonthChange.emit(this.periodForm.controls['month'].value);\n }\n const days = this._dateUtilsService.getMonthData(\n '01/' +\n this.periodForm.controls['month'].value +\n '/' +\n this.periodForm.controls['year'].value,\n this.mode\n );\n this.weeks = this.generateWeeksArray(days);\n }\n\n /// Get todays(greg and umm al qura) date info\n getTodaysDateInfo() {\n this.todaysDate.gregorian = this._dateUtilsService.formatDate(new Date());\n this.todaysDate.ummAlQura = this._dateUtilsService.convertDate(\n this.todaysDate.gregorian,\n true\n )?.uD;\n\n // Use initialDate if provided, otherwise use today's date\n let dateToNavigate: string;\n\n if (this.initialDate) {\n // Normalize initialDate to DD/MM/YYYY format\n const normalizedInitialDate =\n this._dateUtilsService.normalizeDateToString(this.initialDate);\n\n if (normalizedInitialDate) {\n if (this.mode == 'greg') {\n dateToNavigate = normalizedInitialDate;\n } else {\n // Convert to Hijri for ummAlQura mode\n const hijriDate = this._dateUtilsService.convertDate(\n normalizedInitialDate,\n true\n );\n dateToNavigate = hijriDate?.uD || this.todaysDate.ummAlQura;\n }\n } else {\n // Invalid initialDate, fall back to today\n dateToNavigate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n } else {\n // No initialDate provided, use today\n dateToNavigate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n\n this.generatetMonthData(dateToNavigate);\n\n // Highlight initialDate or initialRange if provided\n if (\n this.selectionMode === 'range' &&\n (this.initialRangeStart || this.initialRangeEnd)\n ) {\n this.highlightInitialRange();\n } else if (this.initialDate) {\n this.highlightInitialDate();\n }\n }\n\n /// Generate month days from JSON\n generatetMonthData(date: string) {\n const days = this._dateUtilsService.getMonthData(date, this.mode);\n this.weeks = this.generateWeeksArray(days);\n }\n\n /// Highlight initialDate on the calendar\n private highlightInitialDate() {\n if (!this.initialDate) {\n return;\n }\n\n const normalizedInitialDate = this._dateUtilsService.normalizeDateToString(\n this.initialDate\n );\n\n if (!normalizedInitialDate) {\n return;\n }\n\n // Find the day in the weeks array that matches initialDate\n for (const week of this.weeks) {\n for (const day of week) {\n if (day && day.gD === normalizedInitialDate) {\n // Don't select if date is disabled\n if (!this.isDateDisabled(day)) {\n // Mark as selected without triggering events\n day.selected = true;\n\n // Set as selectedDay based on selection mode\n if (this.selectionMode === 'range') {\n this.rangeStart = day;\n } else if (this.selectionMode === 'multiple') {\n this.multipleSelectedDates = [day];\n } else {\n this.selectedDay = day;\n }\n\n // Initialize time if enableTime is active\n if (this.enableTime && !this.timeInitialized) {\n this.initializeTime();\n }\n\n // Attach time to the day if it's a Date object with time\n if (this.enableTime && this.initialDate instanceof Date) {\n day.time = {\n hour: this.initialDate.getHours(),\n minute: this.initialDate.getMinutes(),\n };\n }\n }\n return;\n }\n }\n }\n }\n\n /// Highlight initial range (start and end dates) on the calendar\n private highlightInitialRange() {\n if (!this.initialRangeStart && !this.initialRangeEnd) {\n return;\n }\n\n const normalizedStartDate = this.initialRangeStart\n ? this._dateUtilsService.normalizeDateToString(this.initialRangeStart)\n : null;\n const normalizedEndDate = this.initialRangeEnd\n ? this._dateUtilsService.normalizeDateToString(this.initialRangeEnd)\n : null;\n\n let startDay: DayInfo | null = null;\n let endDay: DayInfo | null = null;\n\n // Find both start and end dates in the weeks array\n for (const week of this.weeks) {\n for (const day of week) {\n if (day && normalizedStartDate && day.gD === normalizedStartDate) {\n if (!this.isDateDisabled(day)) {\n startDay = day;\n }\n }\n if (day && normalizedEndDate && day.gD === normalizedEndDate) {\n if (!this.isDateDisabled(day)) {\n endDay = day;\n }\n }\n }\n }\n\n // Set range start\n if (startDay) {\n startDay.selected = true;\n this.rangeStart = startDay;\n this.selectedDay = startDay;\n\n // Initialize and attach time to start date\n if (this.enableTime) {\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n if (this.initialRangeStart instanceof Date) {\n startDay.time = {\n hour: this.initialRangeStart.getHours(),\n minute: this.initialRangeStart.getMinutes(),\n };\n } else {\n startDay.time = { ...this.selectedTime };\n }\n }\n }\n\n // Set range end if provided\n if (endDay && startDay) {\n // Swap if end is before start\n const startDate = this._dateUtilsService.parseDate(startDay.gD);\n const endDate = this._dateUtilsService.parseDate(endDay.gD);\n\n if (endDate && startDate && endDate < startDate) {\n // Swap\n this.rangeEnd = startDay;\n this.rangeStart = endDay;\n endDay.selected = true;\n } else {\n this.rangeEnd = endDay;\n }\n\n // Attach time to end date (inherit from start)\n if (this.enableTime) {\n const timeToUse = this.rangeStart.time || { ...this.selectedTime };\n if (this.initialRangeEnd instanceof Date) {\n this.rangeEnd.time = {\n hour: this.initialRangeEnd.getHours(),\n minute: this.initialRangeEnd.getMinutes(),\n };\n } else {\n this.rangeEnd.time = { ...timeToUse };\n }\n // Ensure start also has time\n this.rangeStart.time = { ...timeToUse };\n }\n\n // Highlight the range\n this.highlightRange();\n this.selectedDay = this.rangeEnd;\n }\n }\n\n /// Generate month weeks\n generateWeeksArray(daysArray: any) {\n const firstDayName = daysArray[0]?.dN;\n const startIndex = this.weekdaysEn.indexOf(firstDayName);\n const weeks = [[]] as any;\n let currentWeek = 0;\n let currentDayIndex = startIndex;\n\n daysArray?.forEach((day: any) => {\n if (!weeks[currentWeek]) {\n weeks[currentWeek] = [];\n }\n\n weeks[currentWeek][currentDayIndex] = day;\n currentDayIndex++;\n\n if (currentDayIndex === 7) {\n currentDayIndex = 0;\n currentWeek++;\n }\n });\n weeks.forEach((week: any) => {\n while (week.length < 7) {\n week.push({});\n }\n });\n return weeks;\n }\n\n /// Change calendar mode 'greg' or 'ummAlQura'\n changeCalendarMode() {\n this.mode = this.mode == 'greg' ? 'ummAlQura' : 'greg';\n this.initializeYearsAndMonths();\n this.generatetMonthData(\n '01/' +\n this.periodForm.controls['month'].value +\n '/' +\n this.periodForm.controls['year'].value\n );\n\n // Reapply selection after mode change\n this.reapplySelection();\n\n // Persist new mode\n try {\n localStorage.setItem(this.STORAGE_KEY, this.mode);\n } catch (e) {\n // ignore storage errors\n }\n }\n\n /**\n * Reapply selection state after calendar regeneration\n * This ensures selected days remain highlighted when switching between modes\n */\n private reapplySelection(): void {\n if (!this.weeks || this.weeks.length === 0) {\n return;\n }\n\n // Handle range selection mode\n if (this.selectionMode === 'range') {\n if (this.rangeStart && this.rangeEnd) {\n this.highlightRange();\n // Restore time to range dates\n if (this.enableTime) {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD === this.rangeStart?.gD && this.rangeStart.time) {\n day.time = { ...this.rangeStart.time };\n }\n if (day && day.gD === this.rangeEnd?.gD && this.rangeEnd.time) {\n day.time = { ...this.rangeEnd.time };\n }\n });\n });\n }\n } else if (this.rangeStart) {\n // Only start date selected\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD === this.rangeStart?.gD) {\n day.selected = true;\n // Restore time\n if (this.enableTime && this.rangeStart.time) {\n day.time = { ...this.rangeStart.time };\n this.selectedTime = { ...this.rangeStart.time };\n }\n }\n });\n });\n }\n return;\n }\n\n // Handle single/multiple selection mode\n if (this.selectedDay) {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD === this.selectedDay?.gD) {\n day.selected = true;\n // Restore time\n if (this.enableTime && this.selectedDay.time) {\n day.time = { ...this.selectedDay.time };\n this.selectedTime = { ...this.selectedDay.time };\n }\n }\n });\n });\n }\n\n // Handle multiple selection\n if (this.multipleSelectedDates && this.multipleSelectedDates.length > 0) {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD) {\n const matchingDay = this.multipleSelectedDates.find(\n (selectedDay) => selectedDay.gD === day.gD\n );\n if (matchingDay) {\n day.selected = true;\n // Restore time\n if (this.enableTime && matchingDay.time) {\n day.time = { ...matchingDay.time };\n }\n }\n }\n });\n });\n }\n }\n\n /// On day clicked handler\n onDayClicked(day: DayInfo) {\n if (day && day?.gD) {\n // Check if day is disabled by min/max constraints\n if (this.isDateDisabled(day)) {\n return; // Don't allow selection of disabled dates\n }\n\n if (this.futureValidation) {\n if (this.checkFutureValidation(day)) {\n this.futureValidationMessage = true;\n } else {\n this.futureValidationMessage = false;\n this.markDaySelected(day);\n }\n } else {\n this.markDaySelected(day);\n }\n }\n }\n\n /// Mark day as selected\n markDaySelected(dayInfo: DayInfo) {\n // BACKWARD COMPATIBILITY: Range selection only when selectionMode='range'\n if (this.selectionMode === 'range') {\n this.handleRangeSelection(dayInfo);\n return;\n }\n\n // BACKWARD COMPATIBILITY: Original behavior for single/multiple selection\n if (dayInfo.selected) {\n dayInfo.selected = false;\n this.multipleSelectedDates = this.multipleSelectedDates.filter(\n (day) => day !== dayInfo\n );\n if (this.selectionMode !== 'multiple') {\n this.selectedDay = undefined;\n }\n } else {\n if (this.selectionMode !== 'multiple') {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n day.selected = false;\n });\n });\n\n dayInfo.selected = true;\n this.selectedDay = dayInfo;\n this.multipleSelectedDates = [dayInfo];\n\n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure time is initialized before attaching\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n\n this.onDaySelect.emit(dayInfo);\n } else {\n dayInfo.selected = true;\n\n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure time is initialized before attaching\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n\n this.onDaySelect.emit(dayInfo);\n if (!this.multipleSelectedDates.includes(dayInfo)) {\n this.multipleSelectedDates.push(dayInfo);\n }\n }\n }\n }\n\n /**\n * Handle range selection logic\n * BACKWARD COMPATIBILITY: Only called when selectionMode='range'\n *\n * Range selection lifecycle:\n * 1. First click → Sets rangeStart\n * 2. Second click → Sets rangeEnd, highlights range\n * 3. Third click → Resets range, starts new selection\n */\n private handleRangeSelection(dayInfo: DayInfo): void {\n // First click or resetting range\n if (!this.rangeStart || (this.rangeStart && this.rangeEnd)) {\n this.resetRange();\n this.rangeStart = dayInfo;\n dayInfo.selected = true;\n this.selectedDay = dayInfo;\n\n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure selectedTime is initialized\n // If time hasn't been initialized yet, initialize it now\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n\n this.onDaySelect.emit({ start: dayInfo, end: null });\n }\n // Second click - complete the range\n else if (this.rangeStart && !this.rangeEnd) {\n const startDate = this._dateUtilsService.parseDate(this.rangeStart.gD);\n const endDate = this._dateUtilsService.parseDate(dayInfo.gD);\n\n // Swap if end is before start\n if (endDate && startDate && endDate < startDate) {\n this.rangeEnd = this.rangeStart;\n this.rangeStart = dayInfo;\n } else {\n this.rangeEnd = dayInfo;\n }\n\n // Attach time if enableTime is active\n // IMPORTANT: Range end inherits time from range start (not current selectedTime)\n if (this.enableTime) {\n // Use rangeStart's time if it exists, otherwise use current selectedTime\n const timeToUse = this.rangeStart.time || { ...this.selectedTime };\n this.rangeStart.time = { ...timeToUse };\n this.rangeEnd.time = { ...timeToUse };\n }\n\n this.highlightRange();\n this.selectedDay = this.rangeEnd;\n\n this.onDaySelect.emit({ start: this.rangeStart, end: this.rangeEnd });\n }\n }\n\n /// On confirm button clicked\n onConfirmClicked() {\n // BACKWARD COMPATIBILITY: Range selection output when selectionMode='range'\n if (this.selectionMode === 'range') {\n if (this.rangeStart && this.rangeEnd) {\n // Collect all dates in range\n const rangeDates: DayInfo[] = [];\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (\n day &&\n day.gD &&\n (this.isInRange(day) ||\n this.isRangeStart(day) ||\n this.isRangeEnd(day))\n ) {\n // Attach current time if enableTime is active\n if (this.enableTime && !day.time) {\n day.time = { ...this.selectedTime };\n }\n rangeDates.push(day);\n }\n });\n });\n\n this.onSubmit.emit({\n start: this.rangeStart,\n end: this.rangeEnd,\n dates: rangeDates,\n });\n } else {\n // Incomplete range\n this.onSubmit.emit({ start: this.rangeStart, end: null, dates: [] });\n }\n return;\n }\n\n // BACKWARD COMPATIBILITY: Original behavior for multiple/single selection\n if (this.selectionMode === 'multiple') {\n // For multiple dates, attach time to each if enableTime is active\n if (this.enableTime) {\n this.multipleSelectedDates.forEach((day) => {\n if (!day.time) {\n day.time = { ...this.selectedTime };\n }\n });\n }\n this.onSubmit.emit(this.multipleSelectedDates);\n } else {\n // For single date, attach time if enableTime is active\n if (this.enableTime && this.selectedDay) {\n this.selectedDay.time = { ...this.selectedTime };\n }\n this.onSubmit.emit(this.selectedDay);\n }\n }\n\n /// Check if date from future\n checkFutureValidation(day: DayInfo) {\n if (\n this._dateUtilsService.checkPastOrFuture(day?.gD, new Date()) == 'Future'\n ) {\n return true;\n }\n }\n\n /// Check if passed day is today or not\n checkTodaysDate(day: DayInfo) {\n return (\n this.todaysDate?.gregorian == day?.gD ||\n this.todaysDate?.ummAlQura == day?.uD\n );\n }\n\n /**\n * Check if a day is disabled based on min/max date constraints\n * Works for both Gregorian and Hijri modes\n */\n isDateDisabled(day: DayInfo): boolean {\n if (!day || !day.gD) return true;\n\n // Normalize min/max dates to Gregorian DD/MM/YYYY format\n const minDateStr = this.minDate\n ? this._dateUtilsService.normalizeDateToString(this.minDate)\n : null;\n const maxDateStr = this.maxDate\n ? this._dateUtilsService.normalizeDateToString(this.maxDate)\n : null;\n\n // Check if the day's Gregorian date is within range\n return !this._dateUtilsService.isDateInRange(\n day.gD,\n minDateStr,\n maxDateStr\n );\n }\n\n /**\n * Initialize time from current system time or initialDate\n * BACKWARD COMPATIBILITY: Only called when enableTime=true\n *\n * Priority:\n * 1. If initialDate has time, use that\n * 2. If selectedDay has time, use that\n * 3. Otherwise, use current system time\n */\n initializeTime(): void {\n let timeSet = false;\n\n // Check if initialDate has time information\n if (this.initialDate && this.initialDate instanceof Date) {\n this.selectedTime = {\n hour: this.initialDate.getHours(),\n minute: this.initialDate.getMinutes(),\n };\n timeSet = true;\n }\n\n // If no time from initialDate, use current system time\n if (!timeSet) {\n const now = new Date();\n this.selectedTime = {\n hour: now.getHours(),\n minute: now.getMinutes(),\n };\n }\n\n // Mark that time has been initialized\n this.timeInitialized = true;\n\n // BACKWARD COMPATIBILITY: Only set meridian when useMeridian=true\n if (this.useMeridian) {\n this.meridian = this.selectedTime.hour >= 12 ? 'PM' : 'AM';\n }\n }\n\n /**\n * Increment hour value with wraparound (0-23)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n incrementHour(): void {\n this.selectedTime.hour = (this.selectedTime.hour + 1) % 24;\n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement hour value with wraparound (0-23)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n decrementHour(): void {\n this.selectedTime.hour = (this.selectedTime.hour - 1 + 24) % 24;\n this.updateSelectedDayTime();\n }\n\n /**\n * Increment minute value with wraparound (0-59)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n incrementMinute(): void {\n this.selectedTime.minute = (this.selectedTime.minute + 1) % 60;\n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement minute value with wraparound (0-59)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n decrementMinute(): void {\n this.selectedTime.minute = (this.selectedTime.minute - 1 + 60) % 60;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard input for hours\n * Validates and clamps to 0-23 range\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onHourInputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n\n if (isNaN(value) || value < 0) {\n value = 0;\n } else if (value > 23) {\n value = 23;\n }\n\n this.selectedTime.hour = value;\n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard input for minutes\n * Validates and clamps to 0-59 range\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onMinuteInputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n\n if (isNaN(value) || value < 0) {\n value = 0;\n } else if (value > 59) {\n value = 59;\n }\n\n this.selectedTime.minute = value;\n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard arrow keys for hour/minute input\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onTimeKeydown(event: KeyboardEvent, type: 'hour' | 'minute'): void {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (type === 'hour') {\n this.incrementHour();\n } else {\n this.incrementMinute();\n }\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (type === 'hour') {\n this.decrementHour();\n } else {\n this.decrementMinute();\n }\n }\n }\n\n /**\n * Update the selected day's time property when time changes\n * BACKWARD COMPATIBILITY: Only called when enableTime=true\n */\n private updateSelectedDayTime(): void {\n if (this.selectedDay) {\n this.selectedDay.time = { ...this.selectedTime };\n // Emit the updated day info so datetime-input can capture time-only changes\n this.onDaySelect.emit(this.selectedDay);\n }\n // Handle range mode time updates\n if (this.selectionMode === 'range') {\n if (this.rangeStart) {\n this.rangeStart.time = { ...this.selectedTime };\n }\n if (this.rangeEnd) {\n this.rangeEnd.time = { ...this.selectedTime };\n }\n // Emit the updated range\n if (this.rangeStart && this.rangeEnd) {\n this.onDaySelect.emit({ start: this.rangeStart, end: this.rangeEnd });\n } else if (this.rangeStart) {\n this.onDaySelect.emit({ start: this.rangeStart, end: null });\n }\n }\n }\n\n /**\n * Get display hour for 12-hour format\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n *\n * Conversion:\n * - 0 (midnight) → 12 AM\n * - 1-11 (AM) → 1-11 AM\n * - 12 (noon) → 12 PM\n * - 13-23 (PM) → 1-11 PM\n *\n * IMPORTANT: Hour 0 is NEVER displayed as 0, always as 12\n */\n getDisplayHour(): number {\n if (!this.useMeridian) {\n return this.selectedTime.hour;\n }\n\n const hour = this.selectedTime.hour;\n\n // Midnight (0) → 12\n if (hour === 0) {\n return 12;\n }\n // 1-12 → 1-12 (no change)\n else if (hour <= 12) {\n return hour;\n }\n // 13-23 → 1-11 (subtract 12)\n else {\n return hour - 12;\n }\n }\n\n /**\n * Toggle AM/PM meridian\n * BACKWARD COMPATIBILITY: Only available when useMeridian=true\n *\n * When toggling:\n * - Adds or subtracts 12 hours\n * - Maintains internal 24-hour format\n */\n toggleMeridian(): void {\n if (this.meridian === 'AM') {\n this.meridian = 'PM';\n // Add 12 hours if not already in PM range\n if (this.selectedTime.hour < 12) {\n this.selectedTime.hour += 12;\n }\n } else {\n this.meridian = 'AM';\n // Subtract 12 hours if in PM range\n if (this.selectedTime.hour >= 12) {\n this.selectedTime.hour -= 12;\n }\n }\n this.updateSelectedDayTime();\n }\n\n /**\n * Increment hour in 12-hour mode\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n */\n incrementHour12(): void {\n let displayHour = this.getDisplayHour();\n displayHour = (displayHour % 12) + 1; // 1-12 cycle\n\n // Convert back to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = displayHour === 12 ? 0 : displayHour;\n } else {\n this.selectedTime.hour = displayHour === 12 ? 12 : displayHour + 12;\n }\n\n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement hour in 12-hour mode\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n */\n decrementHour12(): void {\n let displayHour = this.getDisplayHour();\n displayHour = displayHour === 1 ? 12 : displayHour - 1; // 1-12 cycle\n\n // Convert back to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = displayHour === 12 ? 0 : displayHour;\n } else {\n this.selectedTime.hour = displayHour === 12 ? 12 : displayHour + 12;\n }\n\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle 12-hour input change\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n *\n * IMPORTANT: Input must be 1-12, never 0\n * - User types 0 → converted to 12\n * - User types > 12 → clamped to 12\n */\n onHour12InputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n\n // Validate 1-12 range (0 is not allowed in 12-hour format)\n if (isNaN(value) || value < 1 || value === 0) {\n value = 12; // Default to 12 if invalid or 0\n } else if (value > 12) {\n value = 12;\n }\n\n // Convert to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = value === 12 ? 0 : value;\n } else {\n this.selectedTime.hour = value === 12 ? 12 : value + 12;\n }\n\n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Check if a date is within the current range\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isInRange(day: DayInfo): boolean {\n if (\n this.selectionMode !== 'range' ||\n !this.rangeStart ||\n !this.rangeEnd ||\n !day?.gD\n ) {\n return false;\n }\n\n const dayDate = this._dateUtilsService.parseDate(day.gD);\n const startDate = this._dateUtilsService.parseDate(this.rangeStart.gD);\n const endDate = this._dateUtilsService.parseDate(this.rangeEnd.gD);\n\n if (!dayDate || !startDate || !endDate) {\n return false;\n }\n\n return dayDate >= startDate && dayDate <= endDate;\n }\n\n /**\n * Check if a date is the range start\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isRangeStart(day: DayInfo): boolean {\n return this.selectionMode === 'range' && this.rangeStart?.gD === day?.gD;\n }\n\n /**\n * Check if a date is the range end\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isRangeEnd(day: DayInfo): boolean {\n return this.selectionMode === 'range' && this.rangeEnd?.gD === day?.gD;\n }\n\n /**\n * Reset range selection\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n private resetRange(): void {\n if (this.selectionMode !== 'range') {\n return;\n }\n\n // Clear range highlighting\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD) {\n day.selected = false;\n }\n });\n });\n\n this.rangeStart = undefined;\n this.rangeEnd = undefined;\n this.selectedDay = undefined;\n }\n\n /**\n * Highlight all dates in range\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n private highlightRange(): void {\n if (this.selectionMode !== 'range' || !this.rangeStart || !this.rangeEnd) {\n return;\n }\n\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD) {\n day.selected =\n this.isInRange(day) ||\n this.isRangeStart(day) ||\n this.isRangeEnd(day);\n }\n });\n });\n }\n\n /**\n * Format a date string according to the dateDisplayFormat\n * @param dateStr - Date string in DD/MM/YYYY format\n * @returns Formatted date string\n */\n formatDisplayDate(dateStr: string): string {\n if (!dateStr) return '';\n return this._dateUtilsService.formatDateString(dateStr, this.dateDisplayFormat);\n }\n}\n","<div class=\"calendar-container\" [dir]=\"dir\" [attr.lang]=\"locale\">\n <div\n class=\"toggle-section\"\n [dir]=\"dir\"\n *ngIf=\"canChangeMode\"\n [ngStyle]=\"{ color: styles.primaryColor }\"\n >\n <span> {{ ummAlQuraDateText }} </span>\n <label class=\"switch\">\n <input\n type=\"checkbox\"\n [disabled]=\"!canChangeMode\"\n [checked]=\"mode === 'ummAlQura'\"\n (change)=\"changeCalendarMode()\"\n #calendarCheckbox\n />\n <span\n class=\"slider\"\n [ngStyle]=\"\n calendarCheckbox.checked\n ? { 'background-color': styles.primaryColor }\n : { 'background-color': styles.secondaryColor }\n \"\n ></span>\n </label>\n </div>\n\n <div\n class=\"todays-date-section\"\n *ngIf=\"todaysDateSection\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n color: styles.primaryColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <div class=\"text-info\">\n <p>{{ todaysDateText }}</p>\n </div>\n\n <div\n class=\"data\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n 'background-color': styles.todaysDateBgColor,\n color: styles.todaysDateTextColor\n }\"\n >\n <p *ngIf=\"mode == 'ummAlQura'\">\n {{ formatDisplayDate(todaysDate.ummAlQura) }}\n </p>\n <p *ngIf=\"mode == 'greg'\">\n {{ formatDisplayDate(todaysDate.gregorian) }}\n </p>\n </div>\n </div>\n\n <div class=\"period-container\">\n <form [formGroup]=\"periodForm\" class=\"period-form\">\n <div\n class=\"select-item\"\n [ngClass]=\"{\n order: dir == 'ltr'\n }\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <label *ngIf=\"!periodForm.controls['year'].value\">{{\n yearSelectLabel\n }}</label>\n\n <select\n formControlName=\"year\"\n class=\"{{ 'icon-' + dir }}\"\n placeholder=\"السنة\"\n (change)=\"onPeriodChange('year')\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n color: styles.primaryColor,\n 'font-family': styles.fontFamily\n }\"\n >\n <option *ngFor=\"let year of years\" [ngValue]=\"year\">\n {{ year }}\n </option>\n </select>\n </div>\n\n <div\n class=\"select-item\"\n [ngClass]=\"{\n order: dir == 'rtl'\n }\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <label *ngIf=\"!periodForm.controls['month'].value\">{{\n monthSelectLabel\n }}</label>\n <select\n class=\"{{ 'icon-' + dir }}\"\n formControlName=\"month\"\n (change)=\"onPeriodChange('month')\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n color: styles.primaryColor,\n 'font-family': styles.fontFamily\n }\"\n >\n <option *ngFor=\"let month of months\" [ngValue]=\"month.value\">\n {{ locale == \"ar\" ? month?.labelAr : month?.labelEn }}\n </option>\n </select>\n </div>\n </form>\n </div>\n\n <div\n class=\"calendar-layout\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <div class=\"week-days\">\n <div\n class=\"week-day\"\n [ngStyle]=\"{ color: styles.dayNameColor }\"\n *ngFor=\"let date of locale == 'ar' ? weekdaysAr : weekdaysEn\"\n >\n {{ date }}\n </div>\n </div>\n\n <div [dir]=\"dir\">\n <div class=\"week\" *ngFor=\"let week of weeks\">\n <div\n class=\"day\"\n *ngFor=\"let day of week\"\n (click)=\"disableDayPicker == false ? onDayClicked(day) : ''\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n color: styles.dayColor\n }\"\n >\n <div\n id=\"greg-day\"\n [ngClass]=\"{\n 'todays-date': checkTodaysDate(day),\n 'selected-date': day?.selected == true,\n 'disabled-day':\n isDateDisabled(day) ||\n (checkFutureValidation(day) && futureValidation),\n 'range-start': isRangeStart(day),\n 'range-end': isRangeEnd(day),\n 'in-range': isInRange(day)\n }\"\n [ngStyle]=\"{\n border:\n markToday && checkTodaysDate(day)\n ? '1px solid ' + styles.primaryColor\n : '',\n 'background-color':\n day?.selected == true || isRangeStart(day) || isRangeEnd(day)\n ? styles.primaryColor\n : isInRange(day)\n ? styles.primaryColor + '33'\n : '',\n color:\n (day?.selected == true ||\n isRangeStart(day) ||\n isRangeEnd(day) ||\n isInRange(day)\n ? styles.todaysDateTextColor\n : '') ||\n (checkFutureValidation(day) && futureValidation\n ? styles.disabledDayColor\n : '') ||\n (isDateDisabled(day) ? styles.disabledDayColor : ''),\n opacity: isDateDisabled(day) ? '0.4' : '1',\n cursor: isDateDisabled(day) ? 'not-allowed' : 'pointer'\n }\"\n >\n <span *ngIf=\"mode == 'greg'\">{{ day?.gD?.split(\"/\")[0] | number }}</span>\n\n <span id=\"ummAlQura-day\" *ngIf=\"mode == 'ummAlQura'\">{{ day?.uD?.split(\"/\")[0] | number }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"future-validation\" dir=\"auto\" *ngIf=\"futureValidationMessage\">\n <span *ngIf=\"locale == 'ar'\">\n {{ futureValidationMessageAr }}\n </span>\n <span *ngIf=\"locale == 'en'\">\n {{ futureValidationMessageEn }}\n </span>\n </div>\n\n <!-- Time Picker Section -->\n <!-- BACKWARD COMPATIBILITY: This section only renders when enableTime=true -->\n <div class=\"time-picker-section\" *ngIf=\"enableTime\" [dir]=\"'ltr'\">\n <div class=\"time-picker-wrapper\">\n <!-- Hour Input with Arrows -->\n <div class=\"time-input-container\">\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-up\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerArrowColor || '#5b479c'\n }\"\n (click)=\"useMeridian ? incrementHour12() : incrementHour()\"\n tabindex=\"-1\"\n aria-label=\"Increment hour\"\n >\n <i class=\"ri-arrow-drop-up-line\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-field\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerTextColor || '#333'\n }\"\n [value]=\"getDisplayHour().toString().padStart(2, '0')\"\n (input)=\"\n useMeridian\n ? onHour12InputChange($event)\n : onHourInputChange($event)\n \"\n (keydown)=\"onTimeKeydown($event, 'hour')\"\n [min]=\"useMeridian ? 1 : 0\"\n [max]=\"useMeridian ? 12 : 23\"\n aria-label=\"Hour\"\n />\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-down\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerArrowColor || '#5b479c'\n }\"\n (click)=\"useMeridian ? decrementHour12() : decrementHour()\"\n tabindex=\"-1\"\n aria-label=\"Decrement hour\"\n >\n <i class=\"ri-arrow-drop-down-line\"></i>\n </button>\n </div>\n\n <!-- Colon Separator -->\n <span\n class=\"time-colon\"\n [ngStyle]=\"{\n color: styles.timePickerColonColor || '#5b479c'\n }\"\n >:</span\n >\n\n <!-- Minute Input with Arrows -->\n <div class=\"time-input-container\">\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-up\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerArrowColor || '#5b479c'\n }\"\n (click)=\"incrementMinute()\"\n tabindex=\"-1\"\n aria-label=\"Increment minute\"\n >\n <i class=\"ri-arrow-drop-up-line\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-field\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerTextColor || '#333'\n }\"\n [value]=\"selectedTime.minute.toString().padStart(2, '0')\"\n (input)=\"onMinuteInputChange($event)\"\n (keydown)=\"onTimeKeydown($event, 'minute')\"\n min=\"0\"\n max=\"59\"\n aria-label=\"Minute\"\n />\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-down\"\n [ngStyle]=\"{\n 'background-color': styles.timePickerBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.timePickerArrowColor || '#5b479c'\n }\"\n (click)=\"decrementMinute()\"\n tabindex=\"-1\"\n aria-label=\"Decrement minute\"\n >\n <i class=\"ri-arrow-drop-down-line\"></i>\n </button>\n </div>\n\n <!-- AM/PM Button Group (only when useMeridian=true) -->\n <!-- BACKWARD COMPATIBILITY: This only renders when useMeridian=true -->\n <div class=\"meridian-toggle-group\" *ngIf=\"useMeridian\">\n <button\n type=\"button\"\n class=\"meridian-btn\"\n [class.active]=\"meridian === 'AM'\"\n [ngStyle]=\"\n meridian === 'AM'\n ? {\n 'background-color':\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\n 'border-color':\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\n color: styles.meridianActiveTextColor || '#ffffff'\n }\n : {\n 'background-color': styles.meridianBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.meridianTextColor || '#666'\n }\n \"\n (click)=\"meridian !== 'AM' && toggleMeridian()\"\n [attr.aria-label]=\"'Select ' + amLabel\"\n >\n {{ amLabel }}\n </button>\n <button\n type=\"button\"\n class=\"meridian-btn\"\n [class.active]=\"meridian === 'PM'\"\n [ngStyle]=\"\n meridian === 'PM'\n ? {\n 'background-color':\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\n 'border-color':\n styles.meridianActiveBgColor || 'rgb(0, 77, 97)',\n color: styles.meridianActiveTextColor || '#ffffff'\n }\n : {\n 'background-color': styles.meridianBgColor || '#ffffff',\n 'border-color': styles.timePickerBorderColor || '#ddd',\n color: styles.meridianTextColor || '#666'\n }\n \"\n (click)=\"meridian !== 'PM' && toggleMeridian()\"\n [attr.aria-label]=\"'Select ' + pmLabel\"\n >\n {{ pmLabel }}\n </button>\n </div>\n </div>\n </div>\n\n <div>\n <button\n type=\"button\"\n class=\"confirm-btn\"\n [disabled]=\"\n isRequired &&\n ((!selectedDay && selectionMode !== 'multiple') ||\n (!multipleSelectedDates.length && selectionMode === 'multiple'))\n \"\n (click)=\"onConfirmClicked()\"\n *ngIf=\"showConfirmButton\"\n [ngStyle]=\"{\n 'background-color': styles.secondaryColor,\n color: styles.confirmBtnTextColor,\n 'font-family': styles.fontFamily,\n 'border-radius': styles.borderRadius\n }\"\n >\n {{ submitTextButton }}\n </button>\n </div>\n</div>\n","/**\n * DateTime Input Component\n *\n * A reusable input field with dropdown calendar picker.\n * This component wraps the existing hijri-gregorian-datepicker component\n * and provides form integration via ControlValueAccessor.\n *\n * Features:\n * - Input field that opens dropdown on click\n * - Integrates with Reactive and Template-driven forms\n * - Configurable date/time formats\n * - Min/Max date constraints\n * - Confirm/Cancel actions\n * - Click-outside to close\n * - Accessibility support (keyboard)\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n ViewChild,\n ElementRef,\n HostListener,\n OnInit,\n OnDestroy,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DayInfo } from '../_interfaces/calendar-model';\nimport { stylesConfig } from '../_interfaces/styles-config.model';\nimport { HijriGregorianDatepickerComponent } from './hijri-gregorian-datepicker.component';\nimport { DateUtilitiesService } from '../_services/date-utilities.service';\n\n@Component({\n standalone: false,\n selector: 'hijri-gregorian-datetime-input',\n templateUrl: './hijri-gregorian-datetime-input.component.html',\n styleUrls: ['./hijri-gregorian-datetime-input.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => HijriGregorianDatetimeInputComponent),\n multi: true,\n },\n ],\n})\nexport class HijriGregorianDatetimeInputComponent\n implements ControlValueAccessor, OnInit, OnDestroy\n{\n // Local storage key for persisting calendar mode\n private readonly STORAGE_KEY = 'hg_datepicker_mode';\n // ============================================================\n // CONFIGURATION INPUTS\n // ============================================================\n\n /** Placeholder text for input field */\n @Input() placeholder: string = 'Select date and time';\n\n /** Date format for display (e.g., 'DD/MM/YYYY') */\n @Input() dateFormat: string = 'DD/MM/YYYY';\n\n /** Time format for display (e.g., 'HH:mm' or 'hh:mm A') */\n @Input() timeFormat: string = 'HH:mm';\n\n /** Enable/disable the input */\n @Input() disabled: boolean = false;\n\n /** Enable time picker in the calendar */\n @Input() enableTime: boolean = false;\n\n /** Minimum allowed date (Date object or DD/MM/YYYY string) */\n @Input() minDate?: Date | string;\n\n /** Maximum allowed date (Date object or DD/MM/YYYY string) */\n @Input() maxDate?: Date | string;\n\n /** Initial date to display when opening calendar */\n @Input() initialDate?: Date | string;\n\n /** Calendar mode: 'greg' (Gregorian) or 'ummAlQura' (Hijri) */\n @Input() mode: string = 'greg';\n\n /** Internal mode that persists between open/close */\n currentMode: string = 'greg';\n\n /** Locale: 'en' or 'ar' */\n @Input() locale: string = 'en';\n\n /** Layout direction: 'ltr' or 'rtl' */\n @Input() dir: string = 'ltr';\n\n /** Show confirm button in calendar */\n @Input() showConfirmButton: boolean = true;\n\n /** Confirm button text */\n @Input() submitTextButton: string = 'Confirm';\n\n /** Theme name for calendar styling */\n @Input() theme?: string = '';\n\n /** Allow future dates */\n @Input() futureValidation: boolean = true;\n\n /** Mark today's date */\n @Input() markToday: boolean = true;\n\n /** Show today's date section */\n @Input() todaysDateSection: boolean = true;\n\n /** Enable 12-hour format with AM/PM */\n @Input() useMeridian: boolean = false;\n\n /** Selection mode: 'single', 'multiple', or 'range' */\n @Input() selectionMode: 'single' | 'multiple' | 'range' = 'single';\n\n /** Custom CSS class for input field */\n @Input() inputClass: string = '';\n\n /** Custom CSS class for dropdown panel */\n @Input() dropdownClass: string = '';\n\n /** Custom styles configuration for calendar */\n @Input() styles?: stylesConfig = {};\n\n /** Text label for today's date section */\n @Input() todaysDateText: string = \"Today's Date\";\n\n /** Text label for Hijri date section */\n @Input() ummAlQuraDateText: string = 'Hijri Date';\n\n /** Label for AM in 12-hour format */\n @Input() amLabel: string = 'AM';\n\n /** Label for PM in 12-hour format */\n @Input() pmLabel: string = 'PM';\n\n /** Allow user to toggle between calendar modes (Gregorian/Hijri) */\n @Input() canChangeMode: boolean = true;\n\n /** Disable year picker dropdown */\n @Input() disableYearPicker: boolean = false;\n\n /** Disable month picker dropdown */\n @Input() disableMonthPicker: boolean = false;\n\n /** Disable day selection in calendar */\n @Input() disableDayPicker: boolean = false;\n\n /** Show future validation message when selecting future dates */\n @Input() futureValidationMessage: boolean = false;\n\n /** Label for year select dropdown */\n @Input() yearSelectLabel: string = 'Year';\n\n /** Label for month select dropdown */\n @Input() monthSelectLabel: string = 'Month';\n\n /** English future validation message */\n @Input() futureValidationMessageEn: string =\n 'Selected date cannot be in the future!';\n\n /** Arabic future validation message */\n @Input() futureValidationMessageAr: string =\n 'التاريخ المحدد لا يمكن ان يكون في المستقبل!';\n\n /** Number of past years to show in year picker */\n @Input() pastYearsLimit: number = 90;\n\n /** Number of future years to show in year picker */\n @Input() futureYearsLimit: number = 0;\n\n /** Initial start date for range selection mode */\n @Input() initialRangeStart?: Date | string;\n\n /** Initial end date for range selection mode */\n @Input() initialRangeEnd?: Date | string;\n\n // ============================================================\n // OUTPUTS\n // ============================================================\n\n /** Emitted when date is selected and confirmed */\n @Output() dateSelected = new EventEmitter<DayInfo | DayInfo[]>();\n\n /** Emitted when dropdown opens */\n @Output() dropdownOpened = new EventEmitter<void>();\n\n /** Emitted when dropdown closes */\n @Output() dropdownClosed = new EventEmitter<void>();\n\n // ============================================================\n // INTERNAL STATE\n // ============================================================\n\n /** Whether dropdown is currently open */\n isDropdownOpen: boolean = false;\n\n /** Current displayed value in input field */\n displayValue: string = '';\n\n /** Current selected date/time value */\n currentValue: DayInfo | DayInfo[] | null = null;\n\n /** Reference to the input element */\n @ViewChild('inputElement', { static: false })\n inputElement!: ElementRef<HTMLInputElement>;\n\n /** Reference to the dropdown container */\n @ViewChild('dropdownContainer', { static: false })\n dropdownContainer!: ElementRef<HTMLDivElement>;\n\n /** Reference to the calendar component */\n @ViewChild(HijriGregorianDatepickerComponent, { static: false })\n calendarComponent?: HijriGregorianDatepickerComponent;\n\n // ControlValueAccessor callbacks\n private onChange: (value: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n // ============================================================\n // CONSTRUCTOR\n // ============================================================\n\n constructor(private dateUtilitiesService: DateUtilitiesService) {}\n\n // ============================================================\n // LIFECYCLE HOOKS\n // ============================================================\n\n ngOnInit(): void {\n // Initialize current mode from input\n // Prefer persisted mode if available, otherwise use input\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n this.currentMode = stored ? stored : this.mode;\n } catch (e) {\n this.currentMode = this.mode;\n }\n\n // Initialize with initialDate if provided\n if (this.initialDate) {\n this.initializeWithDate(this.initialDate);\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n // ============================================================\n // CONTROL VALUE ACCESSOR IMPLEMENTATION\n // ============================================================\n\n /**\n * Write a new value to the element (from form control)\n */\n writeValue(value: any): void {\n if (value) {\n this.currentValue = value;\n this.updateDisplayValue(value);\n } else {\n this.currentValue = null;\n this.displayValue = '';\n }\n }\n\n /**\n * Register callback for value changes\n */\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n /**\n * Register callback for touch events\n */\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n /**\n * Set the disabled state\n */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // ============================================================\n // DROPDOWN MANAGEMENT\n // ============================================================\n\n /**\n * Toggle dropdown open/close\n */\n toggleDropdown(): void {\n if (this.disabled) return;\n\n if (this.isDropdownOpen) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n /**\n * Open the dropdown panel\n */\n openDropdown(): void {\n if (this.disabled) return;\n\n this.isDropdownOpen = true;\n this.onTouched();\n this.dropdownOpened.emit();\n }\n\n /**\n * Close the dropdown panel\n */\n closeDropdown(): void {\n // Save the current mode from the calendar before closing\n if (this.calendarComponent) {\n this.currentMode = this.calendarComponent.mode;\n try {\n localStorage.setItem(this.STORAGE_KEY, this.currentMode);\n } catch (e) {\n // ignore storage errors\n }\n }\n this.isDropdownOpen = false;\n this.dropdownClosed.emit();\n }\n\n /**\n * Handle click outside to close dropdown\n */\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.isDropdownOpen) return;\n\n const target = event.target as HTMLElement;\n const clickedInside =\n this.inputElement?.nativeElement.contains(target) ||\n this.dropdownContainer?.nativeElement.contains(target);\n\n if (!clickedInside) {\n this.closeDropdown();\n }\n }\n\n /**\n * Handle Escape key to close dropdown\n */\n @HostListener('document:keydown.escape', ['$event'])\n onEscapeKey(event: Event): void {\n if (this.isDropdownOpen) {\n event.preventDefault();\n this.closeDropdown();\n }\n }\n\n /**\n * Handle Enter key to open dropdown when input is focused\n */\n onInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !this.isDropdownOpen) {\n event.preventDefault();\n this.openDropdown();\n }\n }\n\n // ============================================================\n // CALENDAR EVENT HANDLERS\n // ============================================================\n\n /**\n * Handle date selection from calendar (Confirm button or day click)\n */\n onCalendarSubmit(event: DayInfo | DayInfo[]): void {\n // Update currentMode from calendar before formatting\n if (this.calendarComponent) {\n this.currentMode = this.calendarComponent.mode;\n try {\n localStorage.setItem(this.STORAGE_KEY, this.currentMode);\n } catch (e) {}\n }\n this.currentValue = event;\n this.updateDisplayValue(event);\n this.onChange(event);\n this.dateSelected.emit(event);\n this.closeDropdown();\n }\n\n /**\n * Handle day selection from calendar\n * In range mode, only close when both dates are selected\n * When time picker is enabled, emit value but keep dropdown open\n */\n onDaySelect(event: DayInfo | DayInfo[] | any): void {\n // Update currentMode from calendar before formatting\n if (this.calendarComponent) {\n this.currentMode = this.calendarComponent.mode;\n try {\n localStorage.setItem(this.STORAGE_KEY, this.currentMode);\n } catch (e) {}\n }\n // Update current value\n this.currentValue = event;\n this.updateDisplayValue(event);\n\n // Always emit the change immediately\n this.onChange(event);\n this.dateSelected.emit(event);\n\n // If time picker is enabled, keep dropdown open for time adjustments\n // User can click outside to close\n if (this.enableTime) {\n // Don't close - let user adjust time or click outside\n return;\n }\n\n // In single selection mode (without time), close immediately\n if (this.selectionMode === 'single') {\n this.closeDropdown();\n return;\n }\n\n // In range selection mode, check if both dates are selected\n if (this.selectionMode === 'range') {\n // Check if event has both start and end (range complete)\n const isRangeComplete =\n event &&\n ((Array.isArray(event) && event.length === 2) ||\n (event.start && event.end));\n\n if (isRangeComplete) {\n // Range is complete, close dropdown\n this.closeDropdown();\n }\n // Otherwise, keep dropdown open for second date selection\n }\n }\n\n /**\n * Handle cancel action\n */\n onCancelClicked(): void {\n this.closeDropdown();\n }\n\n // ============================================================\n // HELPER METHODS\n // ============================================================\n\n /**\n * Initialize component with a date value\n */\n private initializeWithDate(date: Date | string): void {\n // Convert date to DayInfo format if needed\n // This is simplified - in production you'd use DateUtilitiesService\n if (date instanceof Date) {\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear();\n const formattedDate = `${day}/${month}/${year}`;\n\n const dayInfo: DayInfo = {\n gD: formattedDate,\n uD: '', // Would need conversion\n dN: '',\n uC: 0,\n selected: true,\n };\n\n if (this.enableTime) {\n dayInfo.time = {\n hour: date.getHours(),\n minute: date.getMinutes(),\n };\n }\n\n this.currentValue = dayInfo;\n this.updateDisplayValue(dayInfo);\n }\n }\n\n /**\n * Update the display value in the input field\n */\n private updateDisplayValue(value: DayInfo | DayInfo[] | any): void {\n if (!value) {\n this.displayValue = '';\n return;\n }\n\n // Handle range selection with start/end properties\n if (value.start) {\n const start = this.formatDayInfo(value.start);\n if (value.end) {\n const end = this.formatDayInfo(value.end);\n this.displayValue = `${start} - ${end}`;\n } else {\n // Only start date selected so far\n this.displayValue = `${start} - ...`;\n }\n return;\n }\n\n if (Array.isArray(value)) {\n // Range selection mode with array\n if (value.length === 2) {\n const start = this.formatDayInfo(value[0]);\n const end = this.formatDayInfo(value[1]);\n this.displayValue = `${start} - ${end}`;\n } else if (value.length === 1) {\n this.displayValue = `${this.formatDayInfo(value[0])} - ...`;\n } else {\n this.displayValue = '';\n }\n } else {\n // Single selection mode\n this.displayValue = this.formatDayInfo(value);\n }\n }\n\n /**\n * Format DayInfo object to display string\n */\n private formatDayInfo(dayInfo: DayInfo): string {\n let result = '';\n\n // Use currentMode instead of mode to respect the active calendar mode\n if (this.currentMode === 'greg') {\n // Use the dateFormat property to format the display\n result = this.dateUtilitiesService.formatDateString(\n dayInfo.gD,\n this.dateFormat\n );\n } else {\n // For Hijri dates, also apply the format\n result = this.dateUtilitiesService.formatDateString(\n dayInfo.uD,\n this.dateFormat\n );\n }\n\n // Append time if available\n if (dayInfo.time && this.enableTime) {\n const hour = dayInfo.time.hour;\n const minute = dayInfo.time.minute.toString().padStart(2, '0');\n\n if (this.useMeridian) {\n // 12-hour format\n const period = hour >= 12 ? this.pmLabel : this.amLabel;\n const displayHour = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n result += ` ${displayHour}:${minute} ${period}`;\n } else {\n // 24-hour format\n result += ` ${hour.toString().padStart(2, '0')}:${minute}`;\n }\n }\n\n return result;\n }\n\n /**\n * Clear the current value\n */\n clearValue(): void {\n this.currentValue = null;\n this.displayValue = '';\n this.onChange(null);\n this.dateSelected.emit(null as any);\n }\n\n /**\n * Get current value (useful for programmatic access)\n */\n getValue(): DayInfo | DayInfo[] | null {\n return this.currentValue;\n }\n\n /**\n * Get the initial date for the calendar picker\n * Handles conversion of currentValue to format accepted by calendar\n */\n getInitialDateForCalendar(): Date | string | undefined {\n if (this.initialDate) {\n return this.initialDate;\n }\n\n // If currentValue is a single DayInfo, create a Date object with time\n if (\n this.currentValue &&\n !Array.isArray(this.currentValue) &&\n !(this.currentValue as any).start\n ) {\n if (this.enableTime && this.currentValue.time) {\n return this.createDateFromDayInfo(this.currentValue);\n }\n return this.currentValue.gD;\n }\n\n return undefined;\n }\n\n /**\n * Get the initial range start for the calendar picker\n * Used to restore range selection when reopening calendar\n */\n getInitialRangeStart(): Date | string | undefined {\n if (!this.currentValue || this.selectionMode !== 'range') {\n return undefined;\n }\n\n // Handle range object with start property\n if ((this.currentValue as any).start) {\n const start = (this.currentValue as any).start;\n if (this.enableTime && start.time) {\n return this.createDateFromDayInfo(start);\n }\n return start.gD;\n }\n\n // Handle array format\n if (Array.isArray(this.currentValue) && this.currentValue.length > 0) {\n const start = this.currentValue[0];\n if (this.enableTime && start.time) {\n return this.createDateFromDayInfo(start);\n }\n return start.gD;\n }\n\n return undefined;\n }\n\n /**\n * Get the initial range end for the calendar picker\n * Used to restore range selection when reopening calendar\n */\n getInitialRangeEnd(): Date | string | undefined {\n if (!this.currentValue || this.selectionMode !== 'range') {\n return undefined;\n }\n\n // Handle range object with end property\n if ((this.currentValue as any).start && (this.currentValue as any).end) {\n const end = (this.currentValue as any).end;\n if (this.enableTime && end.time) {\n return this.createDateFromDayInfo(end);\n }\n return end.gD;\n }\n\n // Handle array format\n if (Array.isArray(this.currentValue) && this.currentValue.length === 2) {\n const end = this.currentValue[1];\n if (this.enableTime && end.time) {\n return this.createDateFromDayInfo(end);\n }\n return end.gD;\n }\n\n return undefined;\n }\n\n /**\n * Create a Date object from DayInfo with time information\n */\n private createDateFromDayInfo(dayInfo: DayInfo): Date {\n // Use service to parse date string\n const date = new Date();\n const parts = dayInfo.gD.split('/');\n const day = parseInt(parts[0], 10);\n const month = parseInt(parts[1], 10) - 1;\n const year = parseInt(parts[2], 10);\n\n date.setFullYear(year, month, day);\n\n // Set time if available\n if (dayInfo.time) {\n date.setHours(dayInfo.time.hour, dayInfo.time.minute, 0, 0);\n } else {\n date.setHours(0, 0, 0, 0);\n }\n\n return date;\n }\n}\n","<!--\r\n DateTime Input Component Template\r\n \r\n Structure:\r\n 1. Input field (click to open dropdown)\r\n 2. Dropdown container (positioned absolutely)\r\n 3. Calendar component (reuses existing hijri-gregorian-datepicker)\r\n 4. Action buttons (Confirm/Cancel)\r\n-->\r\n\r\n<div class=\"datetime-input-wrapper\" [attr.dir]=\"dir\">\r\n <!-- INPUT FIELD -->\r\n <div class=\"input-container\">\r\n <input\r\n #inputElement\r\n type=\"text\"\r\n class=\"datetime-input\"\r\n [class]=\"'datetime-input ' + inputClass\"\r\n [class.rtl-input]=\"dir === 'rtl'\"\r\n [value]=\"displayValue\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled\"\r\n (click)=\"toggleDropdown()\"\r\n (keydown)=\"onInputKeydown($event)\"\r\n readonly\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n [attr.aria-haspopup]=\"true\"\r\n [attr.aria-label]=\"placeholder\"\r\n />\r\n\r\n <!-- Calendar Icon -->\r\n <span\r\n class=\"input-icon\"\r\n [class.rtl-icon]=\"dir === 'rtl'\"\r\n (click)=\"!disabled && toggleDropdown()\"\r\n [class.disabled]=\"disabled\"\r\n >\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line>\r\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n </svg>\r\n </span>\r\n\r\n <!-- Clear Button (only if value exists) -->\r\n <button\r\n *ngIf=\"displayValue && !disabled\"\r\n type=\"button\"\r\n class=\"clear-button\"\r\n [class.rtl-clear]=\"dir === 'rtl'\"\r\n (click)=\"clearValue(); $event.stopPropagation()\"\r\n aria-label=\"Clear value\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- DROPDOWN PANEL -->\r\n <div\r\n #dropdownContainer\r\n class=\"dropdown-panel\"\r\n [class]=\"'dropdown-panel ' + dropdownClass\"\r\n [class.open]=\"isDropdownOpen\"\r\n [class.closed]=\"!isDropdownOpen\"\r\n *ngIf=\"isDropdownOpen\"\r\n >\r\n <!-- Calendar Component (reuses existing component) -->\r\n <div class=\"calendar-wrapper\">\r\n <hijri-gregorian-datepicker\r\n [mode]=\"currentMode\"\r\n [locale]=\"locale\"\r\n [dir]=\"dir\"\r\n [enableTime]=\"enableTime\"\r\n [minDate]=\"minDate\"\r\n [maxDate]=\"maxDate\"\r\n [initialDate]=\"getInitialDateForCalendar()\"\r\n [initialRangeStart]=\"getInitialRangeStart()\"\r\n [initialRangeEnd]=\"getInitialRangeEnd()\"\r\n [theme]=\"theme\"\r\n [styles]=\"styles\"\r\n [futureValidation]=\"futureValidation\"\r\n [markToday]=\"markToday\"\r\n [todaysDateSection]=\"todaysDateSection\"\r\n [todaysDateText]=\"todaysDateText\"\r\n [ummAlQuraDateText]=\"ummAlQuraDateText\"\r\n [amLabel]=\"amLabel\"\r\n [pmLabel]=\"pmLabel\"\r\n [useMeridian]=\"useMeridian\"\r\n [selectionMode]=\"selectionMode\"\r\n [showConfirmButton]=\"false\"\r\n [submitTextButton]=\"submitTextButton\"\r\n [canChangeMode]=\"canChangeMode\"\r\n [disableYearPicker]=\"disableYearPicker\"\r\n [disableMonthPicker]=\"disableMonthPicker\"\r\n [disableDayPicker]=\"disableDayPicker\"\r\n [futureValidationMessage]=\"futureValidationMessage\"\r\n [yearSelectLabel]=\"yearSelectLabel\"\r\n [monthSelectLabel]=\"monthSelectLabel\"\r\n [futureValidationMessageEn]=\"futureValidationMessageEn\"\r\n [futureValidationMessageAr]=\"futureValidationMessageAr\"\r\n [pastYearsLimit]=\"pastYearsLimit\"\r\n [futureYearsLimit]=\"futureYearsLimit\"\r\n [dateDisplayFormat]=\"dateFormat\"\r\n (onSubmit)=\"onCalendarSubmit($any($event))\"\r\n (onDaySelect)=\"onDaySelect($any($event))\"\r\n >\r\n </hijri-gregorian-datepicker>\r\n </div>\r\n </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\nimport { HijriGregorianDatepickerComponent } from './hijri-gregorian-datepicker.component';\nimport { HijriGregorianDatetimeInputComponent } from './hijri-gregorian-datetime-input.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [\n HijriGregorianDatepickerComponent,\n HijriGregorianDatetimeInputComponent, // NEW: DateTime input component\n ],\n imports: [FormsModule, ReactiveFormsModule, CommonModule],\n exports: [\n HijriGregorianDatepickerComponent,\n HijriGregorianDatetimeInputComponent, // NEW: Export for external use\n ],\n})\nexport class HijriGregorianDatepickerModule {}\n","/*\n * Public API Surface of hijri-gregorian-datepicker\n */\n\nexport * from './_services/date-utilities.service';\nexport * from './lib/hijri-gregorian-datepicker.component';\nexport * from './lib/hijri-gregorian-datetime-input.component'; // NEW: Export datetime input component\nexport * from './lib/hijri-gregorian-datepicker.module';\nexport * from './_interfaces/calendar-model'; // Export interfaces including TimeValue\nexport * from './_interfaces/styles-config.model'; // Export stylesConfig interface\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["datesDictionary['default']","i2.DateUtilitiesService","i1.DateUtilitiesService","i2","i3.HijriGregorianDatepickerComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
package/index.d.ts CHANGED
@@ -126,6 +126,7 @@ interface stylesConfig {
126
126
  declare class HijriGregorianDatepickerComponent implements OnInit, OnChanges, AfterViewInit {
127
127
  formBuilder: UntypedFormBuilder;
128
128
  _dateUtilsService: DateUtilitiesService;
129
+ private readonly STORAGE_KEY;
129
130
  markToday: boolean;
130
131
  canChangeMode: boolean;
131
132
  todaysDateSection: boolean;
@@ -382,6 +383,7 @@ declare class HijriGregorianDatepickerComponent implements OnInit, OnChanges, Af
382
383
 
383
384
  declare class HijriGregorianDatetimeInputComponent implements ControlValueAccessor, OnInit, OnDestroy {
384
385
  private dateUtilitiesService;
386
+ private readonly STORAGE_KEY;
385
387
  /** Placeholder text for input field */
386
388
  placeholder: string;
387
389
  /** Date format for display (e.g., 'DD/MM/YYYY') */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "angular-hijri-gregorian-date-time-picker",
3
- "version": "1.5.09",
3
+ "version": "1.6.0",
4
4
  "description": "Angular Hijri Gregorian Date Time Picker with beautiful custom selects, time picker, range selection, and bilingual typography support",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {