/** * Template Name: Eterna - v4.7.1 * Template URL: https://bootstrapmade.com/eterna-free-multipurpose-bootstrap-template/ * Author: BootstrapMade.com * License: https://bootstrapmade.com/license/ */ (function() { "use strict"; /** * Easy selector helper function */ const select = (el, all = false) => { el = el.trim() if (all) { return [...document.querySelectorAll(el)] } else { return document.querySelector(el) } } /** * Easy event listener function */ const on = (type, el, listener, all = false) => { let selectEl = select(el, all) if (selectEl) { if (all) { selectEl.forEach(e => e.addEventListener(type, listener)) } else { selectEl.addEventListener(type, listener) } } } /** * Easy on scroll event listener */ const onscroll = (el, listener) => { el.addEventListener('scroll', listener) } /** * Scrolls to an element with header offset */ const scrollto = (el) => { let header = select('#header') let offset = header.offsetHeight if (!header.classList.contains('header-scrolled')) { offset -= 16 } let elementPos = select(el).offsetTop window.scrollTo({ top: elementPos - offset, behavior: 'smooth' }) } /** * Header fixed top on scroll */ let selectHeader = select('#header') if (selectHeader) { let headerOffset = selectHeader.offsetTop let nextElement = selectHeader.nextElementSibling const headerFixed = () => { if ((headerOffset - window.scrollY) <= 0) { selectHeader.classList.add('fixed-top') nextElement.classList.add('scrolled-offset') } else { selectHeader.classList.remove('fixed-top') nextElement.classList.remove('scrolled-offset') } } window.addEventListener('load', headerFixed) onscroll(document, headerFixed) } /** * Back to top button */ let backtotop = select('.back-to-top') if (backtotop) { const toggleBacktotop = () => { if (window.scrollY > 100) { backtotop.classList.add('active') } else { backtotop.classList.remove('active') } } window.addEventListener('load', toggleBacktotop) onscroll(document, toggleBacktotop) } /** * Mobile nav toggle */ on('click', '.mobile-nav-toggle', function(e) { select('#navbar').classList.toggle('navbar-mobile') this.classList.toggle('bi-list') this.classList.toggle('bi-x') }) /** * Mobile nav dropdowns activate */ on('click', '.navbar .dropdown > a', function(e) { if (select('#navbar').classList.contains('navbar-mobile')) { e.preventDefault() this.nextElementSibling.classList.toggle('dropdown-active') } }, true) /** * Scrool with ofset on links with a class name .scrollto */ on('click', '.scrollto', function(e) { if (select(this.hash)) { e.preventDefault() let navbar = select('#navbar') if (navbar.classList.contains('navbar-mobile')) { navbar.classList.remove('navbar-mobile') let navbarToggle = select('.mobile-nav-toggle') navbarToggle.classList.toggle('bi-list') navbarToggle.classList.toggle('bi-x') } scrollto(this.hash) } }, true) /** * Scroll with ofset on page load with hash links in the url */ window.addEventListener('load', () => { if (window.location.hash) { if (select(window.location.hash)) { scrollto(window.location.hash) } } }); /** * Hero carousel indicators */ let heroCarouselIndicators = select("#hero-carousel-indicators") let heroCarouselItems = select('#heroCarousel .carousel-item', true) heroCarouselItems.forEach((item, index) => { (index === 0) ? heroCarouselIndicators.innerHTML += "
": heroCarouselIndicators.innerHTML += "" }); /** * Clients Slider */ new Swiper('.clients-slider', { speed: 400, loop: true, autoplay: { delay: 5000, disableOnInteraction: false }, slidesPerView: 'auto', pagination: { el: '.swiper-pagination', type: 'bullets', clickable: true }, breakpoints: { 320: { slidesPerView: 2, spaceBetween: 40 }, 480: { slidesPerView: 3, spaceBetween: 60 }, 640: { slidesPerView: 4, spaceBetween: 80 }, 992: { slidesPerView: 6, spaceBetween: 120 } } }); /** * Skills animation */ let skilsContent = select('.skills-content'); if (skilsContent) { new Waypoint({ element: skilsContent, offset: '80%', handler: function(direction) { let progress = select('.progress .progress-bar', true); progress.forEach((el) => { el.style.width = el.getAttribute('aria-valuenow') + '%' }); } }) } /** * Porfolio isotope and filter */ window.addEventListener('load', () => { let portfolioContainer = select('.portfolio-container'); if (portfolioContainer) { let portfolioIsotope = new Isotope(portfolioContainer, { itemSelector: '.portfolio-item', layoutMode: 'fitRows' }); let portfolioFilters = select('#portfolio-flters li', true); on('click', '#portfolio-flters li', function(e) { e.preventDefault(); portfolioFilters.forEach(function(el) { el.classList.remove('filter-active'); }); this.classList.add('filter-active'); portfolioIsotope.arrange({ filter: this.getAttribute('data-filter') }); }, true); } }); /** * Initiate portfolio lightbox */ const portfolioLightbox = GLightbox({ selector: '.portfolio-lightbox' }); /** * Portfolio details slider */ new Swiper('.portfolio-details-slider', { speed: 400, loop: true, autoplay: { delay: 5000, disableOnInteraction: false }, pagination: { el: '.swiper-pagination', type: 'bullets', clickable: true } }); })(); //check the console for date click event //Fixed day highlight //Added previous month and next month view function CalendarControl() { const calendar = new Date(); const calendarControl = { localDate: new Date(), prevMonthLastDate: null, calWeekDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], calMonthName: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], daysInMonth: function (month, year) { return new Date(year, month, 0).getDate(); }, firstDay: function () { return new Date(calendar.getFullYear(), calendar.getMonth(), 1); }, lastDay: function () { return new Date(calendar.getFullYear(), calendar.getMonth() + 1, 0); }, firstDayNumber: function () { return calendarControl.firstDay().getDay() + 1; }, lastDayNumber: function () { return calendarControl.lastDay().getDay() + 1; }, getPreviousMonthLastDate: function () { let lastDate = new Date( calendar.getFullYear(), calendar.getMonth(), 0 ).getDate(); return lastDate; }, navigateToPreviousMonth: function () { calendar.setMonth(calendar.getMonth() - 1); calendarControl.attachEventsOnNextPrev(); }, navigateToNextMonth: function () { calendar.setMonth(calendar.getMonth() + 1); calendarControl.attachEventsOnNextPrev(); }, navigateToCurrentMonth: function () { let currentMonth = calendarControl.localDate.getMonth(); let currentYear = calendarControl.localDate.getFullYear(); calendar.setMonth(currentMonth); calendar.setYear(currentYear); calendarControl.attachEventsOnNextPrev(); }, displayYear: function () { let yearLabel = document.querySelector(".calendar .calendar-year-label"); yearLabel.innerHTML = calendar.getFullYear(); }, displayMonth: function () { let monthLabel = document.querySelector( ".calendar .calendar-month-label" ); monthLabel.innerHTML = calendarControl.calMonthName[calendar.getMonth()]; }, selectDate: function (e) { console.log( `${e.target.textContent} ${ calendarControl.calMonthName[calendar.getMonth()] } ${calendar.getFullYear()}` ); }, plotSelectors: function () { document.querySelector( ".calendar" ).innerHTML += `