/** === Calltouch dedupe settings === */ var CT_DEDUPE_HOURS = 3; var CT_DEDUPE_TTL = CT_DEDUPE_HOURS * 60 * 60 * 1000; function ctNormalizePhone(raw) { if (!raw) return ''; var digits = String(raw).replace(/\D/g, ''); // РФ: 8XXXXXXXXXX -> 7XXXXXXXXXX if (digits.length === 11 && digits[0] === '8') digits = '7' + digits.slice(1); return digits; } function ctNormalizeEmail(raw) { if (!raw) return ''; return String(raw).trim().toLowerCase(); } // Возвращает ключ дедупликации. Приоритет: телефон, иначе email. function ctDedupeKey(phone, email) { var p = ctNormalizePhone(phone); if (p && p.length >= 10) return 'phone:' + p; var e = ctNormalizeEmail(email); if (e) return 'email:' + e; return ''; } // true = дубль в пределах TTL, false = можно отправлять в Calltouch function ctIsDuplicate(phone, email) { var key = ctDedupeKey(phone, email); if (!key) return false; var storageKey = 'ct_lead_' + key; var until = Number(localStorage.getItem(storageKey) || 0); var now = Date.now(); if (until && until > now) return true; // резервируем окно (чтобы два сабмита подряд тоже не ушли) localStorage.setItem(storageKey, String(now + CT_DEDUPE_TTL)); return false; } var calltouch_sender = function(form,is_zero_block){ var f = form; var fio = ct_get_val(f,'input[data-tilda-rule="name"]'); var phone = ct_get_val(f,'input[data-tilda-rule="phone"]'); var email = ct_get_val(f,'input[data-tilda-rule="email"]'); var sub = 'Заявка с ' + location.hostname; if (ct_get_val(f,'input[name="tildaspec-formname"]').length>0){ sub = ct_get_val(f,'input[name="tildaspec-formname"]'); } var ct_data = { fio: fio, phoneNumber: phone, email: email, subject: sub, requestUrl: location.href, sessionId: window.call_value }; var post_data = Object.keys(ct_data).reduce(function(a,k){if(!!ct_data[k]){a.push(k+'='+encodeURIComponent(ct_data[k]));}return a},[]).join('&'); var ct_site_id = '75925'; var CT_URL = 'https://api.calltouch.ru/calls-service/RestAPI/requests/'+ct_site_id+'/register/'; var ct_valid = !!phone || !!email; // Проверка дубля на 5 часов: дубль = НЕ отправляем в Calltouch var is_dup = ctIsDuplicate(phone, email); console.log(ct_data, ct_valid, 'duplicate=', is_dup); if (ct_valid && !is_dup && !window.ct_snd_flag){ window.ct_snd_flag = 1; setTimeout(function(){ window.ct_snd_flag = 0; }, 20000); var request = window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest(); request.open("POST", CT_URL, true); request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); request.send(post_data); } if (is_zero_block){var su=form.getAttribute('data-success-url');if(su){setTimeout(function(){window.location.href=su;},1000);}} } if (document.readyState!=='loading'){ [].forEach.call(document.querySelectorAll('form'),function(el){ set_calltouch_listener(el,false); }); } else { document.addEventListener('DOMContentLoaded', function(){ [].forEach.call(document.querySelectorAll('form'),function(el){ set_calltouch_listener(el,false); }); }); } window.t396_onSuccess = function(form){ if (!form) return; if (!form.id){ calltouch_sender(form[0],true); } else { calltouch_sender(form,true); } }