1(function() { 2 "use strict"; 3 4 /** 5 * Easy selector helper function 6 */ 7 const select = (el, all = false) => { 8 el = el.trim() 9 if (all) { 10 return [...document.querySelectorAll(el)] 11 } else { 12 return document.querySelector(el) 13 } 14 } 15 16 /** 17 * Easy event listener function 18 */ 19 const on = (type, el, listener, all = false) => { 20 let selectEl = select(el, all) 21 if (selectEl) { 22 if (all) { 23 selectEl.forEach(e => e.addEventListener(type, listener)) 24 } else { 25 selectEl.addEventListener(type, listener) 26 } 27 } 28 } 29 30 /** 31 * Easy on scroll event listener 32 */ 33 const onscroll = (el, listener) => { 34 el.addEventListener('scroll', listener) 35 } 36 37 /** 38 * Navbar links active state on scroll 39 */ 40 let navbarlinks = select('#navbar .scrollto', true) 41 const navbarlinksActive = () => { 42 let position = window.scrollY + 200 43 navbarlinks.forEach(navbarlink => { 44 if (!navbarlink.hash) return 45 let section = select(navbarlink.hash) 46 if (!section) return 47 if (position >= section.offsetTop && position <= (section.offsetTop + section.offsetHeight)) { 48 navbarlink.classList.add('active') 49 } else { 50 navbarlink.classList.remove('active') 51 } 52 }) 53 } 54 window.addEventListener('load', navbarlinksActive) 55 onscroll(document, navbarlinksActive) 56 57 /** 58 * Scrolls to an element with header offset 59 */ 60 const scrollto = (el) => { 61 let header = select('#header') 62 let offset = header.offsetHeight 63 64 let elementPos = select(el).offsetTop 65 window.scrollTo({ 66 top: elementPos - offset, 67 behavior: 'smooth' 68 }) 69 } 70 71 /** 72 * Header fixed top on scroll 73 */ 74 let selectHeader = select('#header') 75 if (selectHeader) { 76 let headerOffset = selectHeader.offsetTop 77 let nextElement = selectHeader.nextElementSibling 78 const headerFixed = () => { 79 if ((headerOffset - window.scrollY) <= 0) { 80 selectHeader.classList.add('fixed-top') 81 nextElement.classList.add('scrolled-offset') 82 } else { 83 selectHeader.classList.remove('fixed-top') 84 nextElement.classList.remove('scrolled-offset') 85 } 86 } 87 window.addEventListener('load', headerFixed) 88 onscroll(document, headerFixed) 89 } 90 91 /** 92 * Hero carousel indicators 93 */ 94 let heroCarouselIndicators = select("#hero-carousel-indicators") 95 let heroCarouselItems = select('#heroCarousel .carousel-item', true) 96 97 heroCarouselItems.forEach((item, index) => { 98 (index === 0) ? 99 heroCarouselIndicators.innerHTML += "<li data-bs-target='#heroCarousel' data-bs-slide-to='" + index + "' class='active'></li>": 100 heroCarouselIndicators.innerHTML += "<li data-bs-target='#heroCarousel' data-bs-slide-to='" + index + "'></li>" 101 }); 102 103 /** 104 * Back to top button 105 */ 106 let backtotop = select('.back-to-top') 107 if (backtotop) { 108 const toggleBacktotop = () => { 109 if (window.scrollY > 100) { 110 backtotop.classList.add('active') 111 } else { 112 backtotop.classList.remove('active') 113 } 114 } 115 window.addEventListener('load', toggleBacktotop) 116 onscroll(document, toggleBacktotop) 117 } 118 119 /** 120 * Mobile nav toggle 121 */ 122 on('click', '.mobile-nav-toggle', function(e) { 123 select('#navbar').classList.toggle('navbar-mobile') 124 this.classList.toggle('bi-list') 125 this.classList.toggle('bi-x') 126 }) 127 128 /** 129 * Mobile nav dropdowns activate 130 */ 131 on('click', '.navbar .dropdown > a', function(e) { 132 if (select('#navbar').classList.contains('navbar-mobile')) { 133 e.preventDefault() 134 this.nextElementSibling.classList.toggle('dropdown-active') 135 } 136 }, true) 137 138 /** 139 * Scrool with ofset on links with a class name .scrollto 140 */ 141 on('click', '.scrollto', function(e) { 142 if (select(this.hash)) { 143 e.preventDefault() 144 145 let navbar = select('#navbar') 146 if (navbar.classList.contains('navbar-mobile')) { 147 navbar.classList.remove('navbar-mobile') 148 let navbarToggle = select('.mobile-nav-toggle')
149 navbarToggle.classList.toggle('bi-list') 150 navbarToggle.classList.toggle('bi-x') 151 } 152 scrollto(this.hash) 153 } 154 }, true) 155 156 /** 157 * Scroll with ofset on page load with hash links in the url 158 */ 159 window.addEventListener('load', () => { 160 if (window.location.hash) { 161 if (select(window.location.hash)) { 162 scrollto(window.location.hash) 163 } 164 } 165 }); 166 167 /** 168 * Porfolio isotope and filter 169 */ 170 window.addEventListener('load', () => { 171 let portfolioContainer = select('.portfolio-container'); 172 if (portfolioContainer) { 173 let portfolioIsotope = new Isotope(portfolioContainer, { 174 itemSelector: '.portfolio-item', 175 layoutMode: 'fitRows' 176 }); 177 178 let portfolioFilters = select('#portfolio-flters li', true); 179 180 on('click', '#portfolio-flters li', function(e) { 181 e.preventDefault(); 182 portfolioFilters.forEach(function(el) { 183 el.classList.remove('filter-active'); 184 }); 185 this.classList.add('filter-active'); 186 187 portfolioIsotope.arrange({ 188 filter: this.getAttribute('data-filter') 189 }); 190 portfolioIsotope.on('arrangeComplete', function() { 191 AOS.refresh() 192 }); 193 }, true); 194 } 195 196 }); 197 198 /** 199 * Initiate portfolio lightbox 200 */ 201 const portfolioLightbox = GLightbox({ 202 selector: '.portfolio-lightbox' 203 }); 204 205 /** 206 * Portfolio details slider 207 */ 208 new Swiper('.portfolio-details-slider', { 209 speed: 400, 210 autoplay: { 211 delay: 5000, 212 disableOnInteraction: false 213 }, 214 pagination: { 215 el: '.swiper-pagination', 216 type: 'bullets', 217 clickable: true 218 } 219 }); 220 221 /** 222 * Animation on scroll 223 */ 224 window.addEventListener('load', () => { 225 AOS.init({ 226 duration: 1000, 227 easing: "ease-in-out", 228 once: true, 229 mirror: false 230 }); 231 }); 232 233})() 234 235 236 237 238$('#chooseFile').bind('change', function () { 239 var filename = $("#chooseFile").val(); 240 if (/^\s*$/.test(filename)) { 241 $(".file-upload").removeClass('active'); 242 $("#noFile").text("No file chosen..."); 243 } 244 else { 245 $(".file-upload").addClass('active'); 246 $("#noFile").text(filename.replace("C:\\fakepath\\", "")); 247 } 248}); 249
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.