const yearsSince2011 = new Date().getFullYear() - 2011;
function esc(s) { return String(s||'').replace(/&/g,'&').replace(/"/g,'"').replace(//g,'>'); }
function imgSrc(path) {
if (!path) return './img/hero-bg.webp';
if (path.startsWith('./')) return path;
if (path.startsWith('http')) return path;
if (/^(equipment|partner|license|activity|hero)_images\//.test(path)) return '/data/' + path;
var uploaded = { equip_: 'equipment_images', act_: 'activity_images', lic_: 'license_images', prt_: 'partner_images' };
for (var pre in uploaded) { if (path.indexOf(pre) === 0) return '/data/' + uploaded[pre] + '/' + path; }
return './img/' + path;
}
var CONTRACT_ICON = {
income: '',
expense: ''
};
// Тип договора («Доходный/Расходный договор для заказчика») выносим из описания в заметную плашку
function splitContract(desc) {
var text = String(desc || '');
var m = text.match(/\s*(Доходный|Расходный)\s+договор(\s+для\s+заказчика)?\.?/i);
if (!m) return { tag: '', rest: text };
var kind = /^доходный/i.test(m[1]) ? 'income' : 'expense';
var tag = '
';
}
function renderAbout(data) {
var a = data.about || {};
var features = data.about_features || [];
var featsHtml = features.map(function(f) {
return '
' + f.title + '' + (f.description || '') + '
';
}).join('');
return '
О компании
' + (a.section_subtitle || '') + '
' +
'
' +
'
' +
'
' + (a.main_heading || '') + '
' +
(a.paragraph_1 ? '
' + a.paragraph_1 + '
' : '') +
(a.paragraph_2 ? '
' + a.paragraph_2 + '
' : '') +
(a.paragraph_3 ? '
' + a.paragraph_3 + '
' : '') +
'
' + featsHtml + '
';
}
function renderServices(data) {
var services = data.services || [];
var st = data.settings || {};
var cardsHtml = services.map(function(s) {
var items = [];
try { items = JSON.parse(s.items || '[]'); } catch(e) {}
return '
' +
(s.is_large == 1 ? '' : '') +
'' +
'
' + s.title + '
' + (s.description || '') + '
' +
(items.length ? '
' + items.map(function(i) { return '
' + i + '
'; }).join('') + '
' : '') +
'
';
}).join('');
return '
Наши услуги
' + (st.section_services_subtitle || '') + '
' +
'
' + cardsHtml + '
';
}
function renderSchemes(data) {
var schemes = data.work_schemes || [];
var st = data.settings || {};
var cardsHtml = schemes.map(function(s) {
var items = [];
try { items = JSON.parse(s.items || '[]'); } catch(e) {}
var c = splitContract(s.description);
return '
' +
'' +
'
' + s.title + '
' + c.tag + '
' + c.rest + '
' +
(items.length ? '
' + items.map(function(i) { return '
' + i + '
'; }).join('') + '
' : '') +
'
';
}).join('');
return '
Гибкие схемы работы
' + (st.section_schemes_subtitle || '') + '
' +
'
' + cardsHtml + '
';
}
function renderProcess(data) {
var steps = data.process_steps || [];
var st = data.settings || {};
var stepsHtml = steps.map(function(s) {
return '
' + (s.step_number || s.sort_order + 1) + '
' + s.title + '
' + (s.description || '') + '
';
}).join('');
return '
Этапы работы
' + (st.section_process_subtitle || '') + '
' +
'
' + stepsHtml + '
';
}
function renderEquipment(data) {
var eq = data.equipment || [];
var gallery = data.equipment_gallery || [];
var st = data.settings || {};
function getImages(e) {
var imgs = [];
if (gallery.length) {
gallery.filter(function(g) { return g.equipment_id === e.id; }).forEach(function(g) {
if (g.image_path) imgs.push(g.image_path);
});
}
if (imgs.length === 0 && e.image_path) imgs.push(e.image_path);
return imgs;
}
var cardsHtml = eq.map(function(e) {
var specs = [];
try { specs = JSON.parse(e.specs || '[]'); } catch(e2) {}
var imgs = getImages(e);
var imgHtml = imgs.length > 0
? ''
: '
Нет фото
';
return '
' +
imgHtml +
'
' + esc(e.brand || '') + '
' +
'
' + esc(e.name) + '
' +
(e.qty ? '
' + esc(e.qty) + '
' : '') +
(specs.length ? '
' + specs.map(function(sp) { return '
' + esc(sp.label) + '' + esc(sp.value) + '
'; }).join('') + '
' : '') +
'
';
}).join('');
return '
Наша спецтехника
' + esc(st.section_equipment_subtitle || '') + '
' +
'
' + cardsHtml + '
';
}
function renderGeography(data) {
var geo = data.geo || {};
var regions = data.geo_regions || [];
var st = data.settings || {};
var regionsHtml = regions.map(function(r) {
return '
';
}
function renderLicenses(data) {
var licenses = data.licenses || [];
var gallery = data.license_gallery || [];
var st = data.settings || {};
var cardsHtml = licenses.map(function(l) {
return '
' + l.title + '
' + (l.description || '') + '
';
}).join('');
var galleryHtml = gallery.map(function(g) {
return '
' +
'
' +
'
' + g.title + '
' + (g.description || '') + '
';
}).join('');
return '
Лицензии и разрешения
' + (st.section_licenses_subtitle || '') + '
' +
'
' + cardsHtml + '
' +
(gallery.length ? '
' + galleryHtml + '
' : '');
}
function renderActivity(data) {
var acts = data.public_activities || [];
var gallery = data.activity_gallery || [];
var st = data.settings || {};
var cardsHtml = acts.map(function(a) {
return '
' + a.title + '
' + (a.description || '') + '
';
}).join('');
var galleryHtml = gallery.length ? '
Благодарственные письма
' +
gallery.map(function(g) {
return '
' +
'
' +
'
' + g.title + '
' + (g.description || '') + '
';
}).join('') + '
' : '';
return '
Общественная деятельность
' + (st.section_activity_subtitle || '') + '
' +
'
' + cardsHtml + '
' + galleryHtml;
}
function renderPartners(data) {
var partners = data.partners || [];
var st = data.settings || {};
var duplicated = partners.concat(partners);
var trackHtml = duplicated.map(function(p) {
return '';
}).join('');
return '
Наши партнёры
' + (st.section_partners_subtitle || '') + '
' +
'
' + trackHtml + '
';
}
function renderContacts(data) {
var s = data.settings || {};
var h = data.hero || {};
var phone800 = h.phone_800 || s.contact_phone_800 || '8 (800) 555-29-31';
var phoneEkb = h.phone_ekb || s.contact_phone_ekb || '8 (343) 237-25-66';
var email = h.email || s.contact_email || 'sts_zakaz@mail.ru';
var address = h.address || s.contact_address || 'г. Екатеринбург, ул. Московская, 11, оф. 702';
var workHours = (s.contact_work_hours || 'Пн–Пт: 9:00 – 18:00|Сб: 10:00 – 15:00').replace(/\|/g, ' ');
var mapImg = s.contact_map_image || './img/secret.webp';
return '