/* Simulateur Réméré v2 - Page ID 5399 */
/* ════════════════════════════════════════
SIMULATEUR RÉMÉRÉ v2 — JS
════════════════════════════════════════ */
(function() {
'use strict';
var NOTAIRE_RATE = 0.03;
var INDEM_RATE_Y = 0.115;
var MIN_LTV = 0.10;
var MAX_LTV = 0.50;
var state = { bien: 300000, mois: 24, tresor: 0 };
// ── Formatage ──────────────────────────────────
function fmt(n) {
return Math.round(n).toLocaleString('fr-FR') + 'u202f€';
}
function fmtK(n) {
return (n >= 1000000)
? (n / 1000000).toFixed(1).replace('.', ',') + 'u00a0M€'
: Math.round(n / 1000) + 'u00a0k€';
}
function round100(n) { return Math.round(n / 100) * 100; }
// ── Calcul ─────────────────────────────────────
function compute() {
var annees = state.mois / 12;
var deductRate = NOTAIRE_RATE + INDEM_RATE_Y * annees;
var prix = state.tresor / (1 - deductRate);
return {
tresor: state.tresor,
notaire: round100(prix * NOTAIRE_RATE),
indemnites: round100(prix * INDEM_RATE_Y * annees),
prix: round100(prix),
rachat: round100(prix),
ltv: state.tresor / state.bien
};
}
// ── Slider trésorerie ──────────────────────────
function getMinMax() {
return {
minT: Math.round(state.bien * MIN_LTV / 1000) * 1000,
maxT: Math.round(state.bien * MAX_LTV / 1000) * 1000
};
}
function sliderToTresor(pct) {
var mm = getMinMax();
var raw = mm.minT + (pct / 100) * (mm.maxT - mm.minT);
return Math.round(raw / 5000) * 5000;
}
function tresorToSlider(tresor) {
var mm = getMinMax();
return Math.round((tresor - mm.minT) / (mm.maxT - mm.minT) * 100);
}
// ── Rendu ──────────────────────────────────────
function setStyle(el, prop, val) { if (el) el.style[prop] = val; }
function setText(id, txt) { var el = document.getElementById(id); if (el) el.textContent = txt; }
function render() {
var r = compute();
var ltv = r.ltv;
var mm = getMinMax();
// Slider fill
var rangeTresor = document.getElementById('rem2-tresor');
if (rangeTresor) {
var pct = parseInt(rangeTresor.value, 10);
rangeTresor.style.background =
'linear-gradient(90deg,#0D1B3E ' + pct + '%,#E8EBF4 ' + pct + '%)';
}
// Trésorerie label
setText('rem2-tresor-val', fmt(r.tresor));
setText('rem2-tresor-pct', Math.round(ltv * 100) + '% du bien');
setText('rem2-smin', fmtK(mm.minT));
setText('rem2-smax', fmtK(mm.maxT));
// LTV bar + message
var ltvPct = Math.min(100, Math.round((ltv - MIN_LTV) / (MAX_LTV - MIN_LTV) * 100));
var ltvFill = document.getElementById('rem2-ltv-fill');
if (ltvFill) {
ltvFill.style.width = ltvPct + '%';
ltvFill.style.background = ltv <= 0.35 ? '#2ECC8A' : ltv <= 0.45 ? '#F1C40F' : '#E74C3C';
}
setText('rem2-ltv-label', 'LTV ' + Math.round(ltv * 100) + '%');
setText('rem2-ltv-msg',
ltv <= 0.35 ? 'Financement très accessible' :
ltv <= 0.45 ? 'Financement accessible' :
'Financement difficile');
// Bien display
setText('rem2-bien-display', fmt(state.bien));
var rangeBien = document.getElementById('rem2-bien');
if (rangeBien) {
var bienPct = Math.round((state.bien - 100000) / (2000000 - 100000) * 100);
rangeBien.style.background =
'linear-gradient(90deg,#0D1B3E ' + bienPct + '%,#E8EBF4 ' + bienPct + '%)';
}
// Résultats
setText('res2-tresor', fmt(r.tresor));
setText('res2-notaire', fmt(r.notaire));
setText('res2-indemnites', fmt(r.indemnites));
setText('res2-indem-lbl', 'pour ' + state.mois + ' mois');
setText('res2-prix', fmt(r.prix));
setText('res2-rachat', fmt(r.rachat));
}
function updateBien(val) {
state.bien = Math.max(100000, Math.min(2000000, val));
var mm = getMinMax();
if (state.tresor mm.maxT) state.tresor = mm.maxT;
var rangeTresor = document.getElementById('rem2-tresor');
if (rangeTresor) rangeTresor.value = tresorToSlider(state.tresor);
var rangeBien = document.getElementById('rem2-bien');
if (rangeBien) rangeBien.value = state.bien;
render();
}
// ── Init ───────────────────────────────────────
function init() {
var rangeBien = document.getElementById('rem2-bien');
var rangeTresor = document.getElementById('rem2-tresor');
var pills = document.querySelectorAll('#rem2-pills .rem2-pill');
var btnMinus = document.getElementById('rem2-minus');
var btnPlus = document.getElementById('rem2-plus');
if (!rangeBien || !rangeTresor || !pills.length) return; // pas encore dans le DOM
// Init tréso
state.tresor = sliderToTresor(55);
render();
// Slider bien
rangeBien.addEventListener('input', function() {
state.bien = parseInt(this.value, 10);
var mm = getMinMax();
if (state.tresor mm.maxT) state.tresor = mm.maxT;
rangeTresor.value = tresorToSlider(state.tresor);
render();
});
// Stepper ±25k
btnMinus && btnMinus.addEventListener('click', function() { updateBien(state.bien - 25000); });
btnPlus && btnPlus.addEventListener('click', function() { updateBien(state.bien + 25000); });
// Slider trésorerie
rangeTresor.addEventListener('input', function() {
state.tresor = sliderToTresor(parseInt(this.value, 10));
render();
});
// Pills durée
pills.forEach(function(pill) {
pill.addEventListener('click', function() {
pills.forEach(function(p) { p.classList.remove('rem2-pill--on'); });
this.classList.add('rem2-pill--on');
state.mois = parseInt(this.dataset.mois, 10);
render();
});
});
}
// Lancer une fois le DOM prêt
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();