/* ==========================================================================
Student Welcome Guide — "Build my route"
Client-side personalised checklist for the guide landing page.
The landing page sets
.
Links point to sibling guide pages (../
/) and only reference pages
that exist, so there are no dead links.
========================================================================== */
(function () {
var root = document.querySelector('.guide-route');
if (!root) return;
var lang = root.getAttribute('data-lang') || 'en';
// Slugs of pages that exist and are safe to link to.
var S = {
journey: 'complete-student-journey',
bachelor: 'bachelor-application',
master: 'master-application',
deadlines: 'application-deadlines',
evs: 'evs-application-guide'
};
var T = {
en: {
heading: 'Build my route',
sub: 'Answer a few questions and we will outline your next steps.',
build: 'Show my route',
reset: 'Reset',
need: 'Please choose at least your level and your current stage.',
resultHead: 'Your route',
contextParts: { level: 'Level', phase: 'Stage', uni: 'Institution', city: 'City', year: 'Academic year' },
fields: {
level: 'Level of study', phase: 'Where are you now?', uni: 'University', city: 'Study city', year: 'Academic year'
},
pick: 'Select',
levels: { bachelor: 'Bachelor', master: 'Master' },
phases: { exploring: 'I am exploring', applying: 'I am applying', accepted: 'I have been accepted', moving: 'I am preparing to move', arrived: 'I am already 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' },
yourUni: 'your chosen university', yourCity: 'your study city',
link: { journey: 'the full journey', bachelor: 'the bachelor application', master: 'the master application', deadlines: 'current deadlines', evs: 'the eVŠ guide' }
},
si: {
heading: 'Ustvari mojo pot',
sub: 'Odgovorite na nekaj vprašanj in orisali bomo vaše naslednje korake.',
build: 'Prikaži mojo pot',
reset: 'Ponastavi',
need: 'Izberite vsaj stopnjo študija in vašo trenutno fazo.',
resultHead: 'Vaša pot',
contextParts: { level: 'Stopnja', phase: 'Faza', uni: 'Institucija', city: 'Mesto', year: 'Študijsko leto' },
fields: {
level: 'Stopnja študija', phase: 'Kje ste zdaj?', uni: 'Univerza', city: 'Študijsko mesto', year: 'Študijsko leto'
},
pick: 'Izberite',
levels: { bachelor: 'Dodiplomski', master: 'Magistrski' },
phases: { exploring: 'Šele raziskujem', applying: 'Prijavljam se', accepted: 'Sprejet sem', moving: 'Pripravljam se na selitev', arrived: 'Sem že 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' },
yourUni: 'izbrano univerzo', yourCity: 'vaše študijsko mesto',
link: { journey: 'celotno pot', bachelor: 'prijavo na dodiplomski študij', master: 'prijavo na magistrski študij', deadlines: 'trenutne roke', evs: 'navodila za eVŠ' }
},
mk: {
heading: 'Создади го мојот пат',
sub: 'Одговорете на неколку прашања и ќе ги оцртаме вашите следни чекори.',
build: 'Прикажи го мојот пат',
reset: 'Ресетирај',
need: 'Изберете барем степен на студии и вашата тековна фаза.',
resultHead: 'Вашиот пат',
contextParts: { level: 'Степен', phase: 'Фаза', uni: 'Институција', city: 'Град', year: 'Академска година' },
fields: {
level: 'Степен на студии', phase: 'Каде сте сега?', uni: 'Универзитет', city: 'Град на студирање', year: 'Академска година'
},
pick: 'Изберете',
levels: { bachelor: 'Додипломски', master: 'Магистерски' },
phases: { exploring: 'Сè уште истражувам', applying: 'Се пријавувам', accepted: 'Примен сум', moving: 'Се подготвувам за преселба', arrived: 'Веќе сум во Словенија' },
unis: { ul: 'Универзитет во Љубљана', um: 'Универзитет во Марибор', up: 'Универзитет на Приморска', ung: 'Универзитет во Нова Горица', other: 'Друга институција' },
cities: { ljubljana: 'Љубљана', maribor: 'Марибор', koper: 'Копер', 'nova-gorica': 'Нова Горица', celje: 'Целје', other: 'Друг град' },
yourUni: 'избраниот универзитет', yourCity: 'вашиот град на студирање',
link: { journey: 'целосниот пат', bachelor: 'пријавата за додипломски', master: 'пријавата за магистерски', deadlines: 'тековните рокови', evs: 'водичот за eVŠ' }
}
};
// Step templates per phase. {uni}/{city} are interpolated; `link` is a key of S (or null).
// Each step text is provided per language.
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: 'deadlines', en: 'Check the current application deadlines for {uni}.', si: 'Preverite trenutne prijavne roke za {uni}.', mk: 'Проверете ги тековните рокови за пријавување за {uni}.' },
{ link: '{levelPage}', en: 'Read the {levelWord} application overview.', si: 'Preberite pregled prijave na {levelWord} študij.', mk: 'Прочитајте го прегледот за пријавување на {levelWord} студии.' },
{ link: null, en: 'Confirm whether any special-status exception applies to you before you rely on the standard pathway.', si: 'Preverite, ali za vas velja katera od izjem s posebnim statusom, preden se zanesete na običajno pot.', mk: 'Потврдете дали за вас важи некој исклучок со посебен статус пред да се потпрете на стандардниот пат.' }
],
applying: [
{ link: '{levelPage}', en: 'Prepare your document package for {uni}.', si: 'Pripravite 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: 'journey', en: 'Start recognition of your foreign education inside the application.', si: 'Znotraj prijave začnite postopek priznavanja 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: 'journey', en: 'Read the faculty enrolment instructions and complete your enrolment.', si: 'Preberite navodila fakultete za vpis in dokončajte vpis.', mk: 'Прочитајте ги упатствата на факултетот за упис и завршете го уписот.' },
{ link: null, en: 'Request your certificate of enrolment (potrdilo o vpisu).', si: 'Zaprosite za potrdilo o vpisu.', mk: 'Побарајте потврда за упис (potrdilo o vpisu).' },
{ link: 'journey', en: 'Begin residence, health (RM/SI 3), and housing steps in parallel.', si: 'Vzporedno začnite urejati prebivanje, zdravstvo (RM/SI 3) in nastanitev.', mk: 'Паралелно започнете ги чекорите за престој, здравство (RM/SI 3) и сместување.' },
{ link: null, en: 'Arrange accommodation in {city} as early as possible.', si: 'Čim prej uredite nastanitev v mestu {city}.', mk: 'Средете сместување во {city} што е можно поскоро.' }
],
moving: [
{ link: 'journey', 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: null, en: 'Obtain the Macedonian RM/SI 3 health-insurance form where eligible.', si: 'Pridobite makedonski obrazec RM/SI 3 za zdravstveno zavarovanje, če ste upravičeni.', mk: 'Обезбедете го македонскиот образец РМ/СИ 3 за здравствено осигурување ако имате право.' },
{ link: null, en: 'Organise accommodation and plan address registration in {city}.', si: 'Uredite nastanitev in načrtujte prijavo prebivališča v mestu {city}.', mk: 'Организирајте сместување и планирајте пријава на адреса во {city}.' },
{ link: 'journey', en: 'Pack originals of your education and residence documents in hand luggage.', si: 'V ročno prtljago spravite izvirnike izobraževalnih in bivalnih dokumentov.', mk: 'Спакувајте ги оригиналите од образовните и документите за престој во рачен багаж.' }
],
arrived: [
{ link: null, en: 'Register your address at the administrative unit within the deadline.', si: 'V roku prijavite prebivališče na upravni enoti.', mk: 'Пријавете ја адресата во управната единица во рокот.' },
{ link: null, en: 'Submit RM/SI 3 to ZZZS and activate your health insurance.', si: 'Oddajte RM/SI 3 na ZZZS in aktivirajte zdravstveno zavarovanje.', mk: 'Поднесете РМ/СИ 3 до ЗЗЗС и активирајте го здравственото осигурување.' },
{ link: null, en: 'Activate student meals and student transport in {city}.', si: 'Aktivirajte študentsko prehrano in študentski prevoz v mestu {city}.', mk: 'Активирајте студентска исхрана и студентски превоз во {city}.' },
{ link: 'journey', en: 'Track your residence and insurance expiry dates through the year.', si: 'Skozi leto spremljajte datume poteka prebivanja in zavarovanja.', mk: 'Во текот на годината следете ги датумите на истекување на престојот и осигурувањето.' }
]
};
var t = T[lang] || T.en;
function opt(value, label) {
var o = document.createElement('option');
o.value = value; o.textContent = label; return o;
}
function fillSelect(sel, obj, withPick) {
if (withPick) sel.appendChild(opt('', t.pick + '…'));
Object.keys(obj).forEach(function (k) { sel.appendChild(opt(k, obj[k])); });
}
var selLevel = root.querySelector('[data-role="level"]');
var selPhase = root.querySelector('[data-role="phase"]');
var selUni = root.querySelector('[data-role="uni"]');
var selCity = root.querySelector('[data-role="city"]');
var selYear = root.querySelector('[data-role="year"]');
var result = root.querySelector('.guide-route-result');
fillSelect(selLevel, t.levels, true);
fillSelect(selPhase, t.phases, true);
fillSelect(selUni, t.unis, true);
fillSelect(selCity, t.cities, true);
[ '2026/2027', '2027/2028' ].forEach(function (y) { selYear.appendChild(opt(y, y)); });
function esc(s) { return String(s).replace(/&/g, '&').replace(//g, '>'); }
function build() {
var level = selLevel.value, phase = selPhase.value;
if (!level || !phase) {
result.hidden = false;
result.innerHTML = '' + esc(t.need) + '
';
return;
}
var uniText = selUni.value ? t.unis[selUni.value] : t.yourUni;
var cityText = selCity.value ? t.cities[selCity.value] : t.yourCity;
var levelWord = t.levels[level].toLowerCase();
var levelPage = level === 'master' ? S.master : S.bachelor;
var ctx = [];
ctx.push(t.contextParts.level + ': ' + t.levels[level]);
ctx.push(t.contextParts.phase + ': ' + t.phases[phase]);
if (selUni.value) ctx.push(t.contextParts.uni + ': ' + t.unis[selUni.value]);
if (selCity.value) ctx.push(t.contextParts.city + ': ' + t.cities[selCity.value]);
if (selYear.value) ctx.push(t.contextParts.year + ': ' + selYear.value);
var items = STEPS[phase].map(function (step) {
var text = step[lang] || step.en;
text = text.replace('{uni}', uniText).replace('{city}', cityText).replace('{levelWord}', levelWord);
var linkKey = step.link;
if (linkKey === '{levelPage}') linkKey = level === 'master' ? 'master' : 'bachelor';
var slug = linkKey && S[linkKey];
var li = esc(text);
if (slug) {
var label = t.link[linkKey] || linkKey;
li += ' ' + esc(label) + ' →';
}
return '' + li + '';
}).join('');
result.hidden = false;
result.innerHTML =
'' + esc(t.resultHead) + '
' +
'' + esc(ctx.join(' · ')) + '
' +
'' + items + '
';
result.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
root.querySelector('[data-action="build"]').addEventListener('click', build);
root.querySelector('[data-action="reset"]').addEventListener('click', function () {
[selLevel, selPhase, selUni, selCity].forEach(function (s) { s.value = ''; });
selYear.value = '2026/2027';
result.hidden = true; result.innerHTML = '';
});
})();