angular-hijri-gregorian-date-time-picker 1.6.2 → 1.6.3

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.
@@ -27750,11 +27750,14 @@ class DateUtilitiesService {
27750
27750
  }
27751
27751
  }
27752
27752
  else if (yearIndex === 0) {
27753
- // Format: YYYY/MM/DD or YYYY/DD/MM (Gregorian)
27753
+ // Format: YYYY/MM/DD or YYYY/DD/MM (could be Gregorian or Hijri)
27754
27754
  year = parts[0].padStart(4, '0');
27755
27755
  month = parts[1].padStart(2, '0');
27756
27756
  day = parts[2].padStart(2, '0');
27757
- isGregorian = true;
27757
+ // Determine if Gregorian or Hijri based on year value
27758
+ const yearNum = parseInt(year, 10);
27759
+ // Hijri years typically 1300-1500, Gregorian years typically > 1800
27760
+ isGregorian = yearNum > 1800;
27758
27761
  // Smart validation: if month > 12, swap day and month
27759
27762
  const monthNum = parseInt(month, 10);
27760
27763
  const dayNum = parseInt(day, 10);
@@ -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 /**\n * Convert date between Gregorian and Hijri calendars\n * Accepts any common date format and automatically normalizes it\n * @param dateStr - Input date string in any common format\n * @param isGregorian - True if input is Gregorian, false if Hijri (optional - auto-detected if not provided)\n * @returns DayInfo object with both Gregorian and Hijri dates, or null if invalid\n */\n convertDate(dateStr: string, isGregorian?: boolean): DayInfo | null {\n if (!dateStr) return null;\n\n // Step 1: Normalize the input date to handle any format\n const normalizedResult = this.normalizeDate(dateStr);\n if (!normalizedResult) return null;\n\n const { normalized, isGregorian: detectedIsGregorian } = normalizedResult;\n\n // Use provided isGregorian flag, or fall back to auto-detected value\n const isGregorianDate = isGregorian !== undefined ? isGregorian : detectedIsGregorian;\n\n if (isGregorianDate) {\n // Process Gregorian date (normalized format: YYYY/MM/DD)\n // Convert to DD/MM/YYYY for parseDate compatibility\n const [year, month, day] = normalized.split('/');\n const ddmmyyyy = `${day}/${month}/${year}`;\n\n const gregorianDate = this.parseDate(ddmmyyyy);\n if (!gregorianDate) return null;\n const formattedDate = this.formatDate(gregorianDate);\n\n // Search through calendar data to find matching Gregorian date\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 // Process Hijri date (normalized format: DD/MM/YYYY)\n const [day, month, year] = normalized.split('/').map(Number);\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null;\n\n // Search through calendar data to find matching Hijri date\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 * Normalize date string to a consistent format with automatic detection\n * Handles any common date format and returns standardized output\n * @param dateStr - Input date string in any common format\n * @returns Object with normalized date string and format type, or null if invalid\n */\n normalizeDate(dateStr: string): { normalized: string; isGregorian: boolean } | null {\n if (!dateStr || typeof dateStr !== 'string') {\n return null;\n }\n\n const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\n // Step 1: Convert Arabic-Indic numerals to English numerals\n let normalized = dateStr.trim()\n .split('')\n .map((char) => {\n const index = arabicNumbers.indexOf(char);\n return index > -1 ? englishNumbers[index] : char;\n })\n .join('');\n\n // Step 2: Replace all hyphens with forward slashes for consistency\n normalized = normalized.replace(/-/g, '/');\n\n // Step 3: Split by separator and validate\n const parts = normalized.split('/').filter(part => part.length > 0);\n\n if (parts.length !== 3) {\n return null; // Invalid: must have exactly 3 parts\n }\n\n // Validate that all parts are numeric\n if (!parts.every(part => /^\\d+$/.test(part))) {\n return null; // Invalid: all parts must be numeric\n }\n\n let year: string, month: string, day: string;\n let isGregorian = false;\n\n // Step 4: Smart detection - identify year by finding 4-digit number\n const yearIndex = parts.findIndex(part => part.length === 4);\n\n if (yearIndex === -1) {\n // No 4-digit part found - try 2-digit year (ambiguous, default to Hijri DD/MM/YY)\n if (parts.every(part => part.length <= 2)) {\n // Assume DD/MM/YY format (Hijri)\n day = parts[0].padStart(2, '0');\n month = parts[1].padStart(2, '0');\n // Convert 2-digit year to 4-digit (assume 20xx for years 00-99)\n const yearNum = parseInt(parts[2], 10);\n year = yearNum < 100 ? `20${parts[2].padStart(2, '0')}` : parts[2].padStart(4, '0');\n isGregorian = false;\n } else {\n return null; // Invalid: ambiguous format\n }\n } else if (yearIndex === 0) {\n // Format: YYYY/MM/DD or YYYY/DD/MM (Gregorian)\n year = parts[0].padStart(4, '0');\n month = parts[1].padStart(2, '0');\n day = parts[2].padStart(2, '0');\n isGregorian = true;\n\n // Smart validation: if month > 12, swap day and month\n const monthNum = parseInt(month, 10);\n const dayNum = parseInt(day, 10);\n if (monthNum > 12 && dayNum <= 12) {\n [month, day] = [day, month];\n }\n } else if (yearIndex === 2) {\n // Format: DD/MM/YYYY or MM/DD/YYYY (could be either)\n year = parts[2].padStart(4, '0');\n const first = parts[0].padStart(2, '0');\n const second = parts[1].padStart(2, '0');\n\n // Smart detection: determine if it's DD/MM or MM/DD\n const firstNum = parseInt(first, 10);\n const secondNum = parseInt(second, 10);\n\n if (firstNum > 12) {\n // First part > 12, must be day\n day = first;\n month = second;\n } else if (secondNum > 12) {\n // Second part > 12, must be day (so first is month)\n month = first;\n day = second;\n } else {\n // Ambiguous (both <= 12) - default to DD/MM/YYYY format\n day = first;\n month = second;\n }\n\n // Determine if Gregorian or Hijri based on year value\n const yearNum = parseInt(year, 10);\n // Gregorian years typically > 1900, Hijri years typically 1300-1500\n isGregorian = yearNum > 1800;\n } else {\n // Middle position (rare, e.g., DD/YYYY/MM or MM/YYYY/DD)\n return null; // Unsupported format\n }\n\n // Step 5: Validate extracted values\n const yearNum = parseInt(year, 10);\n const monthNum = parseInt(month, 10);\n const dayNum = parseInt(day, 10);\n\n if (yearNum < 1 || yearNum > 9999 ||\n monthNum < 1 || monthNum > 12 ||\n dayNum < 1 || dayNum > 31) {\n return null; // Invalid date values\n }\n\n // Step 6: Return normalized date in appropriate format\n // Gregorian: YYYY/MM/DD\n // Hijri: DD/MM/YYYY\n const normalizedDate = isGregorian\n ? `${year}/${month}/${day}`\n : `${day}/${month}/${year}`;\n\n return {\n normalized: normalizedDate,\n isGregorian: isGregorian\n };\n }\n\n /**\n * Convert date numerals between Arabic-Indic and Western Arabic\n * Accepts any common date format and automatically normalizes before conversion\n * @param date - Input date string in any common format\n * @param targetLang - Target language: 'ar' for Arabic-Indic numerals, 'en' for Western Arabic\n * @returns Date string with converted numerals in the detected format, or original string if invalid\n */\n convertDateNumerals(date: string, targetLang: 'en' | 'ar'): string {\n if (!date || typeof date !== 'string') {\n return date;\n }\n\n const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\n // Helper: Convert Western Arabic numerals to Arabic-Indic\n const toArabic = (value: string): string =>\n value\n .split('')\n .map((char) => (/\\d/.test(char) ? arabicNumbers[+char] : char))\n .join('');\n\n // Helper: Convert Arabic-Indic numerals to Western Arabic\n const toEnglish = (value: string): 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 // Step 1: Normalize the input date to handle any format\n const normalizedResult = this.normalizeDate(date);\n\n if (!normalizedResult) {\n // If normalization fails, attempt basic conversion on original string\n return targetLang === 'ar' ? toArabic(date) : toEnglish(date);\n }\n\n const { normalized } = normalizedResult;\n\n // Step 2: Apply numeral conversion based on target language\n if (targetLang === 'ar') {\n // Convert to Arabic-Indic numerals\n return toArabic(normalized);\n } else {\n // Convert to English numerals (already normalized to English)\n return normalized;\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 @Output() onModeChange = new EventEmitter<string>();\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 // When mode input changes from parent, update calendar display\n // Don't call changeCalendarMode() as that toggles - just accept the new value\n const currentMode = changes['mode'].currentValue;\n if (this.mode !== currentMode) {\n this.mode = currentMode;\n this.initializeYearsAndMonths();\n this.generatetMonthData(\n '01/' +\n this.periodForm.controls['month'].value +\n '/' +\n this.periodForm.controls['year'].value\n );\n this.reapplySelection();\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 immediately\n try {\n localStorage.setItem(this.STORAGE_KEY, this.mode);\n } catch (e) {\n // ignore storage errors\n }\n\n // Emit mode change event for parent components\n this.onModeChange.emit(this.mode);\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'\">{{\n day?.gD?.split(\"/\")[0] | number\n }}</span>\n\n <span id=\"ummAlQura-day\" *ngIf=\"mode == 'ummAlQura'\">{{\n day?.uD?.split(\"/\")[0] | number\n }}</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.primaryColor,\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 // Sync 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 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 * Handle calendar mode change (when user clicks the toggle button)\n * Mode is saved immediately to localStorage\n */\n onModeChangeHandler(mode: string): void {\n // Update currentMode immediately so next open uses correct mode\n this.currentMode = mode;\n\n // Persist the mode immediately when user toggles\n try {\n localStorage.setItem(this.STORAGE_KEY, mode);\n } catch (e) {\n // ignore storage errors\n }\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]=\"showConfirmButton\"\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 (onModeChange)=\"onModeChangeHandler($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 /**\n * Convert date between Gregorian and Hijri calendars\n * Accepts any common date format and automatically normalizes it\n * @param dateStr - Input date string in any common format\n * @param isGregorian - True if input is Gregorian, false if Hijri (optional - auto-detected if not provided)\n * @returns DayInfo object with both Gregorian and Hijri dates, or null if invalid\n */\n convertDate(dateStr: string, isGregorian?: boolean): DayInfo | null {\n if (!dateStr) return null;\n\n // Step 1: Normalize the input date to handle any format\n const normalizedResult = this.normalizeDate(dateStr);\n if (!normalizedResult) return null;\n\n const { normalized, isGregorian: detectedIsGregorian } = normalizedResult;\n\n // Use provided isGregorian flag, or fall back to auto-detected value\n const isGregorianDate = isGregorian !== undefined ? isGregorian : detectedIsGregorian;\n\n if (isGregorianDate) {\n // Process Gregorian date (normalized format: YYYY/MM/DD)\n // Convert to DD/MM/YYYY for parseDate compatibility\n const [year, month, day] = normalized.split('/');\n const ddmmyyyy = `${day}/${month}/${year}`;\n\n const gregorianDate = this.parseDate(ddmmyyyy);\n if (!gregorianDate) return null;\n const formattedDate = this.formatDate(gregorianDate);\n\n // Search through calendar data to find matching Gregorian date\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 // Process Hijri date (normalized format: DD/MM/YYYY)\n const [day, month, year] = normalized.split('/').map(Number);\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null;\n\n // Search through calendar data to find matching Hijri date\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 * Normalize date string to a consistent format with automatic detection\n * Handles any common date format and returns standardized output\n * @param dateStr - Input date string in any common format\n * @returns Object with normalized date string and format type, or null if invalid\n */\n normalizeDate(dateStr: string): { normalized: string; isGregorian: boolean } | null {\n if (!dateStr || typeof dateStr !== 'string') {\n return null;\n }\n\n const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\n // Step 1: Convert Arabic-Indic numerals to English numerals\n let normalized = dateStr.trim()\n .split('')\n .map((char) => {\n const index = arabicNumbers.indexOf(char);\n return index > -1 ? englishNumbers[index] : char;\n })\n .join('');\n\n // Step 2: Replace all hyphens with forward slashes for consistency\n normalized = normalized.replace(/-/g, '/');\n\n // Step 3: Split by separator and validate\n const parts = normalized.split('/').filter(part => part.length > 0);\n\n if (parts.length !== 3) {\n return null; // Invalid: must have exactly 3 parts\n }\n\n // Validate that all parts are numeric\n if (!parts.every(part => /^\\d+$/.test(part))) {\n return null; // Invalid: all parts must be numeric\n }\n\n let year: string, month: string, day: string;\n let isGregorian = false;\n\n // Step 4: Smart detection - identify year by finding 4-digit number\n const yearIndex = parts.findIndex(part => part.length === 4);\n\n if (yearIndex === -1) {\n // No 4-digit part found - try 2-digit year (ambiguous, default to Hijri DD/MM/YY)\n if (parts.every(part => part.length <= 2)) {\n // Assume DD/MM/YY format (Hijri)\n day = parts[0].padStart(2, '0');\n month = parts[1].padStart(2, '0');\n // Convert 2-digit year to 4-digit (assume 20xx for years 00-99)\n const yearNum = parseInt(parts[2], 10);\n year = yearNum < 100 ? `20${parts[2].padStart(2, '0')}` : parts[2].padStart(4, '0');\n isGregorian = false;\n } else {\n return null; // Invalid: ambiguous format\n }\n } else if (yearIndex === 0) {\n // Format: YYYY/MM/DD or YYYY/DD/MM (could be Gregorian or Hijri)\n year = parts[0].padStart(4, '0');\n month = parts[1].padStart(2, '0');\n day = parts[2].padStart(2, '0');\n\n // Determine if Gregorian or Hijri based on year value\n const yearNum = parseInt(year, 10);\n // Hijri years typically 1300-1500, Gregorian years typically > 1800\n isGregorian = yearNum > 1800;\n\n // Smart validation: if month > 12, swap day and month\n const monthNum = parseInt(month, 10);\n const dayNum = parseInt(day, 10);\n if (monthNum > 12 && dayNum <= 12) {\n [month, day] = [day, month];\n }\n } else if (yearIndex === 2) {\n // Format: DD/MM/YYYY or MM/DD/YYYY (could be either)\n year = parts[2].padStart(4, '0');\n const first = parts[0].padStart(2, '0');\n const second = parts[1].padStart(2, '0');\n\n // Smart detection: determine if it's DD/MM or MM/DD\n const firstNum = parseInt(first, 10);\n const secondNum = parseInt(second, 10);\n\n if (firstNum > 12) {\n // First part > 12, must be day\n day = first;\n month = second;\n } else if (secondNum > 12) {\n // Second part > 12, must be day (so first is month)\n month = first;\n day = second;\n } else {\n // Ambiguous (both <= 12) - default to DD/MM/YYYY format\n day = first;\n month = second;\n }\n\n // Determine if Gregorian or Hijri based on year value\n const yearNum = parseInt(year, 10);\n // Gregorian years typically > 1900, Hijri years typically 1300-1500\n isGregorian = yearNum > 1800;\n } else {\n // Middle position (rare, e.g., DD/YYYY/MM or MM/YYYY/DD)\n return null; // Unsupported format\n }\n\n // Step 5: Validate extracted values\n const yearNum = parseInt(year, 10);\n const monthNum = parseInt(month, 10);\n const dayNum = parseInt(day, 10);\n\n if (yearNum < 1 || yearNum > 9999 ||\n monthNum < 1 || monthNum > 12 ||\n dayNum < 1 || dayNum > 31) {\n return null; // Invalid date values\n }\n\n // Step 6: Return normalized date in appropriate format\n // Gregorian: YYYY/MM/DD\n // Hijri: DD/MM/YYYY\n const normalizedDate = isGregorian\n ? `${year}/${month}/${day}`\n : `${day}/${month}/${year}`;\n\n return {\n normalized: normalizedDate,\n isGregorian: isGregorian\n };\n }\n\n /**\n * Convert date numerals between Arabic-Indic and Western Arabic\n * Accepts any common date format and automatically normalizes before conversion\n * @param date - Input date string in any common format\n * @param targetLang - Target language: 'ar' for Arabic-Indic numerals, 'en' for Western Arabic\n * @returns Date string with converted numerals in the detected format, or original string if invalid\n */\n convertDateNumerals(date: string, targetLang: 'en' | 'ar'): string {\n if (!date || typeof date !== 'string') {\n return date;\n }\n\n const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\n // Helper: Convert Western Arabic numerals to Arabic-Indic\n const toArabic = (value: string): string =>\n value\n .split('')\n .map((char) => (/\\d/.test(char) ? arabicNumbers[+char] : char))\n .join('');\n\n // Helper: Convert Arabic-Indic numerals to Western Arabic\n const toEnglish = (value: string): 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 // Step 1: Normalize the input date to handle any format\n const normalizedResult = this.normalizeDate(date);\n\n if (!normalizedResult) {\n // If normalization fails, attempt basic conversion on original string\n return targetLang === 'ar' ? toArabic(date) : toEnglish(date);\n }\n\n const { normalized } = normalizedResult;\n\n // Step 2: Apply numeral conversion based on target language\n if (targetLang === 'ar') {\n // Convert to Arabic-Indic numerals\n return toArabic(normalized);\n } else {\n // Convert to English numerals (already normalized to English)\n return normalized;\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 @Output() onModeChange = new EventEmitter<string>();\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 // When mode input changes from parent, update calendar display\n // Don't call changeCalendarMode() as that toggles - just accept the new value\n const currentMode = changes['mode'].currentValue;\n if (this.mode !== currentMode) {\n this.mode = currentMode;\n this.initializeYearsAndMonths();\n this.generatetMonthData(\n '01/' +\n this.periodForm.controls['month'].value +\n '/' +\n this.periodForm.controls['year'].value\n );\n this.reapplySelection();\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 immediately\n try {\n localStorage.setItem(this.STORAGE_KEY, this.mode);\n } catch (e) {\n // ignore storage errors\n }\n\n // Emit mode change event for parent components\n this.onModeChange.emit(this.mode);\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'\">{{\n day?.gD?.split(\"/\")[0] | number\n }}</span>\n\n <span id=\"ummAlQura-day\" *ngIf=\"mode == 'ummAlQura'\">{{\n day?.uD?.split(\"/\")[0] | number\n }}</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.primaryColor,\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 // Sync 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 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 * Handle calendar mode change (when user clicks the toggle button)\n * Mode is saved immediately to localStorage\n */\n onModeChangeHandler(mode: string): void {\n // Update currentMode immediately so next open uses correct mode\n this.currentMode = mode;\n\n // Persist the mode immediately when user toggles\n try {\n localStorage.setItem(this.STORAGE_KEY, mode);\n } catch (e) {\n // ignore storage errors\n }\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]=\"showConfirmButton\"\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 (onModeChange)=\"onModeChangeHandler($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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "angular-hijri-gregorian-date-time-picker",
3
- "version": "1.6.2",
3
+ "version": "1.6.3",
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": {