/* ==========================================================================
   Student Welcome Guide — personal route results page (my-route/)
   Reads the answers from the URL query string, renders a tailored, printable
   report into #route-report, and (optionally) sends the profile to a Google
   Form for demographics. No answers are stored unless the form is configured.
   ========================================================================== */
(function () {
    var root = document.getElementById('route-report');
    if (!root) return;

    /* --- Google Form collection (fill all values to turn it on) ------------ */
    var GOOGLE_FORM = {
        action: 'https://docs.google.com/forms/d/e/1FAIpQLSe3I53LbapUV39cKmA8JcFt_sPTeaG_9700kNfLatOofEBlKw/formResponse',
        fields: {          // entry.NNNN for each column (form question order: Role, Level, Stage, University, Faculty, City, Budget, Year, Language)
            role: 'entry.1143696964',
            level: 'entry.475640438',
            phase: 'entry.855773898',
            uni: 'entry.1327589803',
            faculty: 'entry.1625626915',
            city: 'entry.1289506114',
            budget: 'entry.1415515571',
            year: 'entry.1480786346',
            lang: 'entry.702256098'
        }
    };

    function param(name) {
        var m = new RegExp('[?&]' + name + '=([^&]*)').exec(location.search);
        return m ? decodeURIComponent(m[1].replace(/\+/g, ' ')) : '';
    }
    function esc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;'); }

    var lang = root.getAttribute('data-lang') || param('lang') || 'en';

    var P = {
        role: param('role'), level: param('level'), phase: param('phase'),
        uni: param('uni'), faculty: param('faculty'), city: param('city'),
        budget: param('budget'), year: param('year')
    };

    // Slugs (this page is a sibling of the topic pages -> ../slug/).
    var S = {
        journey: 'complete-student-journey', bachelor: 'bachelor-application', master: 'master-application',
        deadlines: 'application-deadlines', evs: 'evs-application-guide', recognition: 'recognition-of-education',
        documents: 'document-preparation', admission: 'admission-and-enrolment', tuition: 'tuition-and-scholarships',
        residence: 'student-residence-permit', whereapply: 'where-to-apply-for-residence', means: 'means-accommodation-address',
        health: 'rm-si-3-health-insurance', healthcare: 'healthcare-in-slovenia', accommodation: 'student-accommodation',
        prepare: 'prepare-to-move', arrival: 'arrival-checklist', admin: 'administrative-basics', meals: 'student-meals',
        transport: 'student-transport', work: 'student-work', academic: 'academic-life', cities: 'study-cities',
        budget: 'student-budget', wellbeing: 'wellbeing-and-community', renew: 'renew-change-graduate', sources: 'official-sources-and-checklists'
    };

    var T = {
        en: {
            title: 'Your personal study route', generatedOn: 'Generated on', profile: 'Your profile',
            introStudent: 'Here is a tailored overview for your studies in Slovenia. Follow the steps in order and open the linked pages when you need the detail.',
            introParent: 'Here is a tailored overview to help the student you support. Follow the steps in order and open the linked pages when you need the detail.',
            stepsHead: 'Your next steps', focusHead: 'What matters most for you', linksHead: 'Key pages for you',
            print: 'Save as PDF or print', edit: 'Change my answers', viber: 'Ask in our Viber community',
            disclaimerHead: 'Please read', disclaimer: 'This report is general help, not an official decision. MSOS does not take responsibility for outdated information. Deadlines, fees, required documents, amounts, and rules change and differ by institution, so always confirm the details that matter for your case directly with the responsible university, administrative unit, embassy, or health-insurance office before you act.',
            labels: { role: 'Role', level: 'Level', phase: 'Stage', uni: 'University', faculty: 'Faculty or programme', city: 'City', budget: 'Budget', year: 'Academic year' },
            roles: { student: 'Student', parent: 'Parent or family member' },
            levels: { bachelor: 'Bachelor', master: 'Master' },
            phases: { exploring: 'Exploring', applying: 'Applying', accepted: 'Accepted', moving: 'Preparing to move', arrived: 'In Slovenia' },
            unis: { ul: 'University of Ljubljana', um: 'University of Maribor', up: 'University of Primorska', ung: 'University of Nova Gorica', other: 'Another institution' },
            cities: { ljubljana: 'Ljubljana', maribor: 'Maribor', koper: 'Koper', 'nova-gorica': 'Nova Gorica', celje: 'Celje', other: 'Another city' },
            budgets: { 'under-400': 'Under €400 / month', '400-600': '€400–600 / month', '600-800': '€600–800 / month', 'over-800': 'Over €800 / month', 'unsure': 'Not decided yet' },
            yourUni: 'your chosen university', yourCity: 'your study city',
            link: { journey: 'Your complete journey', bachelor: 'Bachelor application', master: 'Master application', deadlines: 'Current deadlines', evs: 'eVŠ step by step', recognition: 'Recognition of education', documents: 'Preparing documents', admission: 'Admission and enrolment', tuition: 'Tuition and scholarships', residence: 'Residence permit', whereapply: 'Where to apply', means: 'Means and address', health: 'Health insurance (RM/SI 3)', healthcare: 'Using healthcare', accommodation: 'Accommodation', prepare: 'Travelling and packing', arrival: 'Arrival checklist', admin: 'Admin basics', meals: 'Student meals', transport: 'Student transport', work: 'Student work', academic: 'Academic life', cities: 'Study cities', budget: 'Budget and daily life', wellbeing: 'Wellbeing and community', renew: 'Renewal and graduation', sources: 'Official sources' }
        },
        si: {
            title: 'Vaša osebna študijska pot', generatedOn: 'Ustvarjeno', profile: 'Vaš profil',
            introStudent: 'Tukaj je prilagojen pregled za vaš študij v Sloveniji. Korake izvedite po vrsti in odprite povezane strani, ko potrebujete podrobnosti.',
            introParent: 'Tukaj je prilagojen pregled v pomoč študentu, ki ga podpirate. Korake izvedite po vrsti in odprite povezane strani, ko potrebujete podrobnosti.',
            stepsHead: 'Vaši naslednji koraki', focusHead: 'Kaj je za vas najpomembnejše', linksHead: 'Ključne strani za vas',
            print: 'Shrani kot PDF ali natisni', edit: 'Spremeni odgovore', viber: 'Vprašajte v naši skupnosti na Viberju',
            disclaimerHead: 'Preberite', disclaimer: 'To poročilo je splošna pomoč, ne uradna odločba. MSOS ne prevzema odgovornosti za zastarele informacije. Roki, pristojbine, zahtevani dokumenti, zneski in pravila se spreminjajo in razlikujejo med ustanovami, zato podatke, pomembne za vaš primer, vedno preverite neposredno pri pristojni univerzi, upravni enoti, veleposlaništvu ali zdravstveni zavarovalnici, preden ukrepate.',
            labels: { role: 'Vloga', level: 'Stopnja', phase: 'Faza', uni: 'Univerza', faculty: 'Fakulteta ali program', city: 'Mesto', budget: 'Proračun', year: 'Študijsko leto' },
            roles: { student: 'Študent', parent: 'Starš ali družinski član' },
            levels: { bachelor: 'Dodiplomski', master: 'Magistrski' },
            phases: { exploring: 'Raziskujem', applying: 'Prijavljam se', accepted: 'Sprejet', moving: 'Selitev', arrived: 'V Sloveniji' },
            unis: { ul: 'Univerza v Ljubljani', um: 'Univerza v Mariboru', up: 'Univerza na Primorskem', ung: 'Univerza v Novi Gorici', other: 'Druga ustanova' },
            cities: { ljubljana: 'Ljubljana', maribor: 'Maribor', koper: 'Koper', 'nova-gorica': 'Nova Gorica', celje: 'Celje', other: 'Drugo mesto' },
            budgets: { 'under-400': 'Manj kot 400 € / mesec', '400-600': '400–600 € / mesec', '600-800': '600–800 € / mesec', 'over-800': 'Več kot 800 € / mesec', 'unsure': 'Še ni odločeno' },
            yourUni: 'izbrano univerzo', yourCity: 'vaše študijsko mesto',
            link: { journey: 'Celotna pot', bachelor: 'Dodiplomska prijava', master: 'Magistrska prijava', deadlines: 'Trenutni roki', evs: 'eVŠ korak za korakom', recognition: 'Priznavanje izobraževanja', documents: 'Priprava dokumentov', admission: 'Sprejem in vpis', tuition: 'Šolnina in štipendije', residence: 'Dovoljenje za prebivanje', whereapply: 'Kje oddati prošnjo', means: 'Sredstva in naslov', health: 'Zdravstveno zavarovanje (RM/SI 3)', healthcare: 'Uporaba zdravstva', accommodation: 'Nastanitev', prepare: 'Selitev in pakiranje', arrival: 'Kontrolni seznam ob prihodu', admin: 'Osnovna administracija', meals: 'Študentska prehrana', transport: 'Študentski prevoz', work: 'Študentsko delo', academic: 'Študijsko življenje', cities: 'Študijska mesta', budget: 'Proračun in vsakdan', wellbeing: 'Dobro počutje in skupnost', renew: 'Podaljšanje in diplomiranje', sources: 'Uradni viri' }
        },
        mk: {
            title: 'Вашиот личен студиски пат', generatedOn: 'Создадено на', profile: 'Вашиот профил',
            introStudent: 'Еве прилагоден преглед за вашите студии во Словенија. Следете ги чекорите по редослед и отворајте ги поврзаните страници кога ви требаат детали.',
            introParent: 'Еве прилагоден преглед за помош на студентот што го поддржувате. Следете ги чекорите по редослед и отворајте ги поврзаните страници кога ви требаат детали.',
            stepsHead: 'Вашите следни чекори', focusHead: 'Што е најважно за вас', linksHead: 'Клучни страници за вас',
            print: 'Зачувај како PDF или испечати', edit: 'Промени ги одговорите', viber: 'Прашајте во нашата Viber заедница',
            disclaimerHead: 'Ве молиме прочитајте', disclaimer: 'Овој извештај е општа помош, не официјална одлука. МСОС не презема одговорност за застарени информации. Роковите, таксите, потребните документи, износите и правилата се менуваат и се разликуваат по институции, па секогаш проверувајте ги деталите важни за вашиот случај директно кај надлежниот универзитет, управна единица, амбасада или здравствена осигурителна служба пред да преземете чекор.',
            labels: { role: 'Улога', level: 'Степен', phase: 'Фаза', uni: 'Универзитет', faculty: 'Факултет или програма', city: 'Град', budget: 'Буџет', year: 'Академска година' },
            roles: { student: 'Студент', parent: 'Родител или член на семејство' },
            levels: { bachelor: 'Додипломски', master: 'Магистерски' },
            phases: { exploring: 'Истражувам', applying: 'Се пријавувам', accepted: 'Примен', moving: 'Преселба', arrived: 'Во Словенија' },
            unis: { ul: 'Универзитет во Љубљана', um: 'Универзитет во Марибор', up: 'Универзитет на Приморска', ung: 'Универзитет во Нова Горица', other: 'Друга институција' },
            cities: { ljubljana: 'Љубљана', maribor: 'Марибор', koper: 'Копер', 'nova-gorica': 'Нова Горица', celje: 'Целје', other: 'Друг град' },
            budgets: { 'under-400': 'Под 400 € / месец', '400-600': '400–600 € / месец', '600-800': '600–800 € / месец', 'over-800': 'Над 800 € / месец', 'unsure': 'Сè уште не одлучено' },
            yourUni: 'избраниот универзитет', yourCity: 'вашиот град на студирање',
            link: { journey: 'Целосниот пат', bachelor: 'Додипломска пријава', master: 'Магистерска пријава', deadlines: 'Тековни рокови', evs: 'eVŠ чекор по чекор', recognition: 'Признавање на образование', documents: 'Подготовка на документи', admission: 'Прием и запишување', tuition: 'Школарина и стипендии', residence: 'Дозвола за престој', whereapply: 'Каде да поднесете', means: 'Средства и адреса', health: 'Здравствено осигурување (RM/SI 3)', healthcare: 'Користење здравство', accommodation: 'Сместување', prepare: 'Патување и пакување', arrival: 'Листа по пристигнување', admin: 'Основна администрација', meals: 'Студентска исхрана', transport: 'Студентски превоз', work: 'Студентска работа', academic: 'Академски живот', cities: 'Студентски градови', budget: 'Буџет и секојдневие', wellbeing: 'Благосостојба и заедница', renew: 'Обнова и дипломирање', sources: 'Официјални извори' }
        }
    };
    var t = T[lang] || T.en;

    // Ordered step templates per phase. {uni}/{city}/{levelWord} interpolated; link is a key of S.
    var STEPS = {
        exploring: [
            { link: 'journey', en: 'Compare programmes and universities before you settle on a city.', si: 'Primerjajte programe in univerze, preden se odločite za mesto.', mk: 'Споредете програми и универзитети пред да се одлучите за град.' },
            { link: '{levelPage}', en: 'Read the {levelWord} application overview and its conditions.', si: 'Preberite pregled prijave na {levelWord} študij in pogoje.', mk: 'Прочитајте го прегледот за {levelWord} студии и условите.' },
            { link: 'deadlines', en: 'Check the current application deadlines for {uni}.', si: 'Preverite trenutne prijavne roke za {uni}.', mk: 'Проверете ги тековните рокови за {uni}.' },
            { link: 'tuition', en: 'Check tuition and scholarships for your situation.', si: 'Preverite šolnino in štipendije za vaš primer.', mk: 'Проверете ги школарината и стипендиите за вашата ситуација.' }
        ],
        applying: [
            { link: 'documents', en: 'Prepare and translate your document package for {uni}.', si: 'Pripravite in prevedite paket dokumentov za {uni}.', mk: 'Подгответе и преведете го пакетот документи за {uni}.' },
            { link: 'evs', en: 'Submit your application through eVŠ and save the confirmation.', si: 'Oddajte prijavo prek eVŠ in shranite potrdilo.', mk: 'Поднесете ја пријавата преку eVŠ и зачувајте ја потврдата.' },
            { link: 'recognition', en: 'Start recognition of your foreign education inside the application.', si: 'Znotraj prijave začnite priznavanje tujega izobraževanja.', mk: 'Во пријавата започнете го признавањето на странското образование.' },
            { link: 'deadlines', en: 'Track the document deadline and result date for {uni}.', si: 'Spremljajte rok za dokumente in datum rezultatov za {uni}.', mk: 'Следете го рокот за документи и датумот на резултати за {uni}.' }
        ],
        accepted: [
            { link: 'admission', en: 'Read the faculty enrolment instructions and complete your enrolment.', si: 'Preberite navodila fakultete za vpis in dokončajte vpis.', mk: 'Прочитајте ги упатствата за упис и завршете го уписот.' },
            { link: 'admission', en: 'Request your certificate of enrolment (potrdilo o vpisu).', si: 'Zaprosite za potrdilo o vpisu.', mk: 'Побарајте потврда за упис (potrdilo o vpisu).' },
            { link: 'residence', en: 'Begin the temporary residence permit and RM/SI 3 health steps in parallel.', si: 'Vzporedno začnite dovoljenje za prebivanje in zdravstvo RM/SI 3.', mk: 'Паралелно започнете ги дозволата за престој и здравството RM/SI 3.' },
            { link: 'accommodation', en: 'Arrange accommodation in {city} as early as possible.', si: 'Čim prej uredite nastanitev v mestu {city}.', mk: 'Средете сместување во {city} што е можно поскоро.' }
        ],
        moving: [
            { link: 'residence', en: 'Arrange your temporary residence permit for study before or on arrival.', si: 'Uredite dovoljenje za začasno prebivanje za študij pred prihodom ali ob njem.', mk: 'Средете дозвола за привремен престој пред или при пристигнувањето.' },
            { link: 'health', en: 'Obtain the Macedonian RM/SI 3 health-insurance form where eligible.', si: 'Pridobite makedonski obrazec RM/SI 3, če ste upravičeni.', mk: 'Обезбедете го македонскиот образец RM/SI 3 ако имате право.' },
            { link: 'means', en: 'Organise accommodation and plan address registration in {city}.', si: 'Uredite nastanitev in načrtujte prijavo naslova v mestu {city}.', mk: 'Организирајте сместување и планирајте пријава на адреса во {city}.' },
            { link: 'prepare', en: 'Pack originals of your education and residence documents in hand luggage.', si: 'V ročno prtljago spravite izvirnike dokumentov.', mk: 'Спакувајте ги оригиналите од документите во рачен багаж.' }
        ],
        arrived: [
            { link: 'means', en: 'Register your address at the administrative unit within eight days.', si: 'V osmih dneh prijavite naslov na upravni enoti.', mk: 'Пријавете ја адресата во управната единица во рок од осум дена.' },
            { link: 'health', en: 'Submit RM/SI 3 to ZZZS and activate your health insurance.', si: 'Oddajte RM/SI 3 na ZZZS in aktivirajte zavarovanje.', mk: 'Поднесете RM/SI 3 до ЗЗЗС и активирајте го осигурувањето.' },
            { link: 'meals', en: 'Activate student meals and student transport in {city}.', si: 'Aktivirajte študentsko prehrano in prevoz v mestu {city}.', mk: 'Активирајте студентска исхрана и превоз во {city}.' },
            { link: 'renew', en: 'Note your residence and insurance expiry dates and renew before 30 September.', si: 'Zabeležite datume poteka in podaljšajte pred 30. septembrom.', mk: 'Забележете ги датумите на истекување и обновете пред 30 септември.' }
        ]
    };

    var CITY_FOCUS = {
        ljubljana: { en: 'Ljubljana has the highest housing pressure, so start the accommodation search very early and consider a room on a direct bus route rather than the centre.', si: 'V Ljubljani je največ povpraševanja po nastanitvi, zato začnite iskati zgodaj in razmislite o sobi ob neposredni avtobusni liniji namesto v središču.', mk: 'Љубљана има најголем притисок за сместување, па почнете со барањето многу рано и размислете за соба на директна автобуска линија наместо во центарот.', link: 'accommodation' },
        maribor: { en: 'Maribor is more affordable, and University of Maribor dorms publish economic prices for foreign students. Check the room type and whether the address can be registered.', si: 'Maribor je cenovno ugodnejši, domovi UM pa objavljajo ekonomske cene za tuje študente. Preverite vrsto sobe in možnost prijave naslova.', mk: 'Марибор е поповолен, а домовите на УМ објавуваат економски цени за странски студенти. Проверете го типот соба и дали адресата може да се пријави.', link: 'accommodation' },
        koper: { en: 'On the coast, housing demand is seasonal. Confirm summer availability and how coastal transport connects your room to the faculty.', si: 'Na obali je povpraševanje sezonsko. Preverite poletno razpoložljivost in kako obalni prevoz povezuje sobo s fakulteto.', mk: 'На брегот побарувачката е сезонска. Потврдете ја летната достапност и како приморскиот превоз ја поврзува собата со факултетот.', link: 'accommodation' },
        'nova-gorica': { en: 'Never assume that accommodation in Gorizia, Italy, has the same residence, health, and tax consequences as living in Nova Gorica, Slovenia.', si: 'Nikoli ne domnevajte, da ima nastanitev v Gorici v Italiji enake posledice za prebivanje, zdravstvo in davke kot bivanje v Novi Gorici.', mk: 'Никогаш не претпоставувајте дека сместувањето во Горица, Италија, има исти последици за престој, здравство и данок како во Нова Горица.', link: 'accommodation' },
        celje: { en: 'In smaller centres, check exactly where teaching happens and build housing and transport around that location, using the specific faculty and local clubs.', si: 'V manjših središčih preverite, kje potekajo predavanja, in nastanitev ter prevoz gradite okoli te lokacije.', mk: 'Во помалите центри проверете каде точно се одржува наставата и градете сместување и превоз околу таа локација.', link: 'cities' }
    };

    function labelOr(dict, key, fallback) { return (key && dict[key]) ? dict[key] : fallback; }

    function render() {
        var uniText = labelOr(t.unis, P.uni, t.yourUni);
        var cityText = labelOr(t.cities, P.city, t.yourCity);
        var levelKey = P.level === 'master' ? 'master' : 'bachelor';
        var levelWord = (t.levels[levelKey] || '').toLowerCase();

        // Profile chips
        var chips = [];
        function chip(labelKey, value) { if (value) chips.push('<div class="route-chip"><span>' + esc(t.labels[labelKey]) + '</span><strong>' + esc(value) + '</strong></div>'); }
        chip('role', labelOr(t.roles, P.role, ''));
        chip('level', labelOr(t.levels, P.level, ''));
        chip('phase', labelOr(t.phases, P.phase, ''));
        chip('uni', labelOr(t.unis, P.uni, ''));
        chip('faculty', P.faculty);
        chip('city', labelOr(t.cities, P.city, ''));
        chip('budget', labelOr(t.budgets, P.budget, ''));
        chip('year', P.year);

        // Steps
        var steps = (STEPS[P.phase] || STEPS.exploring).map(function (step) {
            var text = (step[lang] || step.en).replace('{uni}', uniText).replace('{city}', cityText).replace('{levelWord}', levelWord);
            var linkKey = step.link === '{levelPage}' ? levelKey : step.link;
            var slug = linkKey && S[linkKey];
            var li = esc(text);
            if (slug) li += ' <a href="../' + slug + '/">' + esc(t.link[linkKey] || linkKey) + ' →</a>';
            return '<li>' + li + '</li>';
        }).join('');

        // Focus tips (city + budget + role + level)
        var focus = [];
        function tip(text, linkKey) {
            var s = esc(text);
            if (linkKey && S[linkKey]) s += ' <a href="../' + S[linkKey] + '/">' + esc(t.link[linkKey]) + ' →</a>';
            focus.push('<li>' + s + '</li>');
        }
        if (P.city && CITY_FOCUS[P.city]) { var c = CITY_FOCUS[P.city]; tip(c[lang] || c.en, c.link); }
        if (P.budget === 'under-400') tip(lang === 'si' ? 'Ta proračun je blizu zahtevanega minimuma sredstev za dovoljenje (okoli 507,43 € na mesec), zato načrtujte rezervo za prvi mesec.' : lang === 'mk' ? 'Овој буџет е близу бараниот минимум средства за дозвола (околу 507,43 € месечно), па планирајте резерва за првиот месец.' : 'This budget is close to the residence-permit means minimum (around €507,43 per month), so plan a buffer for the expensive first month.', 'budget');
        else if (P.budget === 'unsure') tip(lang === 'si' ? 'Za realen mesečni in prvi-mesečni proračun po mestih si oglejte stran o proračunu.' : lang === 'mk' ? 'За реален месечен и прв-месечен буџет по градови видете ја страницата за буџет.' : 'For a realistic monthly and first-month budget by city, see the budget page.', 'budget');
        else if (P.budget) tip(lang === 'si' ? 'Vseeno ločeno načrtujte dražji prvi mesec (varščina, pristojbine, prevodi, selitev).' : lang === 'mk' ? 'Сепак планирајте одделно за поскапиот прв месец (депозит, такси, преводи, преселба).' : 'Still budget separately for the more expensive first month (deposit, fees, translations, moving).', 'budget');
        if (P.role === 'parent') tip(lang === 'si' ? 'Kot podpornik boste pogosto potrebovali izjavo starša o sredstvih; pripravite jo v angleščini, slovenščini ali latinici.' : lang === 'mk' ? 'Како поддржувач честопати ќе ви треба изјава од родител за средства; подгответе ја на англиски, словенечки или со латиница.' : 'As the supporter you will often need a parent statement of means; prepare it in English, Slovenian, or Latin script.', 'means');
        if (levelKey === 'master') tip(lang === 'si' ? 'Za magistrski študij preverite združljivost področja in ali so potrebne dodatne obveznosti.' : lang === 'mk' ? 'За магистерски студии проверете ја компатибилноста на полето и дали се потребни дополнителни обврски.' : 'For master study, check field compatibility and whether additional obligations are required.', 'recognition');

        // Key links
        var linkKeys = ['journey', 'deadlines', levelKey, 'evs', 'residence', 'health', 'accommodation', 'means', 'meals', 'transport', 'budget', 'sources'];
        var seen = {}, keyLinks = [];
        linkKeys.forEach(function (k) { if (!seen[k] && S[k]) { seen[k] = 1; keyLinks.push('<a href="../' + S[k] + '/">' + esc(t.link[k]) + '</a>'); } });

        var intro = P.role === 'parent' ? t.introParent : t.introStudent;
        var now = new Date();
        var dateStr = now.getDate() + '.' + (now.getMonth() + 1) + '.' + now.getFullYear();

        root.innerHTML =
            '<div class="route-report">' +
                '<div class="route-report-head">' +
                    '<img class="route-report-logo" src="../../../images/1-logo.png" alt="MSOS">' +
                    '<div><h1>' + esc(t.title) + '</h1>' +
                    '<p class="route-report-date">' + esc(t.generatedOn) + ' ' + esc(dateStr) + ' · msosorg.com</p></div>' +
                '</div>' +
                '<p class="route-report-intro">' + esc(intro) + '</p>' +
                '<h2>' + esc(t.profile) + '</h2>' +
                '<div class="route-chips">' + chips.join('') + '</div>' +
                '<h2>' + esc(t.stepsHead) + '</h2>' +
                '<ol class="route-steps">' + steps + '</ol>' +
                (focus.length ? '<h2>' + esc(t.focusHead) + '</h2><ul class="route-focus">' + focus.join('') + '</ul>' : '') +
                '<div class="route-links-block"><h2>' + esc(t.linksHead) + '</h2>' +
                '<div class="route-links">' + keyLinks.join('') + '</div></div>' +
                '<div class="route-disclaimer"><strong>' + esc(t.disclaimerHead) + ':</strong> ' + esc(t.disclaimer) + '</div>' +
                '<div class="route-actions no-print">' +
                    '<button type="button" class="btn btn-primary-orange" data-action="print">' + esc(t.print) + '</button>' +
                    '<a class="btn btn-secondary" href="../">' + esc(t.edit) + '</a>' +
                '</div>' +
            '</div>';

        var printBtn = root.querySelector('[data-action="print"]');
        if (printBtn) printBtn.addEventListener('click', function () { window.print(); });
    }

    function sendProfile() {
        if (!GOOGLE_FORM.action) return;
        try {
            var body = new URLSearchParams();
            var f = GOOGLE_FORM.fields, map = { role: P.role, level: P.level, phase: P.phase, uni: P.uni, faculty: P.faculty, city: P.city, budget: P.budget, year: P.year, lang: lang };
            Object.keys(f).forEach(function (k) { if (f[k]) body.append(f[k], map[k] || ''); });
            fetch(GOOGLE_FORM.action, { method: 'POST', mode: 'no-cors', body: body });
        } catch (e) {}
    }

    render();
    sendProfile();
})();

/*
 * Google Form collection for the personal route:
 * Create a Google Form with short-answer questions for Role, Level, Stage,
 * University, Faculty, City, Budget, Year, Language. Get a pre-filled link,
 * then fill GOOGLE_FORM.action (the .../formResponse URL) and each entry.NNNN
 * into GOOGLE_FORM.fields above. Until then, nothing is sent anywhere.
 */
