/* chem8_ch6_widgets.js — виджеты Главы 6 «Растворы».
* Использует window.Chem8: classifier, solubilityTable, molarMass.
*/
(function (W) {
'use strict';
function C() { return W.Chem8 || {}; }
function $(id) { return document.getElementById(id); }
function rr(v, d) { var p = Math.pow(10, d == null ? 2 : d); return (Math.round(v * p) / p).toString().replace('.', ','); }
/* §46 — классификатор смесей */
function mount_p46() {
var el = $('c-mix'); if (!el || el._b || !C().classifier) return; el._b = 1;
C().classifier(el, {
items: [
{ id: 'air', label: 'воздух', cat: 'odn' }, { id: 'saltsol', label: 'раствор соли', cat: 'odn' }, { id: 'steel', label: 'сталь', cat: 'odn' },
{ id: 'sandwater', label: 'песок + вода', cat: 'neod' }, { id: 'milk', label: 'молоко', cat: 'neod' }, { id: 'granite', label: 'гранит', cat: 'neod' }
],
buckets: [{ cat: 'odn', label: 'Однородные (растворы)' }, { cat: 'neod', label: 'Неоднородные' }],
onCheck: function (ok) { if (ok && W.addXp) W.addXp(8, 'p46-mix'); }
});
}
/* §48 — кривая растворимости s = f(t) */
var CURVE = { KNO3: [13, 21, 32, 46, 64, 88, 110, 138, 169, 202, 246], NaCl: [35.7, 35.8, 36, 36.3, 36.6, 37, 37.3, 37.8, 38.4, 39, 39.8] };
function mount_p48() {
var el = $('c-solcurve'); if (!el || el._b) return; el._b = 1;
el.innerHTML = '
';
var sub = $('sc-sub'), tr = $('sc-t'), tv = $('sc-tv'), plot = $('sc-plot'), out = $('sc-out');
function draw() {
var data = CURVE[sub.value], t = +tr.value, idx = t / 10, s = data[idx];
tv.textContent = t + ' °C';
var maxS = Math.max.apply(null, CURVE.KNO3);
var W0 = 280, H0 = 140, pad = 24;
var pts = data.map(function (v, i) { var x = pad + i / 10 * (W0 - pad * 2); var y = H0 - pad - v / maxS * (H0 - pad * 2); return x.toFixed(1) + ',' + y.toFixed(1); }).join(' ');
var cx = pad + idx / 10 * (W0 - pad * 2), cy = H0 - pad - s / maxS * (H0 - pad * 2);
plot.innerHTML = '';
out.className = 'out ok';
out.innerHTML = 'При ' + t + ' °C растворимость ' + sub.value + ' ≈ ' + rr(s, 1) + ' г на 100 г воды.' + (sub.value === 'KNO3' ? ' Растворимость сильно растёт с температурой.' : ' У NaCl почти не зависит от t.') + '';
}
sub.addEventListener('change', draw); tr.addEventListener('input', draw); draw();
}
/* §50 — массовая доля w */
function mount_p50() {
var el = $('c-wcalc'); if (!el || el._b) return; el._b = 1;
el.innerHTML = '';
function calc() {
var ms = parseFloat($('w-ms').value), mw = parseFloat($('w-mw').value);
if (isNaN(ms) || isNaN(mw) || ms + mw <= 0) { $('w-out').className = 'out bad'; $('w-out').textContent = 'Введите массы.'; return; }
var w = ms / (ms + mw) * 100;
$('w-out').className = 'out ok';
$('w-out').innerHTML = 'm(раствора) = ' + ms + ' + ' + mw + ' = ' + (ms + mw) + ' г
w = m(в-ва)/m(р-ра) = ' + ms + '/' + (ms + mw) + ' = ' + rr(w, 1) + ' %';
}
$('w-go').addEventListener('click', calc); calc();
}
/* §51 — молярная концентрация c = n/V */
function mount_p51() {
var el = $('c-ccalc'); if (!el || el._b) return; el._b = 1;
el.innerHTML = '';
function calc() {
var f = $('c-f').value.trim(), M = C().molarMass ? C().molarMass(f) : NaN, m = parseFloat($('c-m').value), V = parseFloat($('c-v').value);
if (isNaN(M)) { $('c-out').className = 'out bad'; $('c-out').textContent = 'Не удалось разобрать формулу.'; return; }
if (isNaN(m) || isNaN(V) || V <= 0) { $('c-out').className = 'out bad'; $('c-out').textContent = 'Введите m и V.'; return; }
var n = m / M, c = n / V;
$('c-out').className = 'out ok';
$('c-out').innerHTML = 'M(' + f + ') = ' + M + ' г/моль
n = m/M = ' + m + '/' + M + ' = ' + rr(n) + ' моль
c = n/V = ' + rr(n) + '/' + rr(V) + ' = ' + rr(c) + ' моль/л';
}
$('c-go').addEventListener('click', calc); calc();
}
W.CHEM8_WIDGETS = { p46: mount_p46, p50: mount_p50, p51: mount_p51 };
W.FLAG_MOUNTS = { p48: mount_p48 };
})(window);