115 lines
6.8 KiB
JavaScript
115 lines
6.8 KiB
JavaScript
/* ==========================================================================
|
||
Student Welcome Guide — "Build my personal route" (configurator)
|
||
Fills the selects on the landing page and, on submit, sends the visitor to
|
||
the personal results page (my-route/) with their answers in the URL.
|
||
The results page (my-route.js) renders the tailored, printable report.
|
||
========================================================================== */
|
||
(function () {
|
||
var root = document.querySelector('.guide-route');
|
||
if (!root) return;
|
||
var lang = root.getAttribute('data-lang') || 'en';
|
||
|
||
var T = {
|
||
en: {
|
||
need: 'Please choose at least your level and your current stage.',
|
||
pick: 'Select',
|
||
roles: { student: 'Student', parent: 'Parent or family member' },
|
||
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' },
|
||
budgets: { 'under-400': 'Under €400 per month', '400-600': '€400 to €600 per month', '600-800': '€600 to €800 per month', 'over-800': 'Over €800 per month', 'unsure': 'Not sure yet' }
|
||
},
|
||
si: {
|
||
need: 'Izberite vsaj stopnjo študija in vašo trenutno fazo.',
|
||
pick: 'Izberite',
|
||
roles: { student: 'Študent', parent: 'Starš ali družinski član' },
|
||
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' },
|
||
budgets: { 'under-400': 'Manj kot 400 € na mesec', '400-600': '400 do 600 € na mesec', '600-800': '600 do 800 € na mesec', 'over-800': 'Več kot 800 € na mesec', 'unsure': 'Še nisem prepričan' }
|
||
},
|
||
mk: {
|
||
need: 'Изберете барем степен на студии и вашата тековна фаза.',
|
||
pick: 'Изберете',
|
||
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': 'Сè уште не сум сигурен' }
|
||
}
|
||
};
|
||
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 (!sel) return;
|
||
if (withPick) sel.appendChild(opt('', t.pick + '…'));
|
||
Object.keys(obj).forEach(function (k) { sel.appendChild(opt(k, obj[k])); });
|
||
}
|
||
|
||
var selRole = root.querySelector('[data-role="role"]');
|
||
var selLevel = root.querySelector('[data-role="level"]');
|
||
var selPhase = root.querySelector('[data-role="phase"]');
|
||
var selUni = root.querySelector('[data-role="uni"]');
|
||
var facInput = root.querySelector('[data-role="faculty"]');
|
||
var selCity = root.querySelector('[data-role="city"]');
|
||
var selBudget = root.querySelector('[data-role="budget"]');
|
||
var selYear = root.querySelector('[data-role="year"]');
|
||
var result = root.querySelector('.guide-route-result');
|
||
|
||
fillSelect(selRole, t.roles, true);
|
||
fillSelect(selLevel, t.levels, true);
|
||
fillSelect(selPhase, t.phases, true);
|
||
fillSelect(selUni, t.unis, true);
|
||
fillSelect(selCity, t.cities, true);
|
||
fillSelect(selBudget, t.budgets, true);
|
||
['2026/2027', '2027/2028'].forEach(function (y) { selYear.appendChild(opt(y, y)); });
|
||
|
||
function esc(s) { return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); }
|
||
|
||
function collect() {
|
||
return {
|
||
role: selRole ? selRole.value : '',
|
||
level: selLevel.value,
|
||
phase: selPhase.value,
|
||
uni: selUni.value,
|
||
faculty: facInput ? facInput.value.replace(/^\s+|\s+$/g, '') : '',
|
||
city: selCity.value,
|
||
budget: selBudget ? selBudget.value : '',
|
||
year: selYear.value
|
||
};
|
||
}
|
||
|
||
// Exposed for the test harness; returns the results URL, or null if incomplete.
|
||
function buildUrl() {
|
||
var v = collect();
|
||
if (!v.level || !v.phase) return null;
|
||
var parts = [];
|
||
Object.keys(v).forEach(function (k) { if (v[k]) parts.push(k + '=' + encodeURIComponent(v[k])); });
|
||
parts.push('lang=' + encodeURIComponent(lang));
|
||
return 'my-route/?' + parts.join('&');
|
||
}
|
||
window.__msosRouteUrl = buildUrl;
|
||
|
||
function build() {
|
||
var url = buildUrl();
|
||
if (!url) {
|
||
result.hidden = false;
|
||
result.innerHTML = '<p class="guide-route-context">' + esc(t.need) + '</p>';
|
||
return;
|
||
}
|
||
window.location.href = url;
|
||
}
|
||
|
||
root.querySelector('[data-action="build"]').addEventListener('click', build);
|
||
root.querySelector('[data-action="reset"]').addEventListener('click', function () {
|
||
[selRole, selLevel, selPhase, selUni, selCity, selBudget].forEach(function (s) { if (s) s.value = ''; });
|
||
if (facInput) facInput.value = '';
|
||
selYear.value = '2026/2027';
|
||
result.hidden = true; result.innerHTML = '';
|
||
});
|
||
})();
|