EU Courses @MyCareerVerse.ie

EU Courses Explorer | MyCareerVerse

EU Courses Explorer

Discover English-taught degree programmes across Europe

Showing 0 of 0 courses across 0 countries
Course University City Country Actions

Data sourced from official university websites. Always verify with institutions.

// ============================================ // EU COURSES FAVOURITES // Separate localStorage key from Irish courses // ============================================ const EU_FAV_KEY = 'mcv_eu_favourites'; function euCourseKey(course) { return (course.EU_course || '') + '|' + (course.University || ''); } function loadEuFavourites() { try { var raw = localStorage.getItem(EU_FAV_KEY); return raw ? JSON.parse(raw) : []; } catch (e) { console.error('Error reading EU favourites:', e); return []; } } function saveEuFavourites(list) { localStorage.setItem(EU_FAV_KEY, JSON.stringify(list)); syncEuFavouritesToServer(list); } function isEuFavourite(course) { var key = euCourseKey(course); var favs = loadEuFavourites(); return favs.some(function(f) { return f.key === key; }); } function toggleEuFavourite(index) { var course = courseData[index]; var key = euCourseKey(course); var favs = loadEuFavourites(); if (favs.some(function(f) { return f.key === key; })) { favs = favs.filter(function(f) { return f.key !== key; }); } else { favs.push({ key: key, eu_course: course.EU_course, university: course.University, city: course.City, country: course.Country, link: course.Link, info: course.Info || '' }); } saveEuFavourites(favs); applyFilters(); } function removeEuFavouriteByKey(key) { var favs = loadEuFavourites(); favs = favs.filter(function(f) { return f.key !== key; }); saveEuFavourites(favs); } // ── Server Sync ── var euSyncTimeout = null; function syncEuFavouritesToServer(list) { if (typeof mcvRestNonce === 'undefined' || !mcvRestNonce) return; if (euSyncTimeout) clearTimeout(euSyncTimeout); euSyncTimeout = setTimeout(function() { fetch('/?rest_route=/mcv/v1/save-eu-favourites', { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': mcvRestNonce }, body: JSON.stringify({ favourites: list }) }) .then(function(response) { return response.json(); }) .then(function(data) { if (data.success) { console.log('EU favourites synced:', data.count, 'courses'); } }) .catch(function(error) { console.error('EU favourites sync error:', error); }); }, 1000); } function loadEuFavouritesFromServer() { if (typeof mcvRestNonce === 'undefined' || !mcvRestNonce) return; fetch('/?rest_route=/mcv/v1/get-eu-favourites', { method: 'GET', credentials: 'same-origin', headers: { 'X-WP-Nonce': mcvRestNonce } }) .then(function(response) { return response.json(); }) .then(function(data) { if (data.favourites && data.favourites.length > 0) { var localFavs = loadEuFavourites(); var merged = mergeEuFavourites(localFavs, data.favourites); localStorage.setItem(EU_FAV_KEY, JSON.stringify(merged)); if (merged.length > data.favourites.length) { syncEuFavouritesToServer(merged); } if (typeof applyFilters === 'function') applyFilters(); } }) .catch(function(error) { console.error('Error loading EU favourites:', error); }); } function mergeEuFavourites(localFavs, serverFavs) { var merged = serverFavs.slice(); var existingKeys = {}; serverFavs.forEach(function(f) { existingKeys[f.key] = true; }); localFavs.forEach(function(fav) { if (!existingKeys[fav.key]) { merged.push(fav); } }); return merged; } // ── Heart Icon Builder ── function buildHeartButton(index, course) { var active = isEuFavourite(course); var iconClass = active ? 'bi-heart-fill text-danger' : 'bi-heart'; var title = active ? 'Remove from favourites' : 'Add to favourites'; return ''; } // ============================================ // TABLE LOGIC // ============================================ $(document).ready(function() { // Guard: wait for compressed data to decompress into courseData if (typeof courseData === 'undefined' || !courseData.length) { console.error('courseData not available – check inline data script loads before this file.'); return; } initializeTable(); populateFilters(); updateStats(); setupEventListeners(); loadEuFavouritesFromServer(); }); function buildRow(course, index) { return { EU_course: '' + course.EU_course + '', University: '' + course.University + '', City: '' + course.City + '', Country: '' + course.Country + '', action: buildHeartButton(index, course) + '' + '' }; } function initializeTable() { var formattedData = courseData.map(function(course, index) { return buildRow(course, index); }); $('#courseTable').bootstrapTable('destroy').bootstrapTable({ data: formattedData }); } function showInfo(index) { var course = courseData[index]; $('#modalCourseName').text(course.EU_course); $('#modalUniversity').text(course.University); $('#modalCity').text(course.City); $('#modalCountry').text(course.Country); $('#modalInfo').text(course.Info || 'No additional information available.'); $('#modalLink').attr('href', course.Link); new bootstrap.Modal(document.getElementById('infoModal')).show(); } function populateFilters() { var countrySet = {}; courseData.forEach(function(c) { countrySet[c.Country] = true; }); var countries = Object.keys(countrySet).sort(); countries.forEach(function(country) { $('#countryFilter').append(''); }); } function updateUniversityFilter(selectedCountry) { var $uniFilter = $('#universityFilter'); $uniFilter.empty(); if (!selectedCountry) { $uniFilter.append(''); $uniFilter.prop('disabled', true); } else { $uniFilter.prop('disabled', false); $uniFilter.append(''); var uniSet = {}; courseData.forEach(function(c) { if (c.Country === selectedCountry) uniSet[c.University] = true; }); Object.keys(uniSet).sort().forEach(function(uni) { $uniFilter.append(''); }); } } function updateStats() { var countrySet = {}; courseData.forEach(function(c) { countrySet[c.Country] = true; }); $('#totalCourses').text(courseData.length); $('#totalCountries').text(Object.keys(countrySet).length); $('#filteredCount').text(courseData.length); } function setupEventListeners() { $('#searchInput').on('keyup', debounce(applyFilters, 300)); $('#countryFilter').on('change', function() { updateUniversityFilter($(this).val()); applyFilters(); }); $('#universityFilter').on('change', applyFilters); $('#clearFilters').on('click', function() { $('#searchInput').val(''); $('#countryFilter').val(''); updateUniversityFilter(''); applyFilters(); }); } function applyFilters() { var searchTerm = $('#searchInput').val().toLowerCase().trim(); var countryFilter = $('#countryFilter').val(); var universityFilter = $('#universityFilter').val(); var formattedData = []; courseData.forEach(function(course, index) { var matchesSearch = !searchTerm || course.EU_course.toLowerCase().indexOf(searchTerm) !== -1 || course.University.toLowerCase().indexOf(searchTerm) !== -1 || course.City.toLowerCase().indexOf(searchTerm) !== -1; var matchesCountry = !countryFilter || course.Country === countryFilter; var matchesUniversity = !universityFilter || course.University === universityFilter; if (matchesSearch && matchesCountry && matchesUniversity) { formattedData.push(buildRow(course, index)); } }); $('#courseTable').bootstrapTable('load', formattedData); $('#filteredCount').text(formattedData.length); } function debounce(func, wait) { var timeout; return function() { var args = arguments; var context = this; clearTimeout(timeout); timeout = setTimeout(function() { func.apply(context, args); }, wait); }; } //# sourceURL=ltplelayer-3317-js-after /* ]]> */