/* ════════════════════════════════════════════════════════════════
GK Associates — Content Loader v2.0
─────────────────────────────────────────────────────────────
Reads site_content/data.json and injects ALL site content.
Scalar values → add data-key="some.dot.path" to any element.
Array sections → empty containers with specific IDs are filled
automatically (see section IDs below).
Requires HTTP server (Live Server). Does NOT work over file://.
════════════════════════════════════════════════════════════════ */
(function () {
'use strict';
/* ── Resolve "a.b.c" dot-path against an object ───────────── */
function resolve(obj, path) {
return path.split('.').reduce(function (o, k) {
return (o != null && o[k] !== undefined) ? o[k] : null;
}, obj);
}
/* ── Render an array into a container by ID ──────────────── */
function render(id, arr, fn) {
var el = document.getElementById(id);
if (el && Array.isArray(arr) && arr.length) {
el.innerHTML = fn(arr);
}
}
/* ══════════════════════════════════════════════════════════
CARD / ITEM BUILDERS
══════════════════════════════════════════════════════════ */
/* Hero trust panel → #home-trust-items (ul) */
function trustItem(item) {
return '
' +
'\u2713' +
'' +
'
' + item.title + '
' +
'
' + item.desc + '
' +
'
';
}
/* Dark panel rows (core commitments / defines-us)
→ #home-core-commitments | #about-defines-us */
function darkPanelRows(items) {
return items.map(function (item, i) {
var cls = i === 0 ? 'pb-7 border-b border-white/10'
: i === items.length - 1 ? 'pt-7'
: 'py-7 border-b border-white/10';
return '' +
'
' + item.title + '
' +
'
' + item.desc + '
' +
'
';
}).join('');
}
/* Services summary cards → #home-services */
function serviceSummaryCard(svc) {
return '' +
'
' +
'
' + svc.number + '' +
'
' +
'
' +
'
' + svc.title + '
' +
'
' + svc.subtitle + '
' +
'
' + svc.summary + '
' +
'
';
}
/* Why-choose-us items — light bg → #home-why-items */
function whyItemLight(item) {
return '' +
'
' + item.title + '
' +
'
' + item.desc + '
' +
'
';
}
/* Core values cards → #about-core-values */
function coreValueCard(val) {
return '' +
'
' +
'
' + val.letter + '' +
'
' + val.title + '
' +
'
' + val.desc + '
' +
'
';
}
/* Why-choose-us items — dark bg → #about-why-items */
function whyItemDark(item) {
return '' +
'
' + item.title + '
' +
'
' + item.desc + '
' +
'
';
}
/* Service detail cards → #services-list */
function serviceDetailCard(svc) {
var items = (svc.items || []).map(function (item) {
return '\u2713' + item + '';
}).join('');
return '' +
'
' +
'
' +
'
' +
'
' + svc.number + '
' +
'
' + svc.title + '
' +
'
' + svc.subtitle + '
' +
'
' +
'
' +
'
' +
'
' +
'
' + svc.detail + '
' +
'
' +
'
' +
'
';
}
/* Founder expertise tags → #founder-expertise */
function founderExpertiseTag(t) {
return '' + t + '';
}
/* Founder qualification tiles → #founder-qualifications */
function founderQualCard(q) {
return '' +
'
' + q.title + '
' +
'
' + q.subtitle + '
' +
'
';
}
/* Team member cards → #team-list */
function teamCard(member) {
var tags = (member.expertise || []).map(function (t) {
return '' + t + '';
}).join('');
return '' +
'
' +
'
' +
'
' + member.name + '
' +
'
' + member.title + '
' +
'
' + member.bio + '
' +
'
' + tags + '
' +
'
' +
'
';
}
/* ══════════════════════════════════════════════════════════
MAIN INJECT — called once data.json is fetched
══════════════════════════════════════════════════════════ */
function applyData(data) {
/* 1 ── Scalar: fill every element with data-key="dot.path" */
document.querySelectorAll('[data-key]').forEach(function (el) {
var val = resolve(data, el.getAttribute('data-key'));
if (val === null || val === undefined) return;
if (el.tagName === 'IFRAME') {
el.setAttribute('src', String(val));
} else {
el.innerHTML = val;
}
});
/* 2 ── Arrays: render each section if the container exists */
/* index.html */
render('home-trust-items', data.home && data.home.trust_items, function (c) { return c.map(trustItem).join(''); });
render('home-core-commitments',data.home && data.home.core_commitments, darkPanelRows);
render('home-services', data.services, function (c) { return c.map(serviceSummaryCard).join(''); });
render('home-why-items', data.why_choose_us, function (c) { return c.map(whyItemDark).join(''); });
/* about.html */
render('about-defines-us', data.about && data.about.defines_us, darkPanelRows);
render('about-core-values', data.about && data.about.core_values, function (c) { return c.map(coreValueCard).join(''); });
render('about-why-items', data.why_choose_us, function (c) { return c.map(whyItemDark).join(''); });
/* services.html */
render('services-list', data.services, function (c) { return c.map(serviceDetailCard).join(''); });
/* team.html */
render('team-list', data.team, function (c) { return c.map(teamCard).join(''); });
render('founder-expertise', data.team && data.team[0] && data.team[0].expertise, function (c) { return c.map(founderExpertiseTag).join(''); });
render('founder-qualifications', data.team && data.team[0] && data.team[0].qualifications, function (c) { return c.map(founderQualCard).join(''); });
}
/* ── Fetch site_content/data.json ─────────────────────────── */
fetch('./site_content/data.json')
.then(function (res) {
if (!res.ok) throw new Error('HTTP ' + res.status);
return res.json();
})
.then(applyData)
.catch(function (err) {
console.warn('[GK Associates] content-loader: could not load data.json.', err);
});
}());