diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0c93e65..8d7bafe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -56,7 +56,7 @@ Welcome to the NOSK Official Website repository! We appreciate your interest in ## Stay Connected 💬 Join our community on: -- [Discord](https://discord.gg/ryUf3jjFJ6) +- [Discord](https://discord.gg/P5Y6nbHVPU) - [Telegram](https://t.me/noskgroup) ## Resources diff --git a/events.json b/events.json index 9f90e49..aaf6b98 100644 --- a/events.json +++ b/events.json @@ -1,4 +1,24 @@ [ + { + "id": "26", + "Title": "Software Freedom Day 2025", + "By":["NOSK Contributors"], + "Date": "20-09-2025", + "Time": "09:00", + "URL": "https://sfd.nosk.org.np", + "ProfileLink":["https://sfd.nosk.org.np"] + }, + { + "id": "25", + "Title": "Git and Github Workshop", + "By":["Rishav Chapagain","Anish Kumar Neupane"], + "Date": "21-02-2025", + "Time": "14:00", + "URL": "https://forms.gle/M2ZthGJmqJsxcCrq6", + "IMGURL":"/site/html/gallery.html#git-github", + "ProfileLink":["https://forms.gle/M2ZthGJmqJsxcCrq6"] + }, + { "id": "24", "Title": "Software Freedom Day 2024", @@ -24,7 +44,6 @@ "Date":"01-06-2024", "Time":"10:30", "URL":"https://forms.gle/vMyq8eLNYfr48jpA7", - "IMGURL":"/site/html/gallery.html#linux-workshop-2024", "ProfileLink":["","",""] }, diff --git a/inde.html b/inde.html new file mode 100644 index 0000000..e69de29 diff --git a/index-old.html b/index-old.html new file mode 100644 index 0000000..b6d7979 --- /dev/null +++ b/index-old.html @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NOSK - Nepal Open Source Klub + + +
+ + + + + +
+
+

NOSK

+ + “Opening Minds through Open Source.” + +
+ + +
+
+ + +
+ + diff --git a/index.html b/index.html index dc071b2..afc7a28 100644 --- a/index.html +++ b/index.html @@ -1,204 +1,1197 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + NOSK - Nepal Open Source Klub - - -
- - - - - -
-
-

NOSK

- - “Opening Minds through Open Source.” - -
+ + +
+
+

Upcoming Events

+
+
+

Software Freedom Day 2025

+

Join us for Software Freedom Day 2025, a global celebration of Free and Open Source Software! This annual event brings together the FOSS community to share knowledge, showcase projects, and promote digital freedom. Experience hands-on workshops, insightful talks, and connect with fellow open source enthusiasts in Nepal.

+ Learn More +
+
+ +
+
+
+
+ +
+
+

What We Do

+
+
+
+

Educate & Train

+

We organize regular workshops and training sessions on various FOSS technologies to empower individuals.

+
+
+
+

Promote Contribution

+

We encourage and guide members to contribute to open-source projects, fostering a culture of collaboration.

+
+
+
+

Build Community

+

We host meetups and events to connect like-minded people, creating a strong and supportive network.

+
+
+
+
+ +
+
+
+
+ NOSK Community - Collaborative workshop session +
+
+

About The Klub

+

NOSK - Nepal Open Source Klub is a vibrant community of like-minded individuals dedicated to raising awareness and adoption of Free and Open Source Software (FOSS) in Nepal. We believe in the power of open collaboration and knowledge sharing.

+

Our mission is to educate and train people across different domains of technology by organizing workshops, training sessions, and community events that make FOSS accessible to everyone.

+

Founded by Nitesh Rijal on February 28th, 2008, NOSK began as the NCIT Open Source Klub and has since grown into Nepal's premier FOSS community, fostering innovation and collaboration.

+ +
+
+
+
+ + + +
+
+

Why NOSK?

+

Hear what our members have to say about their experience.

+
+
+

"Before joining NOSK, I was just a student curious about Linux. Now, I'm contributing to open-source projects I use every day. The mentorship and support here are unparalleled."

+

- Bibek Dhakal

+
+
+

"I found my first internship through a connection I made at a NOSK meetup. It's more than just a tech club; it’s a career launchpad for students in Nepal."

+

- Rishav Chapagain

+
+
+

"The hands-on workshops are fantastic. I learned Git, Docker, and so much more in a friendly, no-pressure environment. It's the best place to learn by doing."

+

- Nitesh Rijal

+
+
+

"As a designer, I wasn't sure if an 'open-source club' was for me. I was wrong! I've collaborated on amazing projects and learned how design and FOSS intersect."

+

- Anish Kumar Neupane

+
+
+

"NOSK is the heart of the FOSS community in Kathmandu Valley. The energy is contagious, and the people are incredibly welcoming. It truly feels like a family."

+

- Satya Raj Awasthi

+
+
+

"NOSK le garda keta keti le padnai chode"

+

- Bhusan Thapa

+
+
+
+
+ +
+
+

Frequently Asked Questions

+
+
+ +

NOSK is open to everyone who wants to be a part of it, regardless of skill level or background. If you have a passion for learning and sharing, you are welcome here.

+
+
+ +

Absolutely not! We welcome beginners and experts alike. Our community is built on mentorship and learning together. We have events and sessions tailored for all levels.

+
+
+ +

The vast majority of our meetups and community events are free of charge. Some specific, intensive workshops might have a small fee to cover costs like materials or resources, which will always be clearly stated beforehand.

+
+
+
+
+ +
+
+

Get In Touch

+
+
+

Have a question or want to collaborate?

+

We'd love to hear from you. Send us a message, and we'll get back to you as soon as possible. You can also find us on social media!

+ +
+
+
+ +
+
+ +
+
+ +
+ +
+
+
+
-
- - - - + + +
+
+

© 2025 Nepal Open Source Klub. All Rights Reserved.

-
-
+ + + - -
- - + + + \ No newline at end of file diff --git a/site/BackgroundRemoved.png b/site/BackgroundRemoved.png new file mode 100644 index 0000000..24471f0 Binary files /dev/null and b/site/BackgroundRemoved.png differ diff --git a/site/html/about.html b/site/html/about.html index 91bf553..089e161 100644 --- a/site/html/about.html +++ b/site/html/about.html @@ -1,175 +1,514 @@ - - - - - - - - - - - - - - + About - NOSK - Nepal Open Source Klub + + + + + + + + + + - - - - - + + + - - - - - - - NOSK - Nepal Open Source Klub - - -
- - -
- - - - - -
- -
-
-
-

- NOSK - Nepal Open Source Klub is a group of like-minded people who work to raise awareness and adoption of FOSS( Free and Open Source Software) in Nepal. - We being at the club aim to educate and train people of different domains of technology by organizing different events and sessions time and often. -

- -

NOSK was founded by Nitesh Rijal, a great admirer and promoter of FOSS, On 28th Feburary 2008, formerly as the NCIT Open Source Klub. -

-
-
- Image with a text Open -
-
-
- -
-

Our Objectives

- - -
- -
-

Open For All

-

- NOSK is open to everyone who want to be a part of it. Anyone can contribute and educate people about technology and any technical stuff which - supports FOSS through the NOSK. Being an Open Source Club, we strongly support and promote Free and Open Source. Anyone with interest can be a part - of our open source software development which can be done through GitHub. -

-
- -
-

Promotion of Open Source and Free Softwares

-

- Being an Open Source club, we want everyone to learn about Open Source, know its benefit and help them learn using Free and Open Souce softwares. To - achieve this, we organize various talks and workshops frequently. -

- -

- Free Software comes from free software movement started in 1983 by computer scientist Richard M Stallman, when he launched a project called GNU which stands for GNU is Not Unix, to provide a replacement for the UNIX operating system - a replacement that would respect the freedoms of those using it. More precisely, free software means users of a program have the four essential freedoms. - -

Open Source is a term that originally referred to open source software (OSS). Open source software is code that is designed to be publicly accessible—anyone can see, modify, and distribute the code as they see fit. Also it doesn't just mean access to source code. The distribution terms of open-source software must comply with the given ten criteria. - -

The main diffrence between free and open source is that free software is a social movement but the open source is a development pattern. -

-
- -
-

Find Us Here

- -
- +
+
+
+
+

About NOSK

+

NOSK - Nepal Open Source Klub is a group of like-minded people who work to raise awareness and adoption of FOSS (Free and Open Source Software) in Nepal.

+

We at the club aim to educate and train people of different domains of technology by organizing different events and sessions regularly.

+

NOSK was founded by Nitesh Rijal, a great admirer and promoter of FOSS, on 28th February 2008, formerly as the NCIT Open Source Klub.

+
+
+ +
+
+
+ +
+
+
+

Our Objectives

+
    +
  • Promote Open Source Culture
  • +
  • Help the people to adopt FOSS
  • +
  • Provide Workshop on various Open Source Tool and Technology
  • +
  • Build a strong community of FOSS enthusiasts
  • +
  • Foster innovation through collaborative development
  • +
+
+ +
+

Open For All

+

NOSK is open to everyone who wants to be a part of it. Anyone can contribute and educate people about technology and any technical stuff which supports FOSS through the NOSK.

+

Being an Open Source Club, we strongly support and promote Free and Open Source. Anyone with interest can be a part of our open source software development which can be done through GitHub.

+
+ +
+

Promotion of Open Source and Free Software

+

Being an Open Source club, we want everyone to learn about Open Source, know its benefit and help them learn using Free and Open Source software. To achieve this, we organize various talks and workshops frequently.

+ +

Free Software comes from free software movement started in 1983 by computer scientist Richard M Stallman, when he launched a project called GNU which stands for GNU is Not Unix, to provide a replacement for the UNIX operating system - a replacement that would respect the freedoms of those using it. More precisely, free software means users of a program have the four essential freedoms.

+ +

Open Source is a term that originally referred to open source software (OSS). Open source software is code that is designed to be publicly accessible—anyone can see, modify, and distribute the code as they see fit. Also it doesn't just mean access to source code. The distribution terms of open-source software must comply with the given ten criteria.

+ +

The main difference between free and open source is that free software is a social movement but the open source is a development pattern.

+
+ + +
+
- - + + + + + + diff --git a/site/html/contact-success.html b/site/html/contact-success.html index 8b12193..024809b 100644 --- a/site/html/contact-success.html +++ b/site/html/contact-success.html @@ -2,14 +2,318 @@ - - Contact Info Submitted -NOSK + Contact Success - NOSK - Nepal Open Source Klub + + + + + + + + + + + + + + + + + + + -
-

The information has been successfully sent to NOSK team.

-

Our team will contact back you soon. Be connected with us. Get back to home page.

-
+
+ +
+ +
+
+
+ +
+

Message Sent Successfully!

+

Thank you for reaching out to the NOSK team. Your information has been successfully received and we will contact you back soon. Stay connected with us!

+ Back to Home +
+
+ + + + \ No newline at end of file diff --git a/site/html/contact.html b/site/html/contact.html index bbc319f..11f3450 100644 --- a/site/html/contact.html +++ b/site/html/contact.html @@ -3,109 +3,407 @@ - - - - - - - - - - - - + Contact - NOSK - Nepal Open Source Klub + + + + + + + + + + - - - - - + + + - - - - - - - NOSK - Nepal Open Source Klub - - -
- - -
- - - + +
+
+
+ +
+
+

Have a question or want to collaborate?

+

We'd love to hear from you! Send us a message and we'll get back to you as soon as possible. You can also reach out to us via email at nosk@ncit.edu.np

+ +

Feel free to connect with us on social media for the latest updates and community discussions!

+ + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+
+
+
+ + - -
- -

Contact us

- -

- Do you have any questions? - You can reach out to us via mail at nosk@ncit.edu.np -

+ + // Go To Top Button + const goToTopBtn = document.getElementById("goToTopBtn"); + if (goToTopBtn) { + window.onscroll = () => { + if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) { + goToTopBtn.style.display = "block"; + } else { + goToTopBtn.style.display = "none"; + } + }; + goToTopBtn.addEventListener('click', () => { + window.scrollTo({ top: 0, behavior: 'smooth' }); + }); + } + }); + diff --git a/site/html/events.html b/site/html/events.html index 68085a5..0aadcad 100644 --- a/site/html/events.html +++ b/site/html/events.html @@ -1,133 +1,740 @@ - - - - - - - - - - - - - - - - - - - - - - - - NOSK - Events - - -
- -
+
+ + + + + + + + diff --git a/site/html/gallery.html b/site/html/gallery.html index b3f2107..9249f60 100644 --- a/site/html/gallery.html +++ b/site/html/gallery.html @@ -1,155 +1,523 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NOSK - Nepal Open Source Klub + + + Gallery - NOSK - Nepal Open Source Klub + + + + + + + + + + + + + + + + + + + - -
- - - +
- - - - - -
- -
- -
-
- - - - - - + + +
- - - - - - + + + + + - diff --git a/site/images/about.png b/site/images/about.png new file mode 100644 index 0000000..864b4c7 Binary files /dev/null and b/site/images/about.png differ diff --git a/site/images/gallery/Git_Github/1750084946572.jpg b/site/images/gallery/Git_Github/1750084946572.jpg new file mode 100644 index 0000000..3477bd9 Binary files /dev/null and b/site/images/gallery/Git_Github/1750084946572.jpg differ diff --git a/site/images/gallery/Git_Github/1750084946740.jpg b/site/images/gallery/Git_Github/1750084946740.jpg new file mode 100644 index 0000000..39cf557 Binary files /dev/null and b/site/images/gallery/Git_Github/1750084946740.jpg differ diff --git a/site/images/gallery/Git_Github/501749374_1301263925341800_305214165642736784_n.jpg b/site/images/gallery/Git_Github/501749374_1301263925341800_305214165642736784_n.jpg new file mode 100644 index 0000000..ae6a33f Binary files /dev/null and b/site/images/gallery/Git_Github/501749374_1301263925341800_305214165642736784_n.jpg differ diff --git a/site/images/gallery/Git_Github/501820129_1301263915341801_5012545509489802074_n.jpg b/site/images/gallery/Git_Github/501820129_1301263915341801_5012545509489802074_n.jpg new file mode 100644 index 0000000..c561d84 Binary files /dev/null and b/site/images/gallery/Git_Github/501820129_1301263915341801_5012545509489802074_n.jpg differ diff --git a/site/images/gallery/Git_Github/ca.jpg b/site/images/gallery/Git_Github/ca.jpg new file mode 100644 index 0000000..467ba58 Binary files /dev/null and b/site/images/gallery/Git_Github/ca.jpg differ diff --git a/site/images/gallery/Git_Github/sikairako.png b/site/images/gallery/Git_Github/sikairako.png new file mode 100644 index 0000000..b4ca137 Binary files /dev/null and b/site/images/gallery/Git_Github/sikairako.png differ diff --git a/site/images/sfd-1.png b/site/images/sfd-1.png new file mode 100644 index 0000000..913b953 Binary files /dev/null and b/site/images/sfd-1.png differ diff --git a/site/js/event.js b/site/js/event.js index 5b02a96..569c680 100644 --- a/site/js/event.js +++ b/site/js/event.js @@ -4,171 +4,213 @@ let date = new Date(); let today_month = date.getMonth(); let today_date = date.getDate(); let today_year = date.getFullYear(); -let curr_hour = date.getHours(); -const eventsPerPage = 6; -let currentPage = 1; -let totalPages = 1; let allEvents = []; - -/* Create a container for pagination controls */ -const paginationContainer = document.createElement("div"); -paginationContainer.classList.add( - "pagination-container", - "text-center", - "fixed-bottom", - "mb-2" -); - -/* Previous button */ -const prevButton = document.createElement("button"); -prevButton.innerText = "Previous"; -prevButton.classList.add("btn", "btn-primary", "mx-2"); -prevButton.disabled = true; -prevButton.addEventListener("click", () => { - if (currentPage > 1) { - currentPage--; - renderEvents(); - updatePaginationButtons(); - } -}); - -/* Next button */ -const nextButton = document.createElement("button"); -nextButton.innerText = "Next"; -nextButton.classList.add("btn", "btn-primary", "mx-2"); -nextButton.addEventListener("click", () => { - if (currentPage < totalPages) { - currentPage++; - renderEvents(); - updatePaginationButtons(); +let currentPage = 1; +const eventsPerPage = 5; + +// Load events from JSON file +async function loadEvents() { + console.log('Loading events...'); + + // Try multiple paths + const paths = [ + '../../events.json', + '/events.json', + './events.json', + '../events.json' + ]; + + for (const path of paths) { + try { + console.log(`Trying to fetch from: ${path}`); + const response = await fetch(path); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const events = await response.json(); + console.log(`Successfully loaded ${events.length} events from ${path}`); + allEvents = events; + renderEvents(); + renderPagination(); + return; // Success, exit function + } catch (error) { + console.error(`Failed to load from ${path}:`, error); + } } -}); - -/* Append pagination controls */ -paginationContainer.appendChild(prevButton); -paginationContainer.appendChild(nextButton); -document.body.appendChild(paginationContainer); - -/* Fetch event data from the JSON file */ -fetch("/events.json") - .then((data) => data.json()) - .then((data) => { - allEvents = data; - totalPages = Math.ceil(allEvents.length / eventsPerPage); - renderEvents(); - updatePaginationButtons(); - }); + + // If all paths failed + console.error('All fetch attempts failed'); + events_div.innerHTML = '

Error loading events. Please check the console for details.

'; +} -/* Render events based on the current page */ +// Render events with pagination function renderEvents() { events_div.innerHTML = ""; - const eventGrid = document.createElement("div"); - eventGrid.classList.add("event-grid"); - const start = (currentPage - 1) * eventsPerPage; - const end = start + eventsPerPage; - const paginatedEvents = allEvents.slice(start, end); + // Calculate pagination + const startIndex = (currentPage - 1) * eventsPerPage; + const endIndex = startIndex + eventsPerPage; + const eventsToShow = allEvents.slice(startIndex, endIndex); // Loop through and display each event - paginatedEvents.forEach((elt) => { - const container = document.createElement("div"); - container.classList.add("event-container", "d-flex", "align-items-start"); + eventsToShow.forEach((elt) => { + const eventCard = document.createElement("div"); + eventCard.classList.add("event-card"); + + // Create event content + const eventContent = document.createElement("div"); + eventContent.classList.add("event-content"); - const details = document.createElement("div"); - details.classList.add("event-details", "ml-3"); + // Event title + const title = document.createElement("h3"); + title.innerText = elt.Title; - const title = document.createElement("a"); - const status = document.createElement("span"); - const guest = document.createElement("p"); + // Event meta information + const eventMeta = document.createElement("div"); + eventMeta.classList.add("event-meta"); const start_detail = elt.Date.split("-"); - const start_time = elt.Time.split(":"); + const dateSpan = document.createElement("span"); + dateSpan.innerHTML = ` ${start_detail[0]}/${start_detail[1]}/${start_detail[2]}`; + + const timeSpan = document.createElement("span"); + timeSpan.innerHTML = ` ${elt.Time}`; + + eventMeta.appendChild(dateSpan); + eventMeta.appendChild(timeSpan); + + // Event speakers + const speakers = document.createElement("div"); + speakers.classList.add("event-speakers"); + speakers.innerHTML = `Speakers: ${elt.By.join(", ")}`; + + // Event actions + const eventActions = document.createElement("div"); + eventActions.classList.add("event-actions"); // Determine the event status - var event_status = "Completed"; - if (today_year < start_detail[2]) event_status = "Registration Open"; + var event_status = "completed"; + if (today_year < start_detail[2]) event_status = "upcoming"; else if (today_year == start_detail[2] && today_month + 1 < start_detail[1]) - event_status = "Registration Open"; + event_status = "upcoming"; else if (today_year == start_detail[2] && today_month + 1 == start_detail[1] && today_date <= start_detail[0]) - event_status = "Registration Open"; - - // Apply CSS class based on event status - if (event_status === "Completed") { - status.classList.add("event-status", "completed"); - } else if (event_status === "Registration Open") { - status.classList.add("event-status", "registration-open"); + event_status = "upcoming"; + + // Create appropriate buttons based on event status + if (event_status !== "completed") { + if (elt.URL) { + const registerBtn = document.createElement("a"); + registerBtn.href = elt.URL; + registerBtn.target = "_blank"; + registerBtn.classList.add("event-btn", "primary"); + registerBtn.innerHTML = ` Register Now`; + eventActions.appendChild(registerBtn); + } + } else { + if (elt.IMGURL) { + const galleryBtn = document.createElement("a"); + galleryBtn.href = elt.IMGURL; + galleryBtn.classList.add("event-btn", "secondary"); + galleryBtn.innerHTML = ` View Gallery`; + eventActions.appendChild(galleryBtn); + } } - // If event is not complete, refer to registration for the event - // otherwise, refer to the gallery section of the corresponding event - if (event_status !== "Completed") { - title.href = elt.URL; - } else { - if (elt.IMGURL) title.href = elt.IMGURL; - else title.href = elt.URL; + if (elt.URL && event_status === "completed") { + const detailsBtn = document.createElement("a"); + detailsBtn.href = elt.URL; + detailsBtn.target = "_blank"; + detailsBtn.classList.add("event-btn", "secondary"); + detailsBtn.innerHTML = ` Details`; + eventActions.appendChild(detailsBtn); } - title.innerText = elt.Title; - title.classList.add("event-title"); - status.innerText = event_status; - guest.innerText = "By: "; - guest.classList.add("event-guest"); - - elt.By.forEach((collaborator, index) => { - const profileLink = document.createElement("a"); - profileLink.href = elt.ProfileLink[index] || "#"; - profileLink.innerText = collaborator; - profileLink.target = "_blank"; - profileLink.classList.add("profile-link"); - - guest.appendChild(profileLink); - - if (index < elt.By.length - 1) { - guest.appendChild(document.createTextNode(", ")); - } - }); + // Assemble event content + eventContent.appendChild(title); + eventContent.appendChild(eventMeta); + eventContent.appendChild(speakers); + eventContent.appendChild(eventActions); - container.appendChild(title); - container.appendChild(status); - container.appendChild(guest); - events_div.appendChild(container); - }); + // Assemble event card + eventCard.appendChild(eventContent); - events_div.appendChild(eventGrid); + events_div.appendChild(eventCard); + }); } -/* Update pagination buttons */ -function updatePaginationButtons() { - // Clear the old page buttons (Previous, Page Numbers, Next) - paginationContainer.innerHTML = ""; - - // Handle Previous button - prevButton.disabled = currentPage === 1; - paginationContainer.appendChild(prevButton); +// Render pagination controls +function renderPagination() { + const totalPages = Math.ceil(allEvents.length / eventsPerPage); + + // Remove existing pagination if any + let existingPagination = document.querySelector('.pagination-container'); + if (existingPagination) { + existingPagination.remove(); + } + + // Don't show pagination if there's only one page or no events + if (totalPages <= 1) { + return; + } + + const paginationContainer = document.createElement("div"); + paginationContainer.classList.add("pagination-container"); + + const pagination = document.createElement("div"); + pagination.classList.add("pagination"); + + // Previous button + const prevBtn = document.createElement("button"); + prevBtn.innerHTML = `<`; + prevBtn.disabled = currentPage === 1; + prevBtn.addEventListener('click', () => { + if (currentPage > 1) { + currentPage--; + renderEvents(); + renderPagination(); + window.scrollTo({ top: 0, behavior: 'smooth' }); + } + }); + pagination.appendChild(prevBtn); - // Create numbered page buttons + // Page numbers for (let i = 1; i <= totalPages; i++) { - const pageButton = document.createElement("button"); - pageButton.innerText = i; - pageButton.classList.add("btn", "mx-1"); - - // Highlight the current page button + const pageBtn = document.createElement("button"); + pageBtn.innerText = i; if (i === currentPage) { - pageButton.classList.add("btn-primary"); - } else { - pageButton.classList.add("btn-light"); + pageBtn.classList.add("active"); } - - pageButton.addEventListener("click", () => { + pageBtn.addEventListener('click', () => { currentPage = i; renderEvents(); - updatePaginationButtons(); + renderPagination(); + window.scrollTo({ top: 0, behavior: 'smooth' }); }); - paginationContainer.appendChild(pageButton); + pagination.appendChild(pageBtn); } - // Handle Next button - nextButton.disabled = currentPage === totalPages; - paginationContainer.appendChild(nextButton); + // Next button + const nextBtn = document.createElement("button"); + nextBtn.innerHTML = `>`; + nextBtn.disabled = currentPage === totalPages; + nextBtn.addEventListener('click', () => { + if (currentPage < totalPages) { + currentPage++; + renderEvents(); + renderPagination(); + window.scrollTo({ top: 0, behavior: 'smooth' }); + } + }); + pagination.appendChild(nextBtn); + + paginationContainer.appendChild(pagination); + + // Add pagination after events + events_div.parentNode.appendChild(paginationContainer); } + +// Load events when page loads +document.addEventListener('DOMContentLoaded', loadEvents);