PageSourceSearch

https://williamcharlesconstruction.com/commonScript/script_common.js

js williamcharlesconstruction.com collected 2026-10-08 11:54:37 UTC 6,494 bytes, 166 lines download raw bytes

1(function () {
2  const sliderWrappers = document.querySelectorAll('.slider-wrapper');
3  const accordion = document.querySelectorAll('.accordian-Custom-design');
4   const slider_image_swiper = document.querySelectorAll('.image-gallery-section');
5  
6   if(sliderWrappers) {
7    sliderWrappers.forEach(wrapper => {
8      const slider = wrapper.querySelector('.slider-container');
9      const slides = slider.querySelectorAll('.slide');
10      const prevBtn = wrapper.querySelector('.slider-prev');
11      const nextBtn = wrapper.querySelector('.slider-next');
12 
13      const attr = slider.getAttribute('data-custom-attr');
14      const match = attr ? attr.match(/previewSlides_(\d+)/) : null;
15      let slidesPerView = match ? parseInt(match[1]) : 3;
16      const gapRem = 1.5;
17      let isMobileView = false;
18 
19      function updateSlideWidths() {
20        const totalGap = gapRem * (slidesPerView - 1);
21        const width = window.innerWidth;
22        const sliderNavs = document.querySelectorAll('.slider-nav');
23       
24        if (width < 576) {
25          isMobileView = true;
26          slides.forEach(slide => {
27            slide.style.flex = `0 0 calc(60% + 0rem)`;
28          });
29          if (sliderNavs) {
30            const newWidth = Math.max(0, width - 25);
31            sliderNavs.forEach(sliderNav => {
32              sliderNav.setAttribute('style', `width: ${newWidth}px;`);
33            })
34          }
35        }
36        else {
37          isMobileView = false;
38          slides.forEach(slide => {
39            slide.style.flex = `0 0 calc((100% - ${totalGap}rem) / ${slidesPerView})`;
40          });
41          if (sliderNavs) {
42            sliderNavs.forEach(sliderNav => {
43              sliderNav.setAttribute('style', `width: 100%;`);
44            })
45          }
46        }
47      }
48 
49      function slideLeft() {
50        if (isMobileView) {
51          // For mobile, scroll by one slide's width plus gap
52          const slideWidth = slider.querySelector('.slide').offsetWidth;
53          slider.scrollLeft -= slideWidth + (gapRem * parseFloat(getComputedStyle(document.documentElement).fontSize));
54        } else {
55          slider.scrollLeft -= slider.offsetWidth / slidesPerView;
56        }
57      }
58 
59      function slideRight() {
60        if (isMobileView) {
61          // For mobile, scroll by one slide's width plus gap
62          const slideWidth = slider.querySelector('.slide').offsetWidth;
63          slider.scrollLeft += slideWidth + (gapRem * parseFloat(getComputedStyle(document.documentElement).fontSize));
64        } else {
65          slider.scrollLeft += slider.offsetWidth / slidesPerView;
66        }
67      }
68 
69      if (prevBtn) prevBtn.addEventListener('click', slideLeft);
70      if (nextBtn) nextBtn.addEventListener('click', slideRight);
71 
72      updateSlideWidths();
73      window.addEventListener('resize', updateSlideWidths);
74    });
75  }
76  
77  
78   if(accordion){
79     
80  var acc = document.getElementsByClassName("accordion");
81  var i;
82 
83  for (i = 0; i < acc.length; i++) {
84    acc[i].addEventListener("click", function() {
85      this.classList.toggle("active");
86      var panel = this.nextElementSibling;
87      if (panel.style.display === "block") {
88        panel.style.display = "none";
89      } else {
90        panel.style.display = "block";
91      }
92    });
93  }
94 
95   }
96  
97  // images swiper slider
98 
99  if(slider_image_swiper){
100      const mainImage = document.getElementById("mainImage");
101      const thumbnails = document.querySelectorAll(".thumbnail");
102 
103      if (thumbnails.length > 0) {
104        mainImage.src = thumbnails[0].src;
105        thumbnails[0].classList.add("active-thumbnail");
106      }
107 
108      thumbnails.forEach(thumbnail => {
109        thumbnail.addEventListener("click", function () {
110          mainImage.src = this.src;
111          setActiveThumbnail(this);
112        });
113      });
114 
115      // Set active thumbnail style
116      function setActiveThumbnail(activeThumb) {
117        const thumbnails = document.querySelectorAll(".thumbnail");
118      thumbnails.forEach(element => {
119        element.classList.remove("active-thumbnail");
120      });
121        activeThumb.classList.add("active-thumbnail");
122      }
123    }
124
125    
126window.addEventListener('load', function () {
127  function updateMetaIfExists(selector, attrName, attrValue, content) {
128    if (!content) return; // Do nothing if no content
129
130    // Remove all existing matching tags
131    document.head.querySelectorAll(selector).forEach(tag => tag.remove());
132
133    // Create a new meta tag with existing content
134    const tag = document.createElement('meta');
135    tag.setAttribute(attrName, attrValue);
136    tag.setAttribute('content', content);
137    document.head.appendChild(tag);
138  } 
139
140  // Get existing meta content (do nothing if not present)
141  const titleMeta = document.querySelector('meta[name="page-title-document"]')?.content;
142  const descriptionMeta = document.querySelector('meta[name="page-description-document"]')?.content;
143  const keywordsMeta = document.querySelector('meta[name="page-keywords-document"]')?.content;
144  const ogTitleMeta = document.querySelector('meta[property="og:title"]')?.content;
145  const ogDescriptionMeta = document.querySelector('meta[property="og:description"]')?.content;
146  const ogImageMeta = document.querySelector('meta[property="og:image"]')?.content;
147  const ogUrlMeta = document.querySelector('meta[property="og:url"]')?.content;
148  const ogTypeMeta = document.querySelector('meta[property="og:type"]')?.content;
149
150  // Update page title only if exists
151  if (titleMeta) document.title = titleMeta;
152
153  // Standard Meta
154  updateMetaIfExists('meta[name="page-title-document"]', 'name', 'page-title-document', titleMeta);
155  updateMetaIfExists('meta[name="page-description-document"]', 'name', 'page-description-document', descriptionMeta);
156  updateMetaIfExists('meta[name="page-keywords-document"]', 'name', 'page-keywords-document', keywordsMeta);
157
158  // Open Graph
159  updateMetaIfExists('meta[property="og:title"]', 'property', 'og:title', ogTitleMeta);
160  updateMetaIfExists('meta[property="og:description"]', 'property', 'og:description', ogDescriptionMeta);
161  updateMetaIfExists('meta[property="og:image"]', 'property', 'og:image', ogImageMeta);
162  updateMetaIfExists('meta[property="og:url"]', 'property', 'og:url', ogUrlMeta);
163  updateMetaIfExists('meta[property="og:type"]', 'property', 'og:type', ogTypeMeta);
164});
165
166})();

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.