/* 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();
}

})();

Mis à jour le 5 avril 2026
Avertissement : Les informations présentées sur ce site sont fournies à titre informatif uniquement et ne constituent pas des conseils financiers, fiscaux, juridiques ou d'investissement. Les auteurs et l'équipe du site ne sont pas des conseillers financiers et ne prétendent pas l'être. Nous nous efforçons de présenter des informations précises et à jour, mais nous ne pouvons garantir l'exactitude ou l'exhaustivité de toutes les informations disponibles sur notre site.
menu-circlecross-circle