const urlParams = new URLSearchParams(window.location.search); let lastActivity = parseInt(localStorage.getItem("last_activity")) || 0; let smp_sessionStart = parseInt(localStorage.getItem("session_start")) || 0; let now = 1782972295; if (!smp_sessionStart || now - lastActivity > 30 * 60) { smp_sessionStart = now; localStorage.setItem("session_start", smp_sessionStart); } localStorage.setItem("last_activity", now); var lastMove = 0; var visitorType = 'new'; var visitorId = getVisitorId(); var workspaceId = 3; var privacyType = 3; var hasConsent = getCookie('smp_privacy_consent'); var checkHeatmapId = false; var smpCurrentStep = 0; var smpSteps = document.querySelectorAll('.smp-survey-step'); var smpNextBtn = document.getElementById('smp-next-btn'); var smpPrevBtn = document.getElementById('smp-prev-btn'); var smpSubmitBtn = document.getElementById('smp-submit-btn'); var smpProgressBar = document.getElementById('smp-progress-bar'); var questionState = {}; var survey_id = 0; var smpTracking = { forms: {} }; var currentEl = null; var startTime = 0; var smp_buffer = []; var smp_segments = 100; var smp_scroll = []; var smp_ticking = false; var isSubmitting = false; (function($) { if (urlParams.get('heatmap_preview') === '1') { const params = new URLSearchParams(window.location.search); document.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); }, true); document.addEventListener('submit', function (e) { e.preventDefault(); }, true); document.addEventListener('input', function (e) { e.stopPropagation(); }, true); document.addEventListener('focus', function (e) { e.preventDefault(); }, true); document.body.style.userSelect = 'none'; return; } _checkHeatmapId(); if (privacyType === 1 || hasConsent == 'accept') { document.addEventListener("DOMContentLoaded", function() { fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/collect", { method: "POST", body: JSON.stringify({ visitor_id: visitorId, session_start: smp_sessionStart, event_type: 'pageview', workspace_id: workspaceId, page_url: window.location.href, referrer: document.referrer, device: getDeviceType(), source_type: getSourceType(), visitor_type: visitorType, os: detectOS(), browser: detectBrowser(), user_agent: navigator.userAgent }), }); }); document.addEventListener("click", function(e) { const target = e.target; let text = null; if (target && target.textContent) { text = target.textContent.trim(); if (text.length > 100) { text = text.substring(0, 100); } } const clickData = { x: e.clientX, y: e.clientY, pageX: e.pageX, pageY: e.pageY, // viewport viewportWidth: window.innerWidth, viewportHeight: window.innerHeight, // scroll scrollX: window.scrollX, scrollY: window.scrollY, // element info target_tag: target.tagName, target_id: target.id || null, target_class: target.className || null, selector: getSelector(target), // CSS selector domPath: getDomPath(target), // fallback index: getElementIndex(target), // text (optional) text: text }; fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/collect", { method: "POST", body: JSON.stringify({ ...clickData, visitor_id: visitorId, session_start: smp_sessionStart, event_type: 'click', workspace_id: workspaceId, page_url: window.location.href, device: getDeviceType(), }), }); }); window.addEventListener("scroll", function() { if (!smp_ticking) { requestAnimationFrame(() => { trackScroll(); smp_ticking = false; }); smp_ticking = true; } }); document.addEventListener('mousemove', function(e){ if (checkHeatmapId) { const target = e.target; if (target !== currentEl) { if (currentEl) { const duration = Date.now() - startTime; if (duration < 100) return; saveAttention(currentEl, duration); } currentEl = target; startTime = Date.now(); } } }); setInterval(() => { if (!smp_buffer.length && !smp_scroll.length) return; sendToServer(smp_buffer, smp_scroll); smp_buffer = []; smp_scroll = []; }, 2000); loadSurvey(); loadFormAnalytics(); return; }else{ injectStyle(); renderBanner(); } })(jQuery); function getDeviceType() { const ua = navigator.userAgent; if (/mobile/i.test(ua)) return "Mobile"; if (/tablet/i.test(ua)) return "Tablet"; return "Desktop"; } function renderBanner() { var banner = document.createElement('div'); banner.id = 'privacy-banner'; banner.className = 'dark'; banner.innerHTML = `
Our website uses cookies to give you the best and most relevant experience. By clicking on accept, you give your consent to the use of cookies as per our privacy policy Learn more.
${privacyType === 3 ? `` : ``}
`; document.body.appendChild(banner); document.getElementById('privacy-accept').onclick = function () { setConsent('accept'); }; if (privacyType === 3) { document.getElementById('privacy-reject').onclick = function () { setConsent('reject'); }; } } function setConsent(value) { var d = new Date(); d.setTime(d.getTime() + 365*24*60*60*1000); document.cookie = "smp_privacy_consent=" + value + ";path=/;expires=" + d.toUTCString(); document.getElementById('privacy-banner')?.remove(); if (value === 'accept') { loadTracking(); } } function injectStyle() { var css = ` #privacy-banner .privacy-message a { color: #39b54a; text-decoration: none; font-weight: 500; } #privacy-banner { position: fixed; bottom: 0; left: 0; right: 0; z-index: 999999; background: #2f2f2f; color: #fff; font-size: 14px; line-height: 1.6; padding: 14px 20px; display: flex; align-items: center; justify-content: space-between; box-shadow: 0 -2px 8px rgba(0,0,0,0.25); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif; } #privacy-banner .privacy-message { flex: 1; padding-right: 20px; } #privacy-banner .privacy-message a { color: #39b54a; text-decoration: none; font-weight: 500; } #privacy-banner .privacy-message a:hover { text-decoration: underline; } #privacy-banner .privacy-actions { display: flex; align-items: center; gap: 10px; white-space: nowrap; } #privacy-banner button { border: none; cursor: pointer; font-size: 13px; padding: 7px 16px; border-radius: 4px; font-weight: 600; transition: all .2s ease; } #privacy-banner #privacy-accept { background: #2fb344; color: #ffffff; } #privacy-banner #privacy-accept:hover { background: #28a63d; } #privacy-banner #privacy-reject { background: #6c757d; color: #ffffff; } #privacy-banner #privacy-reject:hover { background: #5f666d; } `; var style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); } function loadTracking() { } function getVisitorId() { let visitor_id = localStorage.getItem("visitor_id"); visitorType = "returning"; if (!visitor_id) { visitor_id = generateVisitorId(); localStorage.setItem("visitor_id", visitor_id); visitorType = "new"; } return visitor_id; } function generateVisitorId() { if (window.crypto && crypto.randomUUID) { return crypto.randomUUID(); } // fallback UUID v4 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } function getSmartSelector(el) { if (el.id) { return '#' + el.id; } if (el.className) { const classes = el.className .toString() .split(' ') .filter(c => c && !c.startsWith('ng-')); if (classes.length) { return '.' + classes.join('.'); } } // fallback css path return getCssPath(el); } function getSourceType() { const referrer = document.referrer; const params = new URLSearchParams(window.location.search); if (params.get('utm_medium') === 'cpc' || params.get('gclid') || params.get('fbclid')) { return 'paid'; } if (referrer) { if (referrer.includes('google.') || referrer.includes('bing.') || referrer.includes('yahoo.')) { return 'organic'; } return 'referral'; } return 'direct'; } function detectOS() { const ua = navigator.userAgent; if (ua.indexOf("Windows") !== -1) return "Windows"; if (ua.indexOf("Mac") !== -1) return "MacOS"; if (ua.indexOf("Linux") !== -1) return "Linux"; if (ua.indexOf("Android") !== -1) return "Android"; if (ua.indexOf("iPhone") !== -1 || ua.indexOf("iPad") !== -1) return "iOS"; return "Unknown"; } function detectBrowser() { const ua = navigator.userAgent; if (ua.indexOf("Chrome") !== -1) return "Chrome"; if (ua.indexOf("Firefox") !== -1) return "Firefox"; if (ua.indexOf("Safari") !== -1) return "Safari"; if (ua.indexOf("Edge") !== -1) return "Edge"; if (ua.indexOf("OPR") !== -1) return "Opera"; return "Unknown"; } function getCssPath(el) { let path = []; while (el && el.nodeType === Node.ELEMENT_NODE) { let selector = el.nodeName.toLowerCase(); if (el.className) { selector += '.' + el.className.split(' ').join('.'); } path.unshift(selector); el = el.parentElement; } return path.slice(-3).join(' > '); } function getCookie(name) { let cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { let c = cookies[i].trim(); if (c.indexOf(name + '=') === 0) { return c.substring(name.length + 1); } } return null; } function _checkHeatmapId() { fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/check_heatmap", { method: "POST", body: JSON.stringify({ workspace_id: workspaceId, page_url: window.location.href, }), }).then(res => res.json()) .then(data => { checkHeatmapId = data.check; }) .catch(err => console.log(err)); } function loadSurvey() { fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/get_survey_form", { method: "POST", body: JSON.stringify({ workspace_id: workspaceId, page_url: window.location.href, visitor_id: visitorId, session_start: smp_sessionStart, device: getDeviceType(), os: detectOS(), browser: detectBrowser(), user_agent: navigator.userAgent, referrer: document.referrer, source_type: getSourceType(), visitor_type: visitorType, }), }).then(res => res.text()) .then(html => { if (!html) return; mountSurvey(html); injectSurveyStyle(); setTimeout(() => { const el = document.getElementById('sp-survey'); if (el) el.style.display = 'block'; }, 2000); }); } function mountSurvey(html) { const div = document.createElement('div'); div.innerHTML = html; document.body.appendChild(div.firstElementChild); smpSteps = document.querySelectorAll('.smp-survey-step'); smpNextBtn = document.getElementById('smp-next-btn'); smpPrevBtn = document.getElementById('smp-prev-btn'); smpSubmitBtn = document.getElementById('smp-submit-btn'); smpProgressBar = document.getElementById('smp-progress-bar'); survey_id = $('input[name=survey_id]').val(); smpNextBtn.onclick = () => { if (!validateSurvey(smpCurrentStep)) return; smpCurrentStep++; smpShowStep(smpCurrentStep); }; smpPrevBtn.onclick = () => { smpCurrentStep--; smpShowStep(smpCurrentStep); }; smpSubmitBtn.onclick = () => { if (!validateSurvey(smpCurrentStep)) return; this.disabled = true; $('#smp-survey-form').submit(); }; document.getElementById('smp-survey-form').onsubmit = function(e) { if (isSubmitting) { e.preventDefault(); return; } isSubmitting = true; this.querySelector('#smp-submit-btn').disabled = true; e.preventDefault(); const formData = new FormData(this); formData.append('questionState', JSON.stringify(questionState)); formData.append('workspace_id', workspaceId); formData.append('page_url', window.location.href); formData.append('visitor_id', visitorId); formData.append('session_start', smp_sessionStart); formData.append('device', getDeviceType()); formData.append('os', detectOS()); formData.append('browser', detectBrowser()); formData.append('user_agent', navigator.userAgent); formData.append('referrer', document.referrer); formData.append('source_type', getSourceType()); formData.append('visitor_type', visitorType); fetch('https://fastcrm2.gtssolution.work/index.php/smart_page/survey_response', { method: 'POST', body: formData, }).then(res => res.text()).then(r => { showThankYou(r); }); }; document.getElementById('smp-close-btn').onclick = () => { const smpWidget = document.getElementById('smp-survey-widget'); smpWidget.style.display = 'none'; localStorage.setItem('smp-survey-closed', '1'); }; if (localStorage.getItem('smp-survey-closed') === '1') { } const questions = document.querySelectorAll('.smp-survey-step'); questions.forEach(q => { const qid = q.dataset.questionId; if (!qid) return; initQuestionState(qid); const inputs = q.querySelectorAll('input, textarea, select'); inputs.forEach(input => { // ===== FOCUS ===== input.addEventListener('focus', () => { if (!questionState[qid].focused) { trackEvent('focus', { question_id: qid }); questionState[qid].focused = true; } }); // ===== START ===== const startHandler = () => { if (!questionState[qid].started) { trackEvent('start', { question_id: qid }); questionState[qid].started = true; } }; input.addEventListener('input', startHandler); input.addEventListener('change', startHandler); }); }); // init smpShowStep(smpCurrentStep); } function injectSurveyStyle() { if (document.getElementById('sp-survey-style')) return; const style = document.createElement('style'); style.id = 'sp-survey-style'; style.innerHTML = ` #smp-survey-widget { position: fixed; bottom: 20px; left: 10%; z-index: 99999; font-family: Arial, sans-serif; } .smp-survey-box { width: 320px; background: #fff; border-radius: 12px; padding: 20px; box-shadow: 0 10px 30px rgba(0,0,0,0.2); } /* Progress */ .smp-survey-progress { height: 6px; background: #eee; border-radius: 10px; margin-bottom: 15px; } .smp-progress-bar { height: 100%; width: 0%; background: #4CAF50; border-radius: 10px; transition: 0.3s; } /* Steps */ .smp-survey-step { display: none; } .smp-survey-step.smp-active { display: block; } .smp-survey-step h3 { margin-bottom: 10px; } .smp-survey-step input, .smp-survey-step select { width: 100%; padding: 10px; margin-top: 10px; border: 1px solid #ddd; border-radius: 6px; } /* Buttons */ .smp-survey-actions { margin-top: 15px; display: flex; justify-content: space-between; } .smp-survey-actions button { padding: 8px 12px; border: none; border-radius: 6px; cursor: pointer; } #smp-next-btn { background: #4CAF50; color: #fff; } #smp-submit-btn { background: #2196F3; color: #fff; display: none; } #smp-close-btn { position: absolute; top: 10px; right: 10px; background: transparent; border: none; font-size: 18px; cursor: pointer; color: #999; } #smp-close-btn:hover { color: #333; } .sp-thankyou { text-align: center; padding: 40px 20px; } .sp-thankyou h3 { font-size: 20px; margin-bottom: 10px; } .sp-thankyou p { color: #666; margin-bottom: 20px; } .sp-thankyou { animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .sp-error { color: #dc2626; font-size: 13px; margin-top: 6px; } .sp-error-input { border-color: #dc2626 !important; } `; document.head.appendChild(style); } function showThankYou(thank_you_message) { const container = document.querySelector('#smp-survey-widget .smp-survey-box'); container.innerHTML = `

`+thank_you_message+`

`; } function validateSurvey(smpCurrentStep) { const form = document.getElementById('smp-survey-form'); const steps = form.querySelectorAll('.smp-survey-step'); const currentStepEl = steps[smpCurrentStep]; const inputs = currentStepEl.querySelectorAll('input, textarea, select'); let isValid = true; let firstErrorInput = null; const grouped = {}; inputs.forEach(input => { const name = input.name; const required = input.dataset.required == "1"; if (!required || !name) return; if (!grouped[name]) { grouped[name] = []; } grouped[name].push(input); }); Object.keys(grouped).forEach(name => { const group = grouped[name]; const type = group[0].type; let valid = false; // RADIO if (type === 'radio') { valid = group.some(i => i.checked); } // CHECKBOX else if (type === 'checkbox') { valid = group.some(i => i.checked); } // TEXT / TEXTAREA / SELECT else { valid = group[0].value.trim() !== ''; } if (!valid) { isValid = false; showError(group[0]); if (!firstErrorInput) { firstErrorInput = group[0]; } } else { clearError(group[0]); } }); if (firstErrorInput) { firstErrorInput.scrollIntoView({ behavior: 'smooth', block: 'center' }); firstErrorInput.focus(); } return isValid; } function showError(input) { const wrapper = input.closest('.smp-survey-step'); if (!wrapper.querySelector('.sp-error')) { const error = document.createElement('div'); error.className = 'sp-error'; error.innerText = 'This field is required'; wrapper.appendChild(error); } input.classList.add('sp-error-input'); } function clearError(input) { const wrapper = input.closest('.smp-survey-step'); const error = wrapper.querySelector('.sp-error'); if (error) error.remove(); input.classList.remove('sp-error-input'); } function smpShowStep(index) { smpSteps.forEach((step, i) => { step.classList.toggle('smp-active', i === index); }); smpPrevBtn.style.display = index === 0 ? 'none' : 'inline-block'; smpNextBtn.style.display = index === smpSteps.length - 1 ? 'none' : 'inline-block'; smpSubmitBtn.style.display = index === smpSteps.length - 1 ? 'inline-block' : 'none'; smpProgressBar.style.width = ((index + 1) / smpSteps.length) * 100 + '%'; } function initQuestionState(qid) { if (!questionState[qid]) { questionState[qid] = { focused: false, started: false, answered: false }; } } function trackEvent(event, data = {}) { const payload = JSON.stringify({ workspace_id: workspaceId, page_url: window.location.href, visitor_id: visitorId, session_start: smp_sessionStart, device: getDeviceType(), os: detectOS(), browser: detectBrowser(), user_agent: navigator.userAgent, referrer: document.referrer, source_type: getSourceType(), survey_id: survey_id, visitor_type: visitorType, event_type: event, ...data }); fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/survey_tracking", { method: 'POST', body: payload }); } function isSocial() { const socialDomains = [ "facebook.com", "twitter.com", "instagram.com", "tiktok.com", "linkedin.com" ]; return socialDomains.some(domain => document.referrer.includes(domain) ); } function loadFormAnalytics() { fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/get_form_analytics", { method: "POST", body: JSON.stringify({ workspace_id: workspaceId, page_url: window.location.href, visitor_id: visitorId, session_start: smp_sessionStart, device: getDeviceType(), os: detectOS(), browser: detectBrowser(), user_agent: navigator.userAgent, referrer: document.referrer, source_type: getSourceType(), visitor_type: visitorType, }), }).then(res => res.json()) .then(data => { const formsConfig = data; let formSubmitted = {}; // ========================= // INIT // ========================= formsConfig.forEach(formConfig => { let formStarted = false; const form = findForm(formConfig); if (!form) return; smpTracking.forms[formConfig.form_analytic_id] = { form_name: formConfig.form_name, fields: {} }; formSubmitted[formConfig.form_id] = false; // ========================= // INIT FIELD // ========================= formConfig.fields.forEach(f => { const field = form.querySelector(`[name="${f.name}"]`); if (!field) return; const fieldState = { focuses: 0, interactions: 0, refocuses: 0, corrections: 0, dropoffs: 0, // internal state hasFocused: 0, hasBlurred: 0, hasInteracted: 0, lastValue: '', isDeleting: 0, filled: 0 }; smpTracking.forms[formConfig.form_analytic_id].fields[f.name] = fieldState; // ========================= // EVENTS // ========================= // FOCUS field.addEventListener('focus', () => { if (!fieldState.hasFocused) { fieldState.focuses++; fieldState.hasFocused = 1; } else if (fieldState.hasBlurred) { fieldState.refocuses++; } }); // BLUR field.addEventListener('blur', () => { fieldState.hasBlurred = 1; }); // INPUT / CHANGE const inputEvent = (f.type === 'checkbox' || f.type === 'radio' || f.type === 'select') ? 'change' : 'input'; field.addEventListener(inputEvent, (e) => { if (!formStarted) { formStarted = true; form_started(formConfig.form_analytic_id); } const newValue = field.value || ''; // INTERACTION if (!fieldState.hasInteracted) { fieldState.interactions++; fieldState.hasInteracted = 1; } // CORRECTION LOGIC if (fieldState.lastValue && newValue.length < fieldState.lastValue.length) { fieldState.isDeleting = 1; } if (newValue.length > 0) { fieldState.filled = 1; }else{ fieldState.filled = 0; } if (fieldState.isDeleting && newValue.length > 0) { fieldState.corrections++; fieldState.isDeleting = 0; } fieldState.lastValue = newValue; }); }); // ========================= // SUBMIT // ========================= form.addEventListener('submit', () => { formSubmitted[formConfig.form_analytic_id] = true; sendData(formConfig.form_analytic_id); }); }); // ========================= // DROP-OFF TRACKING // ========================= window.addEventListener('beforeunload', () => { Object.keys(smpTracking.forms).forEach(formId => { if (formSubmitted[formId]) return; const formData = smpTracking.forms[formId]; Object.keys(formData.fields).forEach(fieldName => { const field = formData.fields[fieldName]; if (field.hasInteracted) { field.dropoffs++; } }); sendData(formId); }); }); }); } function findForm(formConfig) { if (formConfig.form_id) { const f = document.querySelector(`form#${formConfig.form_id}`); if (f) return f; } if (formConfig.action) { const forms = document.querySelectorAll('form'); for (let form of forms) { if (form.action.includes(formConfig.action)) { return form; } } } const forms = document.querySelectorAll('form'); if (forms[formConfig.index]) { return forms[formConfig.index]; } return null; } function sendData(formId) { const payload = { form_analytic_id: formId, fields: smpTracking.forms[formId].fields, workspace_id: workspaceId, page_url: window.location.href, visitor_id: visitorId, session_start: smp_sessionStart, device: getDeviceType(), os: detectOS(), browser: detectBrowser(), user_agent: navigator.userAgent, referrer: document.referrer, source_type: getSourceType(), visitor_type: visitorType, }; fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/form_analytic_response", { method: 'POST', body: JSON.stringify(payload) }); } function form_started(formId) { const payload = { form_analytic_id: formId, data: smpTracking.forms[formId], workspace_id: workspaceId, page_url: window.location.href, visitor_id: visitorId, session_start: smp_sessionStart, device: getDeviceType(), os: detectOS(), browser: detectBrowser(), user_agent: navigator.userAgent, referrer: document.referrer, source_type: getSourceType(), visitor_type: visitorType, }; fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/form_analytic_started", { method: 'POST', body: JSON.stringify(payload) }); } function getElementData(el) { const selector = el.className ? '.' + Array.from(el.classList).map(c => CSS.escape(c)).join('.') : el.tagName.toLowerCase(); const elements = document.querySelectorAll(selector); const index = Array.from(elements).indexOf(el); return { selector, index }; } function getDomPath(el) { const stack = []; while (el.parentNode != null) { let sibCount = 0; let sibIndex = 0; for (let i = 0; i < el.parentNode.childNodes.length; i++) { const sib = el.parentNode.childNodes[i]; if (sib.nodeName === el.nodeName) { if (sib === el) { sibIndex = sibCount; } sibCount++; } } stack.unshift(el.nodeName.toLowerCase() + ':' + sibIndex); el = el.parentNode; } return stack.join(' > '); } function getSelector(el) { if (el.id) return '#' + el.id; let path = []; while (el && el.nodeType === 1) { let selector = el.nodeName.toLowerCase(); if (el.classList && el.classList.length) { selector += '.' + Array.from(el.classList).join('.'); } path.unshift(selector); el = el.parentNode; } return path.join(' > '); } function getElementIndex(el) { const siblings = Array.from(el.parentNode.children); return siblings.indexOf(el); } function saveAttention(el, duration) { const rect = el.getBoundingClientRect(); smp_buffer.push({ selector: getSelector(el), domPath: getDomPath(el), index: getElementIndex(el), target_tag: el.tagName, target_id: el.id || null, target_class: el.className || null, text: el.innerText ? el.innerText.substring(0, 100) : null, value: duration }); } function sendToServer(data_move, data_scroll) { fetch("https://fastcrm2.gtssolution.work/index.php/smart_page/collect", { method: "POST", body: JSON.stringify({ move_data: data_move, scroll_data: data_scroll, event_type: 'heatmap', workspace_id: workspaceId, visitor_id: visitorId, session_start: smp_sessionStart, page_url: window.location.href, device: getDeviceType(), }), }); } function trackScroll() { const scrollTop = window.scrollY; const viewportHeight = window.innerHeight; const docHeight = document.body.scrollHeight; const start = scrollTop / docHeight; const end = (scrollTop + viewportHeight) / docHeight; const startIndex = Math.floor(start * smp_segments); const endIndex = Math.floor(end * smp_segments); for (let i = startIndex; i <= endIndex; i++) { if (!smp_scroll[i]) { smp_scroll[i] = 0; } smp_scroll[i]++; } }