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