درباره سالن ماساژ در گرمدره

آموزش و خدمات ماساژ ترنج💆‍♀️🪔🌿
مخصوص بانوان و آقایان
«رهایی از استرس و احساس آرامش و نشاط »
اینستاگرام:
OpenStreetMap contributors' }).addTo(map); L.marker([lat, lon]).addTo(map); }; function updatePagination(totalItems) { if (totalItems > 12) { let totalPages = Math.ceil(totalItems / itemsPerPage); document.querySelector('.current-page').innerText = currentPage; document.querySelector('.total-pages').innerText = totalPages; } else { return; } }; function filterProducts() { let selectedCategory = document.getElementById('category-filter').value; let filteredProducts = selectedCategory === 'all' ? products : products.filter(p => p.CategoryId == selectedCategory); currentPage = 1; updatePagination(filteredProducts.length); renderProducts(filteredProducts.slice(0, itemsPerPage)); }; function renderProducts(products) { let productsList = document.getElementById('products-list'); productsList.innerHTML = ''; products.forEach(item => { let productCardWithDiscount = `

${item.Name}
${item.Name} دسته بندی : ${item.CategoryName}
${new Intl.NumberFormat('fa-IR').format(item.Amount)} تومان ${new Intl.NumberFormat('fa-IR').format(item.Amount - item.Amount * item.DiscountPercent / 100)} تومان
`; let productCardWithoutDiscount = `
${item.Name}
${item.Name} دسته بندی : ${item.CategoryName}
${new Intl.NumberFormat('fa-IR').format(item.Amount)} تومان
`; let productCardWithoutPrice = `
${item.Name}
${item.Name} دسته بندی : ${item.CategoryName}
`; let productCard; if (item.DiscountPercent > 1 && item.Amount > 1) { productCard = productCardWithDiscount; } else if (item.Amount > 1) { productCard = productCardWithoutDiscount; } else { productCard = productCardWithoutPrice; } productsList.innerHTML += productCard; }); document.querySelectorAll('.product-card').forEach(card => { card.addEventListener('click', () => { const productId = card.getAttribute('data-product-id'); const product = products.find(p => p.Id == productId); if (product) { document.getElementById('pro-id').value = product.Id; document.getElementById('ebc-id').value = product.SenderEBCId; document.getElementById('modal-product-name').innerText = product.Name; document.getElementById('modal-category').innerText = `دسته بندی : ${product.CategoryName}`; document.getElementById('modal-description-title').innerText = product.Name; let descriptionBody = product.Body; descriptionBody = descriptionBody.replace(/\r?\n/g, "
"); document.getElementById('modal-description-body').innerHTML = sanitizeHtml(regexToLinkJS(descriptionBody)); const priceBox = document.querySelector('.price-box'); if (product.Amount) { const priceElement = document.getElementById('modal-price'); priceElement.innerText = `${new Intl.NumberFormat('fa-IR').format(product.Amount - product.Amount * product.DiscountPercent / 100)} تومان`; priceBox.style.display = 'flex'; } else { priceBox.style.display = 'none'; } document.getElementById('main-image').src = `https://storage.inoti.com/s1/get/${product.UserId * 2}/EbcProduct/${product.MainImage}`; document.getElementById('modal-image1').src = `https://storage.inoti.com/s1/get/${product.UserId * 2}/EbcProduct/${product.MainImage}`; const imageElements = [ { id: 'modal-image2', src: product.Image2 }, { id: 'modal-image3', src: product.Image3 }, { id: 'modal-image4', src: product.Image4 }, { id: 'modal-image5', src: product.Image5 } ]; imageElements.forEach(img => { const imgElement = document.getElementById(img.id); if (img.src) { const imgUrl = `https://storage.inoti.com/s1/get/${product.UserId * 2}/EbcProduct/${img.src}`; fetch(imgUrl, { method: 'HEAD' }) .then(response => { if (response.ok) { imgElement.src = imgUrl; imgElement.style.display = 'block'; } else { imgElement.style.display = 'none'; } }) .catch(() => { imgElement.style.display = 'none'; }); } else { imgElement.style.display = 'none'; } }); detailModal.classList.remove('hidden'); detailModal.classList.add('visible'); } }); }); }; function changePage(direction) { let selectedCategory = document.getElementById('category-filter').value; let filteredProducts = selectedCategory === 'all' ? products : products.filter(p => p.Id == selectedCategory); let totalPages = Math.ceil(filteredProducts.length / itemsPerPage); if (direction === 'prev' && currentPage > 1) { currentPage--; } else if (direction === 'next' && currentPage < totalPages) { currentPage++; } let start = (currentPage - 1) * itemsPerPage; let end = start + itemsPerPage; renderProducts(filteredProducts.slice(start, end)); updatePagination(filteredProducts.length); }; function sanitizeHtml(html) { const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); return doc.body.innerHTML; } function closeDetailModal() { detailModal.classList.remove('visible'); detailModal.classList.add('hidden'); }; document.addEventListener('DOMContentLoaded', function () { filterProducts(); document.querySelector('#card-modal-mask').addEventListener('click', (e) => { if (e.target === detailModal) { closeDetailModal(); } }); tabs.forEach(tab => { tab.addEventListener('click', () => { tabs.forEach(t => t.classList.remove('active-tab')); tab.classList.add('active-tab'); }); }); document.querySelectorAll('.input').forEach(input => { input.addEventListener('focus', () => input.classList.remove('error-style')); }); window.addEventListener('scroll', () => { let topTab = document.getElementById('topTab'); let screenWidth = window.innerWidth; let scrollTop = window.pageYOffset; let showFixedTab = screenWidth <= 768 ? scrollTop > 300 : scrollTop > 600; topTab.classList.toggle('fix-tab-top', showFixedTab); }); }); let upImage = document.querySelector('.up-image'); let albumImages = document.querySelectorAll('.album-img'); let otherImages = document.querySelector('.other-images'); let rightArrow = document.querySelector('.right-arrow'); let leftArrow = document.querySelector('.left-arrow'); let currentActiveImage = null; albumImages.forEach(img => { img.addEventListener('click', () => { upImage.src = img.src; if (currentActiveImage) { currentActiveImage.classList.remove('active'); } img.classList.add('active'); currentActiveImage = img; }); }); rightArrow.addEventListener('click', () => { otherImages.scrollBy({ left: 200, behavior: 'smooth' }); }); leftArrow.addEventListener('click', () => { otherImages.scrollBy({ left: -200, behavior: 'smooth' }); }); document.addEventListener('DOMContentLoaded', function () { const form = document.getElementById('smsForm'); const form1 = document.getElementById('form1'); const reCAPTCHASiteKey = '6LeJDysqAAAAAKfVRzx7qdKwaqs_efmnL9kxHQPW'; const mobileRegex = /^09\d{9}$/; function validateForm(inputs, submitBtn, reCaptchaResponseField, form) { let isValid = true; inputs.forEach(input => { const value = input.value.trim(); if (!value) { input.classList.add('error-style'); input.placeholder = `لطفا ${input.placeholder} را وارد کنید`; isValid = false; } else { input.classList.remove('error-style'); if (input.name === 'Contact.Mobile' || input.name === 'ProductContact.mobile') { if (!mobileRegex.test(value)) { input.classList.add('error-style'); input.value = ''; input.placeholder = '* شماره موبایل وارد شده صحیح نیست'; isValid = false; } } } }); if (isValid) { submitBtn.disabled = true; grecaptcha.ready(function () { grecaptcha.execute(reCAPTCHASiteKey, { action: 'submit' }).then(function (token) { reCaptchaResponseField.value = token; form.submit(); }).catch(function (error) { console.error('خطا در اجرای reCAPTCHA:', error); submitBtn.disabled = false; }); }); } return isValid; } form.addEventListener('submit', function (e) { e.preventDefault(); const inputs = form.querySelectorAll('.input'); const submitBtn = form.querySelector('button[type="submit"]'); const reCaptchaResponseField = document.getElementById('g-recaptcha-response'); validateForm(inputs, submitBtn, reCaptchaResponseField, form); }); form1.addEventListener('submit', function (e) { e.preventDefault(); const inputs = form1.querySelectorAll('.input'); const submitBtn1 = form1.querySelector('button[type="submit"]'); const reCaptchaResponseField1 = document.getElementById('g-recaptcha-response1'); validateForm(inputs, submitBtn1, reCaptchaResponseField1, form1); }); }); function checkNumber(e) { const isNumeric = /^-?\d*\.?\d*$/.test(e.value); if (!isNumeric) { e.value = ''; } } function regexToLinkJS(txt) { const regex = /(?(https?:\/\/|www\.|T\.me)[a-zA-Z0-9~!@#$%^&*()_\-=+\\/?.:;'",]+)/gi; const links = []; txt = txt.replace(regex, (match) => { if (links.includes(match)) return match; links.push(match); const href = match.startsWith('http') ? match : 'http://' + match; return `${match}`; }); return txt; } function goToNeshan(e) { e.currentTarget.href = generateNeshanLink(); } function detectDevice() { const userAgent = navigator.userAgent; if (userAgent.match(/iPhone|iPad|iPod/i)) { return "iOS"; } else if (userAgent.match(/Android/i)) { return "Android"; } else { return "Other"; } } function generateNeshanLink() { const deviceType = detectDevice(); const coordinates = lat1 + ',' + lon1; switch (deviceType) { case "iOS": return `neshan://?ll=${lat1},${lon1}&fallback=https://nshn.ir/?lat=${lat1}&lng=${lon1}`; case "Android": return `intent://nshn.ir/?lat=${lat1}&lng=${lon1}#Intent;scheme=http;package=org.rajman.neshan.traffic.tehran.navigator;S.browser_fallback_url=https://nshn.ir/?lat=${lat1}&lng=${lon1};end`; default: return "https://neshan.org/maps/@" + coordinates + ",12.3z,0.0p/routing/car/destination/" + coordinates; } } function goToBalad(e) { e.currentTarget.href = `https://balad.ir/directions/driving?destination=${lat1}%2C${lon1}`; }