app.js

7.21 KB
14/11/2025 13:07
JS
app.js
// Mobile menu toggle
document.addEventListener('DOMContentLoaded', function() {
  const mobileMenuToggle = document.getElementById('mobile-menu-toggle');
  const mainNav = document.getElementById('main-nav');

  if (mobileMenuToggle && mainNav) {
    mobileMenuToggle.addEventListener('click', function() {
      mainNav.classList.toggle('active');
    });
  }

  // Product tabs
  const tabButtons = document.querySelectorAll('.tab-btn');
  const tabContents = document.querySelectorAll('.tab-content');

  if (tabButtons.length > 0 && tabContents.length > 0) {
    tabButtons.forEach(button => {
      button.addEventListener('click', function() {
        const tabId = this.getAttribute('data-tab');

        // Remove active class from all buttons and contents
        tabButtons.forEach(btn => btn.classList.remove('active'));
        tabContents.forEach(content => content.classList.remove('active'));

        // Add active class to clicked button and corresponding content
        this.classList.add('active');
        const targetContent = document.getElementById(tabId);
        if (targetContent) {
          targetContent.classList.add('active');
        }
      });
    });
  }

  // Product image gallery
  const mainProductImage = document.getElementById('main-product-image');
  const thumbnails = document.querySelectorAll('.thumbnail');

  if (mainProductImage && thumbnails.length > 0) {
    thumbnails.forEach(thumbnail => {
      thumbnail.addEventListener('click', function() {
        // Remove active class from all thumbnails
        thumbnails.forEach(t => t.classList.remove('active'));

        // Add active class to clicked thumbnail
        this.classList.add('active');

        // Change main image source
        const thumbnailSrc = this.getAttribute('src');
        if (thumbnailSrc) {
          mainProductImage.setAttribute('src', thumbnailSrc);
        }
      });
    });
  }

  // Lazy loading for images
  if ('IntersectionObserver' in window) {
    const lazyImages = document.querySelectorAll('img[loading="lazy"]');

    const imageObserver = new IntersectionObserver((entries, observer) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = entry.target;
          img.src = img.dataset.src || img.src;
          img.classList.remove('lazy');
          imageObserver.unobserve(img);
        }
      });
    });

    lazyImages.forEach(img => {
      imageObserver.observe(img);
    });
  }

  // Form validation
  const contactForm = document.querySelector('.contact-form form');

  if (contactForm) {
    contactForm.addEventListener('submit', function(e) {
      e.preventDefault();

      // Basic form validation
      const name = document.getElementById('name').value.trim();
      const email = document.getElementById('email').value.trim();
      const subject = document.getElementById('subject').value;
      const message = document.getElementById('message').value.trim();

      let isValid = true;
      let errorMessage = '';

      if (name === '') {
        isValid = false;
        errorMessage += 'Please enter your name.\n';
      }

      if (email === '') {
        isValid = false;
        errorMessage += 'Please enter your email.\n';
      } else if (!isValidEmail(email)) {
        isValid = false;
        errorMessage += 'Please enter a valid email address.\n';
      }

      if (subject === '') {
        isValid = false;
        errorMessage += 'Please select a subject.\n';
      }

      if (message === '') {
        isValid = false;
        errorMessage += 'Please enter your message.\n';
      }

      if (isValid) {
        // In a real application, you would submit the form to a server
        // For this demo, we'll just show a success message
        const formContainer = document.querySelector('.contact-form');
        formContainer.innerHTML = `
                  <div class="success-message">
                      <h3>Thank you for your message!</h3>
                      <p>We'll get back to you as soon as possible.</p>
                      <button class="btn btn-primary" onclick="location.reload()">Send Another Message</button>
                  </div>
              `;
      } else {
        alert(errorMessage);
      }
    });
  }

  // Newsletter form
  const newsletterForm = document.querySelector('.newsletter form');

  if (newsletterForm) {
    newsletterForm.addEventListener('submit', function(e) {
      e.preventDefault();

      const email = this.querySelector('input[type="email"]').value.trim();

      if (email === '') {
        alert('Please enter your email address.');
        return;
      }

      if (!isValidEmail(email)) {
        alert('Please enter a valid email address.');
        return;
      }

      // In a real application, you would submit the form to a server
      // For this demo, we'll just show a success message
      const formContainer = document.querySelector('.newsletter');
      formContainer.innerHTML = `
              <div class="success-message">
                  <h3>Thank you for subscribing!</h3>
                  <p>You'll receive our latest deals and offers in your inbox.</p>
              </div>
          `;
    });
  }

  // Sort functionality
  const sortSelect = document.getElementById('sort');

  if (sortSelect) {
    sortSelect.addEventListener('change', function() {
      const sortValue = this.value;
      const currentUrl = new URL(window.location);
      currentUrl.searchParams.set('sort', sortValue);
      window.location.href = currentUrl.toString();
    });
  }

  // Filter functionality
  const filterLinks = document.querySelectorAll('.filter-group a');

  if (filterLinks.length > 0) {
    filterLinks.forEach(link => {
      link.addEventListener('click', function(e) {
        e.preventDefault();

        const href = this.getAttribute('href');
        if (href && href !== '#') {
          window.location.href = href;
        }
      });
    });
  }

  // Retailer buttons
  const retailerButtons = document.querySelectorAll('.retailer-btn');

  if (retailerButtons.length > 0) {
    retailerButtons.forEach(button => {
      button.addEventListener('click', function(e) {
        e.preventDefault();

        // In a real application, this would redirect to the retailer's site
        // For this demo, we'll just show an alert
        const retailer = this.getAttribute('data-retailer');
        const price = this.getAttribute('data-price');

        alert(`You would be redirected to ${retailer} to purchase this product for ${price}.`);
      });
    });
  }

  // Load more reviews
  const loadMoreButton = document.querySelector('.load-more button');

  if (loadMoreButton) {
    loadMoreButton.addEventListener('click', function() {
      // In a real application, this would load more reviews from a server
      // For this demo, we'll just show an alert
      alert('In a real application, more reviews would be loaded here.');
    });
  }
});

// Helper function to validate email
function isValidEmail(email) {
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  return emailRegex.test(email);
}

// Function to change main product image
function changeMainImage(src) {
  const mainProductImage = document.getElementById('main-product-image');
  if (mainProductImage && src) {
    mainProductImage.setAttribute('src', src);
  }
}