2Выберите дополнительные услуги
Итого в месяц
8 000 ₽/ мес
(function () {
// ============================================================
// CTA — настраивайте здесь: текст кнопки и обработчик клика.
// payload приходит готовый: { total, site, domain, ya, gl }.
// ============================================================
var CTA_TEXT = "Оставить заявку";
function CTA_HANDLER(payload) {
console.log("[b2bsc-calc] CTA clicked", payload);
document.querySelector("#cbs-header-cta-btn") && document.querySelector("#cbs-header-cta-btn").click();
}
// Кнопка "Расчёт с менеджером" — слева внизу.
var MGR_TEXT = "Расчёт с менеджером";
function MGR_HANDLER(payload) {
console.log("[b2bsc-calc] manager clicked", payload);
document.querySelector("#cbs-header-cta-btn") && document.querySelector("#cbs-header-cta-btn").click();
}
// ============================================================
var root = document.getElementById("b2bsc-subcalc-root");
if (!root) return;
function format(n) { return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "); }
function q(sel) { return root.querySelector(sel); }
var totalNode = q("#b2bsc-subcalc-total");
var ctaBtn = q("#b2bsc-cta-btn");
if (ctaBtn) ctaBtn.textContent = CTA_TEXT;
var mgrBtn = q("#b2bsc-mgr-btn");
if (mgrBtn) mgrBtn.textContent = MGR_TEXT;
function readSelected(name) {
var el = q('input[name="' + name + '"]:checked');
return el ? { value: parseInt(el.value, 10) || 0, label: el.getAttribute("data-label") || "" } : null;
}
function readCheckbox(id) {
var el = q("#" + id);
if (!el || !el.checked) return null;
return { value: parseInt(el.getAttribute("data-price"), 10) || 0, label: el.getAttribute("data-label") || "" };
}
function calculateTotal() {
var site = readSelected("b2bsc-site");
var domain = readCheckbox("b2bsc-domain");
var ya = readCheckbox("b2bsc-ya");
var gl = readCheckbox("b2bsc-gl");
return (site ? site.value : 0) + (domain ? domain.value : 0) + (ya ? ya.value : 0) + (gl ? gl.value : 0);
}
var prevTotal = null;
function updateTotalNode() {
var total = calculateTotal();
if (totalNode) {
totalNode.innerHTML = format(total) + " ₽<small>/ мес</small>";
if (prevTotal !== null && prevTotal !== total) {
totalNode.classList.remove("is-pulse");
void totalNode.offsetWidth;
totalNode.classList.add("is-pulse");
}
prevTotal = total;
}
}
function buildPayload() {
return {
total: calculateTotal(),
site: readSelected("b2bsc-site"),
domain: readCheckbox("b2bsc-domain"),
ya: readCheckbox("b2bsc-ya"),
gl: readCheckbox("b2bsc-gl")
};
}
// Пишем выбор пользователя в sessionStorage. Сам конфигуратор
// отсюда не читает — это интерфейс для внешних форм/обработчиков.
var STORAGE_KEY = "b2bsc-calc-selection";
function persistSelection() {
try {
var p = buildPayload();
var lines = [];
if (p.site) lines.push("Тип сайта: " + p.site.label + " (" + format(p.site.value) + " ₽ / мес)");
var addons = [];
if (p.domain) addons.push(p.domain.label + " (+" + format(p.domain.value) + " ₽ / мес)");
if (p.ya) addons.push(p.ya.label + " (+" + format(p.ya.value) + " ₽ / мес)");
if (p.gl) addons.push(p.gl.label + " (+" + format(p.gl.value) + " ₽ / мес)");
lines.push("Доп. услуги: " + (addons.length ? addons.join(", ") : "—"));
lines.push("Итого: " + format(p.total) + " ₽ / мес");
var data = {
total: p.total,
totalText: format(p.total) + " ₽ / мес",
site: p.site,
domain: p.domain,
ya: p.ya,
gl: p.gl,
text: lines.join("\n"),
updatedAt: new Date().toISOString()
};
sessionStorage.setItem(STORAGE_KEY, JSON.stringify(data));
} catch (err) {
console.warn("[b2bsc-calc] cannot persist selection:", err);
}
}
root.addEventListener("change", function () {
updateTotalNode();
persistSelection();
});
// Яндекс.Метрика: цель "siteCalcUsed" при кликах по карточкам выбора.
// Только клики (без программных изменений), внутри try/catch.
function trackCalcGoal() {
try {
if (typeof window.ym === "function" && window.Ya && window.Ya._metrika && window.Ya._metrika.counters) {
Object.keys(window.Ya._metrika.counters).forEach(function (id) {
window.ym(parseInt(id, 10), "reachGoal", "siteCalcUsed");
});
return;
}
Object.keys(window).forEach(function (k) {
var m = k.match(/^yaCounter(\d+)$/);
if (m && window[k] && typeof window[k].reachGoal === "function") {
window[k].reachGoal("siteCalcUsed");
}
});
} catch (err) { /* metrika может быть не подключена / заблокирована */ }
}
root.addEventListener("click", function (e) {
if (e.target && e.target.closest && e.target.closest(".b2bsc-opt, .b2bsc-check")) {
trackCalcGoal();
}
});
root.addEventListener("click", function (e) {
var t = e.target;
var btn = null;
while (t && t !== root) {
if (t.getAttribute && t.getAttribute("data-action")) { btn = t; break; }
t = t.parentNode;
}
if (!btn) return;
var act = btn.getAttribute("data-action");
if (act === "cta") {
try { CTA_HANDLER(buildPayload()); } catch (err) { console.error("[b2bsc-calc] CTA handler error:", err); }
} else if (act === "manager") {
try { MGR_HANDLER(buildPayload()); } catch (err) { console.error("[b2bsc-calc] manager handler error:", err); }
}
});
updateTotalNode();
persistSelection();
})();