117 lines
3.3 KiB
JavaScript
117 lines
3.3 KiB
JavaScript
class JalaliDateInput {
|
|
constructor(inputElement) {
|
|
this.input = inputElement;
|
|
this.input.maxLength = 10;
|
|
this.input.placeholder = "____/__/__";
|
|
this.input.addEventListener("input", this.onInput.bind(this));
|
|
}
|
|
|
|
onInput(e) {
|
|
let value = e.target.value.replace(/\D/g, "");
|
|
|
|
let year = value.slice(0, 4);
|
|
let rawMonth = value.slice(4, 6);
|
|
let rawDay = value.slice(6, 8);
|
|
|
|
//let month = "";
|
|
//if (rawMonth.length === 1) {
|
|
// const m = parseInt(rawMonth);
|
|
// if (m >= 2 && m <= 9) {
|
|
// month = "0" + m;
|
|
// } else if (m === 1) {
|
|
// month = "1";
|
|
// }
|
|
//} else if (rawMonth.length === 2) {
|
|
// let m = parseInt(rawMonth);
|
|
// if (isNaN(m)) {
|
|
// month = "";
|
|
// } else {
|
|
// if (m > 12) m = 12;
|
|
// month = m.toString().padStart(2, "0");
|
|
// }
|
|
//}
|
|
let month = "";
|
|
if (rawMonth.length === 1) {
|
|
month = rawMonth;
|
|
} else if (rawMonth.length === 2) {
|
|
let m = parseInt(rawMonth);
|
|
if (!isNaN(m)) {
|
|
if (m < 1) m = 1;
|
|
if (m > 12) m = 12;
|
|
month = m.toString().padStart(2, "0");
|
|
}
|
|
}
|
|
|
|
let day = "";
|
|
if (rawDay.length === 1) {
|
|
day = rawDay;
|
|
} else if (rawDay.length === 2 && year.length === 4 && month.length === 2) {
|
|
let d = parseInt(rawDay);
|
|
if (!isNaN(d)) {
|
|
let maxDay = JalaliDateUtils.maxDayInMonth(parseInt(year), parseInt(month));
|
|
if (d > maxDay) d = maxDay;
|
|
day = d.toString().padStart(2, "0");
|
|
}
|
|
}
|
|
|
|
let formatted = year;
|
|
if (month) {
|
|
formatted += "/" + month;
|
|
} else if (value.length > 4) {
|
|
formatted += "/";
|
|
}
|
|
|
|
if (day) {
|
|
formatted += "/" + day;
|
|
} else if (value.length > 6) {
|
|
formatted += "/";
|
|
}
|
|
|
|
//let formatted = year;
|
|
//if (month) {
|
|
// formatted += "/" + month;
|
|
//} else if (value.length >= 4) {
|
|
// formatted += "/";
|
|
//}
|
|
|
|
//if (day) {
|
|
// formatted += "/" + day;
|
|
//} else if (value.length >= 6) {
|
|
// formatted += "/";
|
|
//}
|
|
|
|
this.input.value = formatted;
|
|
}
|
|
|
|
formatMonth(rawMonth) {
|
|
if (!rawMonth) return "";
|
|
let month = parseInt(rawMonth, 10);
|
|
if (isNaN(month)) return "";
|
|
if (month > 12) month = 12;
|
|
return month.toString().padStart(2, "0");
|
|
}
|
|
|
|
formatDay(year, month, rawDay) {
|
|
if (!rawDay || !month) return "";
|
|
let day = parseInt(rawDay, 10);
|
|
if (isNaN(day)) return "";
|
|
|
|
let maxDay = JalaliDateUtils.maxDayInMonth(parseInt(year), parseInt(month));
|
|
if (day > maxDay) day = maxDay;
|
|
return day.toString().padStart(2, "0");
|
|
}
|
|
}
|
|
|
|
class JalaliDateUtils {
|
|
static isLeapYear(year) {
|
|
const leapYears = [1, 5, 9, 13, 17, 22, 26, 30];
|
|
return leapYears.includes(year % 33);
|
|
}
|
|
|
|
static maxDayInMonth(year, month) {
|
|
if (month < 1) return 1;
|
|
if (month <= 6) return 31;
|
|
if (month <= 11) return 30;
|
|
return this.isLeapYear(year) ? 30 : 29;
|
|
}
|
|
} |