Skip to content

Commit bfdb981

Browse files
committed
update and reform structure
1 parent 14ebe85 commit bfdb981

File tree

9 files changed

+1202
-1061
lines changed

9 files changed

+1202
-1061
lines changed

docs/amawasya.png

-1.88 MB
Loading

docs/calendar.html

Lines changed: 0 additions & 612 deletions
This file was deleted.

docs/calendar.js

Lines changed: 345 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,345 @@
1+
let currentYear;
2+
let currentMonth;
3+
let currentDay;
4+
5+
function showCurrentMonth() {
6+
const today = new Date();
7+
const bikram = new Bikram();
8+
bikram.fromGregorian(today.getFullYear(), today.getMonth() + 1, today.getDate());
9+
10+
currentYear = bikram.getYear();
11+
currentMonth = bikram.getMonth();
12+
currentDay = bikram.getDay();
13+
14+
document.getElementById('yearInput').value = currentYear;
15+
document.getElementById('monthSelector').value = currentMonth;
16+
17+
generateCalendar(currentYear, currentMonth);
18+
}
19+
20+
function getfirstWeekday(year, month) {
21+
const bikram = new Bikram();
22+
const firstGregorianDate = bikram.toGregorian(year, month, 1);
23+
const timeinfo = new Date(firstGregorianDate.year, firstGregorianDate.month - 1, firstGregorianDate.day);
24+
const weekdayIndex = timeinfo.getDay();
25+
return weekdayIndex;
26+
}
27+
28+
function convertToDevanagari(number) {
29+
const devanagariDigits = ['०', '१', '२', '३', '४', '५', '६', '७', '८', '९'];
30+
return number.toString().split('').map(digit => devanagariDigits[parseInt(digit, 10)]).join('');
31+
}
32+
33+
function generateCalendar(year, month) {
34+
const calendarDiv = document.getElementById('calendar');
35+
calendarDiv.innerHTML = '';
36+
37+
const daysInMonth = new Bikram().daysInMonth(year, month);
38+
const bikram = new Bikram();
39+
40+
const today = new Date();
41+
const todayBikram = new Bikram();
42+
todayBikram.fromGregorian(today.getFullYear(), today.getMonth() + 1, today.getDate());
43+
const todayBikramYear = todayBikram.getYear();
44+
const todayBikramMonth = todayBikram.getMonth();
45+
const todayBikramDay = todayBikram.getDay();
46+
47+
const defaultLanguage = "nepali";
48+
const monthName = getMonthNameWithDefaultLanguage(month, defaultLanguage);
49+
const gregorianStart = getGregorianDate(year, month, 1);
50+
const gregorianEnd = getLastDayOfGregorian(year, month);
51+
52+
const gregorianMonthDisplay = formatGregorianMonthDisplay(gregorianStart, gregorianEnd);
53+
54+
let calendarHTML = `<h2>${monthName} ${convertToDevanagari(year)} <span class="gregorian-month-display">${gregorianMonthDisplay}</span></h2><table><tr>`;
55+
56+
const weekdays = ['आइतवार', 'सोमवार', 'मङ्गलवार', 'बुधवार', 'बिहीवार', 'शुक्रवार', 'शनिवार']; // Nepali weekdays
57+
58+
weekdays.forEach(day => {
59+
calendarHTML += `<th>${day}</th>`;
60+
});
61+
calendarHTML += '</tr><tr>';
62+
63+
const firstDayOfMonth = getfirstWeekday(year, month);
64+
65+
for (let i = 0; i < firstDayOfMonth; i++) {
66+
calendarHTML += '<td class="empty"></td>';
67+
}
68+
69+
for (let day = 1; day <= daysInMonth; day++) {
70+
const isToday = (day === todayBikramDay && month === todayBikramMonth && year === todayBikramYear);
71+
const className = isToday ? 'today' : '';
72+
73+
// Highlight Saturdays (index 6)
74+
const saturdayClass = (firstDayOfMonth + day - 1) % 7 === 6 ? 'saturday' : '';
75+
const finalClass = className ? ` ${className}` : '';
76+
77+
// Calculate Tithi
78+
const gregorianDate = bikram.toGregorian(year, month, day);
79+
const tithi = calculateTithi(gregorianDate.year, gregorianDate.month, gregorianDate.day);
80+
81+
let tithiImage = '';
82+
if (tithi.tithi === 'पूर्णिमा') {
83+
tithiImage = '<img src="purnima.png" alt="Purnima" style="width:30px;height:30px;">';
84+
} else if (tithi.tithi === 'अमावास्या') {
85+
tithiImage = '<img src="amawasya.png" alt="Amawasya" style="width:30px;height:30px;">';
86+
}
87+
88+
// Check for events
89+
let eventText = '';
90+
let eventDetail = '';
91+
const hasEvent = checkEvent(bikramBasedEvents, year, month, day, 'bikram') ||
92+
checkEvent(gregorianBasedEvents, gregorianDate.year, gregorianDate.month, gregorianDate.day, 'gregorian') ||
93+
checkEvent(fixedDateEvents, year, month, day, 'fixed');
94+
95+
// If there is an event, collect the event text and details
96+
if (hasEvent) {
97+
eventText = getEventText(bikramBasedEvents, year, month, day, 'bikram') ||
98+
getEventText(gregorianBasedEvents, gregorianDate.year, gregorianDate.month, gregorianDate.day, 'gregorian') ||
99+
getEventText(fixedDateEvents, year, month, day, 'fixed');
100+
101+
eventDetail = getEventDetail(bikramBasedEvents, year, month, day, 'bikram') ||
102+
getEventDetail(gregorianBasedEvents, gregorianDate.year, gregorianDate.month, gregorianDate.day, 'gregorian') ||
103+
getEventDetail(fixedDateEvents, year, month, day, 'fixed');
104+
}
105+
106+
// Add the HTML for the calendar cell
107+
calendarHTML += `<td class="${finalClass} ${saturdayClass}" onclick="showEventDetails('${day}', '${tithi.tithi.replace(/'/g, "\\'")}', '${tithi.paksha.replace(/'/g, "\\'")}', '${gregorianDate.day}', '${bikram.toString()}', '${eventText.replace(/'/g, "\\'")}', '${eventDetail.replace(/'/g, "\\'")}')">
108+
<div class="day-content">
109+
<div>${convertToDevanagari(day)}</div>
110+
<div class="tithi">
111+
${hasEvent ? '' : tithi.tithi}
112+
${tithiImage}
113+
</div>
114+
${hasEvent ? `<div class="event">${eventText}</div>` : ''}
115+
<div class="gregorian">${gregorianDate.day}</div>
116+
</div>
117+
</td>`;
118+
119+
if ((firstDayOfMonth + day) % 7 === 0 && day !== daysInMonth) {
120+
calendarHTML += '</tr><tr>';
121+
}
122+
}
123+
124+
const remainingCells = (firstDayOfMonth + daysInMonth) % 7;
125+
if (remainingCells !== 0) {
126+
for (let i = 0; i < 7 - remainingCells; i++) {
127+
calendarHTML += '<td class="empty"></td>';
128+
}
129+
}
130+
131+
calendarHTML += '</tr></table>';
132+
calendarDiv.innerHTML = calendarHTML;
133+
}
134+
135+
136+
137+
138+
139+
function checkEvent(events, year, month, day, dateType) {
140+
let hasEvent = false;
141+
events.forEach(event => {
142+
if ((event.startYear && year < event.startYear) || (event.endYear && year > event.endYear)) {
143+
return; // Skip this event if the current year is before the startYear or after the endYear
144+
}
145+
146+
if (event.showOnDay === false) {
147+
return; // Skip this event if it should not be shown on the day cell
148+
}
149+
150+
if (dateType === 'bikram') {
151+
const [eventYear, eventMonth, eventDay] = event.date.split('/').map(Number);
152+
if (year === eventYear && month === eventMonth && day === eventDay) {
153+
hasEvent = true;
154+
}
155+
} else if (dateType === 'gregorian' || dateType === 'fixed') {
156+
const [eventMonth, eventDay] = event.date.split('/').map(Number);
157+
if (month === eventMonth && day === eventDay) {
158+
hasEvent = true;
159+
}
160+
}
161+
});
162+
return hasEvent;
163+
}
164+
165+
166+
function getEventText(events, year, month, day, dateType) {
167+
let eventText = '';
168+
events.forEach(event => {
169+
if ((event.startYear && year < event.startYear) || (event.endYear && year > event.endYear)) {
170+
return; // Skip this event if the current year is before the startYear or after the endYear
171+
}
172+
173+
if (event.showOnDay === false) {
174+
return; // Skip this event if it should not be shown on the day cell
175+
}
176+
177+
if (dateType === 'bikram') {
178+
const [eventYear, eventMonth, eventDay] = event.date.split('/').map(Number);
179+
if (year === eventYear && month === eventMonth && day === eventDay) {
180+
eventText += `<div>${event.event}</div>`;
181+
}
182+
} else if (dateType === 'gregorian' || dateType === 'fixed') {
183+
const [eventMonth, eventDay] = event.date.split('/').map(Number);
184+
if (month === eventMonth && day === eventDay) {
185+
eventText += `<div>${event.event}</div>`;
186+
}
187+
}
188+
});
189+
return eventText;
190+
}
191+
192+
193+
function getEventDetail(events, year, month, day, dateType) {
194+
let eventDetail = '';
195+
events.forEach(event => {
196+
if ((event.startYear && year < event.startYear) || (event.endYear && year > event.endYear)) {
197+
return; // Skip this event if the current year is before the startYear or after the endYear
198+
}
199+
200+
if (dateType === 'bikram') {
201+
const [eventYear, eventMonth, eventDay] = event.date.split('/').map(Number);
202+
if (year === eventYear && month === eventMonth && day === eventDay) {
203+
eventDetail += `<div>${event.detail}</div>`;
204+
}
205+
} else if (dateType === 'gregorian' || dateType === 'fixed') {
206+
const [eventMonth, eventDay] = event.date.split('/').map(Number);
207+
if (month === eventMonth && day === eventDay) {
208+
eventDetail += `<div>${event.detail}</div>`;
209+
}
210+
}
211+
});
212+
return eventDetail;
213+
}
214+
215+
216+
function showEventDetails(day, tithi, paksha, gregorianDate, bikramDate, eventText, eventDetail, year, month) {
217+
// Get the modal element
218+
const modal = document.getElementById('tithiModal');
219+
const tithiInfo = document.getElementById('tithiInfo');
220+
221+
222+
// Construct the content for the modal
223+
let content = `
224+
<p> ${paksha} ${tithi}</p>
225+
`;
226+
227+
// If there are events, append event details to the modal content
228+
if (eventText && eventDetail) {
229+
content += `
230+
<p><strong>${eventText}</strong></p>
231+
<p> ${eventDetail}</p>
232+
`;
233+
}
234+
235+
// Set the modal content
236+
tithiInfo.innerHTML = content;
237+
238+
// Display the modal
239+
modal.style.display = "block";
240+
}
241+
242+
function closeModal() {
243+
const tithiModal = document.getElementById('tithiModal');
244+
tithiModal.style.display = 'none';
245+
}
246+
247+
window.onclick = function(event) {
248+
const modal = document.getElementById('tithiModal');
249+
if (event.target == modal) {
250+
modal.style.display = 'none';
251+
}
252+
}
253+
function closeModal() {
254+
document.getElementById('tithiModal').style.display = 'none';
255+
}
256+
257+
window.onclick = function(event) {
258+
const modal = document.getElementById('tithiModal');
259+
if (event.target == modal) {
260+
modal.style.display = 'none';
261+
}
262+
}
263+
264+
265+
function getMonthNameWithDefaultLanguage(month, language) {
266+
const bikram = new Bikram();
267+
const originalGetMonthName = bikram.getMonthName.bind(bikram);
268+
bikram.getMonthName = function(month) {
269+
const nepaliMonths = ["बैसाख", "जेष्ठ", "आषाढ", "श्रावण", "भाद्र", "आश्विन", "कार्तिक", "मंसिर", "पौष", "माघ", "फागुन", "चैत"];
270+
return nepaliMonths[month - 1];
271+
}
272+
273+
const monthName = bikram.getMonthName(month);
274+
275+
return monthName;
276+
}
277+
278+
function previousYear() {
279+
currentYear--;
280+
document.getElementById('yearInput').value = currentYear;
281+
generateCalendar(currentYear, currentMonth);
282+
}
283+
284+
function nextYear() {
285+
currentYear++;
286+
document.getElementById('yearInput').value = currentYear;
287+
generateCalendar(currentYear, currentMonth);
288+
}
289+
290+
function changeMonth() {
291+
currentMonth = parseInt(document.getElementById('monthSelector').value);
292+
generateCalendar(currentYear, currentMonth);
293+
}
294+
295+
function changeYear() {
296+
currentYear = parseInt(document.getElementById('yearInput').value);
297+
generateCalendar(currentYear, currentMonth);
298+
}
299+
300+
function goToToday() {
301+
const today = new Date();
302+
const bikram = new Bikram();
303+
bikram.fromGregorian(today.getFullYear(), today.getMonth() + 1, today.getDate());
304+
currentYear = bikram.getYear();
305+
currentMonth = bikram.getMonth();
306+
document.getElementById('yearInput').value = currentYear;
307+
document.getElementById('monthSelector').value = currentMonth;
308+
generateCalendar(currentYear, currentMonth);
309+
}
310+
311+
function getGregorianDate(year, month, day) {
312+
const bikram = new Bikram();
313+
return bikram.toGregorian(year, month, day);
314+
}
315+
316+
function getLastDayOfGregorian(year, month) {
317+
const bikram = new Bikram();
318+
const nextMonthFirstDay = bikram.toGregorian(year, month + 1, 1);
319+
const lastDayOfMonth = new Date(nextMonthFirstDay.year, nextMonthFirstDay.month - 1, nextMonthFirstDay.day - 1);
320+
return {
321+
day: lastDayOfMonth.getDate(),
322+
month: lastDayOfMonth.getMonth() + 1, // months are 0-indexed in JavaScript Date
323+
year: lastDayOfMonth.getFullYear()
324+
};
325+
}
326+
327+
function getGregorianMonthName(month) {
328+
const gregorianMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
329+
return gregorianMonths[month - 1];
330+
}
331+
332+
function formatGregorianMonthDisplay(gregorianStart, gregorianEnd) {
333+
if (gregorianStart.year === gregorianEnd.year) {
334+
if (gregorianStart.month === gregorianEnd.month) {
335+
return `${gregorianStart.year} ${getGregorianMonthName(gregorianStart.month)}`;
336+
} else {
337+
return `${gregorianStart.year} ${getGregorianMonthName(gregorianStart.month)}/${getGregorianMonthName(gregorianEnd.month)}`;
338+
}
339+
} else {
340+
return `${gregorianStart.year}/${gregorianEnd.year} ${getGregorianMonthName(gregorianStart.month)}/${getGregorianMonthName(gregorianEnd.month)}`;
341+
}
342+
}
343+
344+
345+
window.onload = showCurrentMonth;

0 commit comments

Comments
 (0)