<section class="course-availability-pro-level" data-behavior="course-availability-pro-level" data-course-name="W1VC" data-course-blockid="" data-course-isprocourse="true">
<div class="pro-level-1">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<h2>Find courses in your preferabel region or location</h2>
<div class="pro-level-copy">This block will be used so that the content manager
can put in caveats around travel/distances etc for UEFA C/B
and the A license as the 'ruleset' is different for each
</div>
<hr>
<div class="pro-level-location">
<p>1. Select desired location:</p>
<label>Use your current location or type in a location</label>
<button class="cta cta--primary pro-level-current-location" id="pro-level-current-location" aria-label="use current location">Use current location</button>
<button class="cta cta--primary current-location-found hidden" id="current-location-found" aria-label="location found">Location found</button>
<button class="cta cta--primary location-not-found hidden" aria-label="select desired location">Location Not Found, manually enter below</button>
<button class="cta cta--primary pro-enter-location-cta" aria-label="enter location">Enter Location</button>
<div class="pro-level-location__postcode hidden">
<div id="proLevelSearchBoxContainer">
<input type="text" id="proLevelSearchBox" class="pro-level-location__postcode-input" placeholder="Enter Location" autocomplete="off" />
</div>
</div>
</div>
<hr>
<div class="pro-level-location">
<p>2. Select desired travel distance:</p>
<label>Choose the maximum distance you wish to travel</label>
<div class="pro-level-location__distance">
<div class="pro-level-location__distance--label" aria-label="select desired travel distance" role="combobox" tabindex="0" aria-labelledby="pro-level-distance" aria-expanded="false">
<span class="filter">Select distance</span>
</div>
<div aria-expanded="false" class="pro-level-location__distance--list">
<ul>
<li tabindex="0" data-value="">Select distance</li>
<li tabindex="0" data-value="5">5 Miles</li>
<li tabindex="0" data-value="10">10 Miles</li>
<li tabindex="0" data-value="20">20 Miles</li>
<li tabindex="0" data-value="25">25 Miles +</li>
</ul>
</div>
<select class="pro-level-location__distance--select">
<option value="">Select distance</option>
<option value="5">5 Miles</option>
<option value="10">10 Miles</option>
<option value="20">20 Miles</option>
<option value="25">25 Miles +</option>
</select>
</div>
</div>
<hr style="margin-bottom: 2.4rem;">
<button class="cta cta--efl search-pro-level-course" aria-label="search course" disabled="disabled">Search</button>
</div>
</div>
<input type="hidden" class="search-longitude" value="" />
<input type="hidden" class="search-latitude" value="" />
<input type="hidden" class="search-distance" value="" />
<input type="hidden" class="search-place" value="" />
</div>
<div class="pro-level-2 hidden">
<div class="loading">
<div class="loader"></div>
<div class="efl-logo"></div>
</div>
</div>
<div class="pro-level-3 hidden">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<h2>Your nearest UEFA B course locations</h2>
<div class="pro-level-copy">
Showing UEFA B courses <span class="range"></span>
</div>
<hr>
<div class="pro-level-location__clear" role="button" tabindex="0" aria-label="clear results">Clear results</div>
<div class="course-venue-list__list">
<div class="course-venue-individual hidden" data-behaviour="course-venue-item">
<div class="course-venue-individual__inner">
<div class="course-venue-individual__information">
<div>
<h3 class="venue-dt">Monday 05 Feb 2022</h3>
</div>
<div class="course-venue-individual__distance venue-dist">35M</div>
</div>
<div class="course-venue-individual__information">
<div>
<p>Address</p>
<h3>
<div class="venue-name">VenueName 1</div>
</h3>
</div>
</div>
<div class="course-venue-individual__showhide">
<div class="schedule-cta" role="button" tabindex="0" aria-label="show schedule" aria-expanded="false" aria-level="expand" data-show="Show Schedule" data-hide="Hide Schedule">
<p>Show Schedule</p>
</div>
</div>
<div aria-expanded="false" class="course-venue-individual__content">
<div class="course-venue-individual__days">
<h3>Day One</h3>
<p>
<span class="venue-sche-dt">Wednesday 12 Sep</span>
<span class="middle-seperator">|</span>
<span class="venue-sche-time">5:00 PM - 6:00PM</span>
</p>
</div>
<div class="note">
<h3>
+ Blended Learning, Face to Face online with Teachers, Webinars & Journalling
</h3>
</div>
</div>
<a href="/" class="cta cta--efl " tabindex="0">APPLY TO ATTEND</a>
</div>
</div>
</div>
<button class="pro-level-location__show-more" data-show="Show More" data-hide="Show less">Show More</button>
</div>
</div>
</div>
<div class="pro-level-4 hidden">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<div class="pro-level-location__alert">
<div class="pro-level-location__alert--title">No Courses Found</div>
<div class="pro-level-location__alert--info">There are currently no courses available</div>
<p>Course currently not available in desired location. Try expanding your location radius </p>
<div class="pro-level-location__distance">
<div class="pro-level-location__distance--label" role="combobox" tabindex="0" aria-labelledby="pro-level-distance" aria-expanded="false">
<span class="filter">5 Miles</span>
</div>
<div aria-expanded="false" class="pro-level-location__distance--list">
<ul>
<li tabindex="0" data-value="5">5 Miles</li>
<li tabindex="0" data-value="10">10 Miles</li>
<li tabindex="0" data-value="20">20 Miles</li>
<li tabindex="0" data-value="25">25 Miles +</li>
</ul>
</div>
<select class="pro-level-location__distance--select">
<option value="5">5 Miles</option>
<option value="10">10 Miles</option>
<option value="20">20 Miles</option>
<option value="25">25 Miles +</option>
</select>
</div>
</div>
</div>
</div>
</div>
<div class="pro-level-5 hidden">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<div class="pro-level-location__alert">
<div class="pro-level-location__alert--title">No Courses Found</div>
<div class="pro-level-location__alert--info">Check back again later</div>
<p>Course currently not available in desired location. Try expanding your location radius</p>
<button class="cta cta--efl start-new-search" aria-label="no sourse found, start new search">START A NEW SEARCH</button>
</div>
</div>
</div>
</div>
<div class="pro-level-6 hidden">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<div class="pro-level-location__alert">
<div class="pro-level-location__alert--title">DISTANCE ALERT</div>
<div class="pro-level-location__alert--info">Please note that you are advised apply
for a course close to your location</div>
<p>If you are applying for a course that is a sigificant distance from your location there is a higher chance your application may be rejected</p>
<button class="cta cta--efl distance-range-alert" aria-label="next">Next</button>
</div>
</div>
</div>
</div>
</section>
No notes defined.
{
"cta1": {
"copy": "Use current location",
"modifier": "primary",
"id": "pro-level-current-location",
"additionalClass": "pro-level-current-location"
},
"cta2": {
"copy": "Search",
"modifier": "efl",
"href": "",
"additionalClass": "search-pro-level-course"
},
"cta3": {
"copy": "Location found",
"modifier": "primary",
"id": "current-location-found",
"additionalClass": "current-location-found hidden"
},
"cta4": {
"copy": "START A NEW SEARCH",
"modifier": "efl",
"href": "",
"additionalClass": "start-new-search"
},
"cta5": {
"copy": "Next",
"modifier": "efl",
"href": "",
"additionalClass": "distance-range-alert"
},
"cta6": {
"copy": "Location Not Found, manually enter below",
"modifier": "primary",
"href": "",
"additionalClass": "location-not-found hidden"
},
"cta7": {
"copy": "Enter Location",
"modifier": "primary",
"href": "",
"additionalClass": "pro-enter-location-cta"
},
"course-availability": {
"signed-in-online-cta": {
"copy": "APPLY TO ATTEND",
"modifier": "efl"
},
"hide-space-left": true
}
}
import { Dialog } from '../lightbox-overlay/lightbox-overlay';
import courseVenueItem from '../course-venue-result/individual/course-venue-individual';
export default parentElement => {
const DIALOG_ID = 'pro-level-courses-dialog';
const {
courseName,
courseBlockid,
courseIsprocourse,
} = parentElement.dataset;
const headers = {
// 'Ocp-Apim-Subscription-Key': '8279c7fab35f432daf1a0bd395a9ae48',
};
const currentBtn = parentElement.querySelector('.pro-level-current-location');
const locationFound = parentElement.querySelector('.current-location-found');
const locationNotFound = parentElement.querySelector('.location-not-found');
const enterLocationCta = parentElement.querySelector(
'.pro-enter-location-cta'
);
const map = parentElement.querySelector('.MicrosoftMap');
const dropdownDivAll = parentElement.querySelectorAll(
'.pro-level-location__distance--label'
);
const MOBILE_BREAKPOINT = 820;
const selectAll = parentElement.querySelectorAll(
'.pro-level-location__distance--select'
);
const searchBlock = parentElement.querySelector(
'.pro-level-location__postcode'
);
const searchBox = parentElement.querySelector('#proLevelSearchBox');
const longitudeInput = parentElement.querySelector('.search-longitude');
const latitudeInput = parentElement.querySelector('.search-latitude');
const distanceVal = parentElement.querySelector('.search-distance');
const searchPlace = parentElement.querySelector('.search-place');
const searchBtn = parentElement.querySelector('.search-pro-level-course');
const step1 = parentElement.querySelector('.pro-level-1');
const step2 = parentElement.querySelector('.pro-level-2');
const step3 = parentElement.querySelector('.pro-level-3');
const step4 = parentElement.querySelector('.pro-level-4');
const step5 = parentElement.querySelector('.pro-level-5');
const loadMoreCta = parentElement.querySelector(
'.pro-level-location__show-more'
);
const defaultCount = 3;
let totalPage = 0;
const htmlClone = parentElement.querySelector('.course-venue-individual');
const clearBtn = parentElement.querySelector('.pro-level-location__clear');
const startNewSearch = parentElement.querySelector('.start-new-search');
let distance1 = true;
let distance2 = true;
let distance3 = true;
let distance4 = true;
const dateFormater = (dateStr, year) => {
const stDate = new Date(dateStr);
const weekday = [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
];
const month = [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec',
];
const stDay = weekday[stDate.getDay()];
const stDt =
stDate.getDate() > 10 ? stDate.getDate() : `0${stDate.getDate()}`;
const stMonth = month[stDate.getMonth()];
if (year) {
return `${stDay} ${stDt} ${stMonth} ${stDate.getFullYear()}`;
}
return `${stDay} ${stDt} ${stMonth}`;
};
const numToWord = num => {
const str = [
'',
'One',
'Two',
'Three',
'Four',
'Five',
'Six',
'Seven',
'Eight',
'Nine',
'Ten',
];
return str[num] ? str[num] : num;
};
const validateForm = () => {
if (!longitudeInput.value || !latitudeInput.value || !distanceVal.value) {
searchBtn.setAttribute('disabled', 'disabled');
return;
}
searchBtn.removeAttribute('disabled');
};
const searchByCurrentLocation = target => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
position => {
longitudeInput.value = position.coords.longitude;
latitudeInput.value = position.coords.latitude;
searchPlace.value = '';
target.querySelector('.loading').remove();
target.classList.remove('searching');
target.classList.add('hidden');
locationFound.classList.remove('hidden');
locationFound.focus();
validateForm();
},
error => {
console.log(error);
target.classList.remove('searching');
target.querySelector('.loading').remove();
target.classList.add('hidden');
locationNotFound.classList.remove('hidden');
searchBlock.classList.remove('hidden');
}
);
} else {
// eslint-disable-next-line no-console
console.log('Geolocation is not supported by this browser.');
}
};
const searchByLocation = event => {
event.preventDefault();
const { target } = event;
if (!target.classList.contains('searching')) {
target.classList.add('searching');
target.insertAdjacentHTML(
'beforeend',
'<div class="loading"><span class="efl-logo"></span><span class="loader"></span></div>'
);
}
searchByCurrentLocation(target);
};
function loadMapScenario() {
function selectedSuggestion(suggestionResult) {
// eslint-disable-next-line no-unused-vars
const { location, formattedSuggestion } = suggestionResult;
const { longitude, latitude } = location;
longitudeInput.value = longitude;
latitudeInput.value = latitude;
searchPlace.value = formattedSuggestion;
searchBox.classList.add('location-added');
// currentBtn.classList.remove('hidden');
// locationFound.classList.add('hidden');
validateForm();
}
function searchLoad() {
const options = { maxResults: 4 };
const manager = new window.Microsoft.Maps.AutosuggestManager(options);
manager.attachAutosuggest(
`#proLevelSearchBox`,
`#proLevelSearchBoxContainer`,
selectedSuggestion
);
}
function onError(message) {
// eslint-disable-next-line no-console
console.log(message);
}
const mapIntervel = setInterval(() => {
if (window.Microsoft.Maps.loadModule) {
window.Microsoft.Maps.loadModule('Microsoft.Maps.AutoSuggest', {
callback: searchLoad,
errorCallback: onError,
});
clearInterval(mapIntervel);
}
}, 100);
}
const loadBingMapSerch = () => {
const tag = document.createElement('script');
// eslint-disable-next-line no-undef
const mapScriptUrl = `//www.bing.com/api/maps/mapcontrol?key=${bingMapKey}`;
tag.setAttribute('defer', '');
tag.setAttribute('async', '');
tag.setAttribute('type', 'text/javascript');
tag.setAttribute('src', mapScriptUrl);
const firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
tag.onload = () => {
loadMapScenario();
};
};
async function searchVenueCallback(longitude, latitude) {
// replace url with `/seachVenue/` in development to see results
// const url = `/Courses/GetAvailableCourses/?postCodeLon=${longitude}
// &postCodeLat=${latitude}&courseName=${courseName}`;
let blockid = '';
if (courseBlockid) {
blockid = `&blockId=${courseBlockid}`;
}
const distance = distanceVal.value;
const url = `${
window.location.origin
}/Courses/GetAvailableCourses/?postCodeLon=${longitude}&postCodeLat=${latitude}&courseName=${courseName}&distance=${distance}&isProCourse=${courseIsprocourse}${blockid}`;
// eslint-disable-next-line compat/compat
const response = await fetch(url, {
headers,
});
return response.json();
}
const formatVenueList = sortCoursesList => {
if (sortCoursesList.length) {
const lists = parentElement.querySelectorAll('.course-venue-individual');
lists.forEach((list, index) => {
if (index) {
list.remove();
}
});
sortCoursesList.forEach(course => {
const copyHtml = htmlClone.cloneNode(true);
const listDiv = parentElement.querySelector('.course-venue-list__list');
const startDate = dateFormater(course.courseStartDate, true);
copyHtml.classList.remove('hidden');
copyHtml.querySelector('.venue-dt').innerText = startDate;
// eslint-disable-next-line radix
copyHtml.querySelector('.venue-dist').innerText = `${course.distance}M`;
copyHtml.querySelector('.venue-name').innerText = course.venueName;
// copyHtml.querySelector('.venue-addr').innerText = course.address;
const sessionHtml = copyHtml.querySelector(
'.course-venue-individual__days'
);
course.sessions.forEach((session, index) => {
const sessionsClone = sessionHtml.cloneNode(true);
// eslint-disable-next-line no-param-reassign
sessionsClone.querySelector('h3').innerText = `Day ${numToWord(
index + 1
)}`;
const dateStringArray = session.startDate.split(' ');
const monthStr = dateStringArray[dateStringArray.length - 1].slice(
0,
3
);
dateStringArray[dateStringArray.length - 1] = monthStr;
const formattedDateStr = dateStringArray.join(' ');
// eslint-disable-next-line no-param-reassign
sessionsClone.querySelector(
'.venue-sche-dt'
).innerText = formattedDateStr;
// eslint-disable-next-line no-param-reassign
sessionsClone.querySelector('.venue-sche-time').innerText = `${
session.startTime
} - ${session.endTime}`;
copyHtml
.querySelector('.course-venue-individual__content')
.insertBefore(sessionsClone, sessionHtml);
});
// remove clone object
sessionHtml.remove();
copyHtml.querySelector('.cta').href = decodeURIComponent(
course.booklinkUrl
);
listDiv.appendChild(copyHtml);
});
const courseVenueItemElements = document.querySelectorAll(
'[data-behaviour=course-venue-item]'
);
if (courseVenueItemElements) {
courseVenueItemElements.forEach(courseVenueItemElement =>
courseVenueItem(courseVenueItemElement)
);
if (totalPage <= defaultCount) {
loadMoreCta.classList.add('hidden');
} else {
loadMoreCta.classList.remove('hidden');
const items = parentElement.querySelectorAll(
'.course-venue-individual:not(.hidden)'
);
items.forEach((item, index) => {
if (index >= defaultCount) {
item.classList.add('showhide');
}
});
}
}
}
};
const setDistanceFlag = () => {
const dist = distanceVal.value;
switch (dist) {
case '5':
distance1 = false;
break;
case '10':
distance2 = false;
break;
case '20':
distance3 = false;
break;
case '25':
distance4 = false;
break;
default:
console.log(`Sorry, we are out of ${dist}.`);
}
};
const swithScreen = current => {
step1.classList.add('hidden');
step2.classList.add('hidden');
step3.classList.add('hidden');
step4.classList.add('hidden');
step5.classList.add('hidden');
current.classList.remove('hidden');
};
const resetProLevelSearch = () => {
swithScreen(step1);
distance1 = true;
distance2 = true;
distance3 = true;
distance4 = true;
longitudeInput.value = '';
latitudeInput.value = '';
searchPlace.value = '';
distanceVal.value = '';
searchBox.value = '';
searchBox.classList.remove('location-added');
currentBtn.classList.remove('hidden');
locationFound.classList.add('hidden');
locationNotFound.classList.add('hidden');
searchBlock.classList.add('hidden');
enterLocationCta.classList.remove('hidden');
const distDiv = parentElement.querySelector('.pro-level-1');
const selectDiv = distDiv.querySelector(
'.pro-level-location__distance--label span.filter'
);
const select = distDiv.querySelector(
'.pro-level-location__distance--select'
);
select.value = '';
select.dispatchEvent(new Event('change'));
selectDiv.innerText = select.options[select.selectedIndex].innerText;
validateForm();
};
const checkVenueAvailable = firstScreen => {
const longitude = longitudeInput.value;
const latitude = latitudeInput.value;
try {
searchVenueCallback(longitude, latitude).then(response => {
swithScreen(step2);
if (response && response.isCourseAvailable) {
// venueListData = response;
let locationPlace;
if (searchPlace.value) {
locationPlace = searchPlace.value;
} else {
locationPlace = 'your location';
}
if (distanceVal.value === '25') {
step3.querySelector('.range').innerText = `more than ${
distanceVal.value
} miles of, ${locationPlace}`;
} else {
step3.querySelector('.range').innerText = `within ${
distanceVal.value
} miles of, ${locationPlace}`;
}
swithScreen(step3);
setTimeout(() => {
clearBtn.focus();
}, 100);
const coursesList = response.offlineCourses;
totalPage = coursesList.length;
formatVenueList(coursesList);
// console.log(response);
} else {
setDistanceFlag();
if (!distance1 && !distance2 && !distance3 && !distance4) {
swithScreen(step5);
} else {
if (firstScreen === 'true') {
const selectDiv = step4.querySelector(
'.pro-level-location__distance--label span.filter'
);
const select = step4.querySelector(
'.pro-level-location__distance--select'
);
const select1 = step1.querySelector(
'.pro-level-location__distance--select'
);
select.value = select1.value;
selectDiv.innerText =
select1.options[select1.selectedIndex].innerText;
}
swithScreen(step4);
// swithScreen(step5);
}
}
});
} catch (e) {
throw new Error('Uable to retrive match score ::', e);
}
};
const generateLightBox = labelId => {
let html = parentElement.querySelector('.pro-level-6').outerHTML;
html = html.replace('class="pro-level-6 hidden"', 'class="pro-level-6"');
return `
<div role="dialog" id="${DIALOG_ID}" aria-labelledby="${labelId}" aria-modal="true" class="lightbox-overlay">
<div class="course-availability-pro-level modal-no-bg">
${html}
</div>
</div>`;
};
const removeLightBox = () => {
document.getElementById(DIALOG_ID).remove();
};
const openLightbox = focusBtn => {
// Create the lightbox
const lightboxContainer = document.createElement('div');
lightboxContainer.innerHTML = generateLightBox({
labelId: focusBtn.getAttribute('id'),
});
document.body.appendChild(lightboxContainer);
// eslint-disable-next-line no-new
new Dialog({
dialogId: DIALOG_ID,
focusAfterClosed: focusBtn,
focusFirst: 'close',
closeCallBack: () => removeLightBox(),
});
// lightboxContainer.querySelector('#close').focus();
const alertBtn = lightboxContainer.querySelector('.distance-range-alert');
alertBtn.addEventListener('click', e => {
e.preventDefault();
removeLightBox();
});
};
const loadMoreVenue = () => {
const items = parentElement.querySelectorAll(
'.course-venue-individual.showhide'
);
items.forEach((item, index) => {
if (index < defaultCount) {
item.classList.remove('showhide');
}
});
if (items.length <= defaultCount) {
loadMoreCta.classList.add('hidden');
}
};
// Find current location coordinates
currentBtn.addEventListener('click', e => {
longitudeInput.value = '';
latitudeInput.value = '';
searchBox.value = '';
searchBox.classList.remove('location-added');
searchBlock.classList.add('hidden');
enterLocationCta.classList.add('hidden');
searchByLocation(e);
});
if (!map) {
loadBingMapSerch();
}
searchBox.addEventListener('focus', () => {
currentBtn.classList.add('hidden');
locationNotFound.classList.add('hidden');
});
searchBox.addEventListener('keydown', () => {
currentBtn.classList.add('hidden');
locationNotFound.classList.add('hidden');
});
searchBox.addEventListener('input', e => {
if (!e.target.value) {
longitudeInput.value = '';
latitudeInput.value = '';
locationFound.classList.add('hidden');
locationNotFound.classList.add('hidden');
searchBox.classList.remove('location-added');
}
});
const setSelectedListItem = e => {
const { target } = e;
const distDiv = target.closest('.pro-level-location__distance');
const selectDiv = distDiv.querySelector(
'.pro-level-location__distance--label span.filter'
);
const select = distDiv.querySelector(
'.pro-level-location__distance--select'
);
selectDiv.innerText = target.innerText;
select.value = target.getAttribute('data-value');
distanceVal.value = target.getAttribute('data-value');
select.dispatchEvent(new Event('change'));
validateForm();
};
const closeList = event => {
const { target } = event;
const distDiv = target.closest('.pro-level-location__distance');
const selectDiv = distDiv.querySelector(
'.pro-level-location__distance--label span.filter'
);
const dropdown = distDiv.querySelector(
'.pro-level-location__distance--list'
);
const dropdownDiv = distDiv.querySelector(
'.pro-level-location__distance--label'
);
selectDiv.classList.remove('active');
dropdown.setAttribute('aria-expanded', 'false');
dropdownDiv.setAttribute('aria-expanded', 'false');
};
dropdownDivAll.forEach(dropdownDiv => {
const dropdown = dropdownDiv.nextElementSibling;
const dropdownListItems = dropdown.querySelectorAll('li');
dropdownDiv.addEventListener('click', e => {
const { target } = e;
const distDiv = target.closest('.pro-level-location__distance');
const selectDiv = distDiv.querySelector(
'.pro-level-location__distance--label span.filter'
);
if (window.innerWidth >= MOBILE_BREAKPOINT) {
const isExpanded = dropdown.getAttribute('aria-expanded') === 'true';
const isExpandedDiv =
dropdownDiv.getAttribute('aria-expanded') === 'true';
if (!isExpanded && !isExpandedDiv) {
dropdown.setAttribute('aria-expanded', 'true');
dropdownDiv.setAttribute('aria-expanded', 'true');
selectDiv.classList.add('active');
} else {
dropdown.setAttribute('aria-expanded', 'false');
dropdownDiv.setAttribute('aria-expanded', 'false');
selectDiv.classList.remove('active');
}
}
});
dropdownDiv.addEventListener('keydown', event => {
if (event.keyCode === 13) {
event.preventDefault();
dropdownDiv.click();
} else if (event.keyCode === 40) {
dropdownListItems[0].focus();
}
});
dropdownListItems.forEach((item, index) => {
item.addEventListener('click', e => {
const { target } = e;
setSelectedListItem(e);
closeList(e);
if (target.closest('.pro-level-4')) {
swithScreen(step2);
checkVenueAvailable('false');
}
setTimeout(() => {
dropdownDiv.focus();
}, 10);
});
item.addEventListener('keydown', e => {
if (e.keyCode === 40) {
if (dropdownListItems[index + 1]) {
dropdownListItems[index + 1].focus();
}
} else if (e.keyCode === 38) {
if (dropdownListItems[index - 1]) {
dropdownListItems[index - 1].focus();
}
} else if (e.keyCode === 13) {
item.click();
}
});
});
});
selectAll.forEach(select => {
select.addEventListener('change', event => {
const { target } = event;
const distDiv = target.closest('.pro-level-location__distance');
const selectDiv = distDiv.querySelector(
'.pro-level-location__distance--label span.filter'
);
setTimeout(() => {
target.classList.remove('active');
selectDiv.innerText = target.options[target.selectedIndex].innerText;
distanceVal.value = target.value;
if (target.value === '25' && target.closest('.pro-level-1')) {
openLightbox(searchBtn);
}
validateForm();
if (target.closest('.pro-level-4')) {
swithScreen(step2);
checkVenueAvailable('false');
}
}, 100);
});
});
selectAll.forEach(select => {
select.addEventListener('click', event => {
const { target } = event;
const distDiv = target.closest('.pro-level-location__distance');
const selectDiv = distDiv.querySelector(
'.pro-level-location__distance--label span.filter'
);
if (select.classList.contains('active')) {
selectDiv.classList.remove('active');
target.classList.remove('active');
} else {
selectDiv.classList.add('active');
target.classList.add('active');
}
});
});
searchBtn.setAttribute('disabled', 'disabled');
searchBtn.addEventListener('click', e => {
e.preventDefault();
if (!longitudeInput.value || !latitudeInput.value || !distanceVal.value) {
return;
}
swithScreen(step2);
checkVenueAvailable('true');
});
searchBtn.addEventListener('keydown', event => {
if (event.keyCode === 13) {
event.preventDefault();
searchBtn.click();
}
});
clearBtn.addEventListener('click', e => {
e.preventDefault();
resetProLevelSearch();
setTimeout(() => {
currentBtn.focus();
}, 10);
});
clearBtn.addEventListener('keydown', event => {
if (event.keyCode === 13) {
event.preventDefault();
clearBtn.click();
}
});
startNewSearch.addEventListener('click', e => {
e.preventDefault();
resetProLevelSearch();
});
startNewSearch.addEventListener('keydown', event => {
if (event.keyCode === 13) {
event.preventDefault();
startNewSearch.click();
}
});
loadMoreCta.addEventListener('click', e => {
e.preventDefault();
loadMoreVenue();
clearBtn.focus();
});
loadMoreCta.addEventListener('keydown', event => {
if (event.keyCode === 13) {
event.preventDefault();
loadMoreCta.click();
}
});
enterLocationCta.addEventListener('click', e => {
e.preventDefault();
searchBlock.classList.remove('hidden');
enterLocationCta.classList.add('hidden');
currentBtn.classList.add('hidden');
locationNotFound.classList.add('hidden');
locationFound.classList.add('hidden');
longitudeInput.value = '';
latitudeInput.value = '';
searchBox.setAttribute('aria-label', 'select desired location');
searchBox.focus();
});
enterLocationCta.addEventListener('keydown', event => {
if (event.keyCode === 13) {
event.preventDefault();
enterLocationCta.click();
}
});
};
.course-availability-pro-level {
display: flex;
flex-direction: column;
position: relative;
padding: 5.2rem 3.2rem;
padding-bottom: 13.2rem;
background: url('./assets/images/course-pro-level-mob.png') left bottom
no-repeat;
background-color: $blue-accent3;
min-height: 82rem;
&__container {
margin: 0 auto;
max-width: 95.2rem;
}
h2 {
font-family: $text-font-ef;
font-size: 3.2rem;
font-style: normal;
font-weight: bold;
line-height: 3.6rem;
letter-spacing: 0.01em;
color: $white;
&::after {
content: '';
border-bottom: 0.2rem solid $red;
width: 3.2rem;
display: block;
margin-top: 0.8rem;
}
}
.pro-level-copy {
@extend .efl-p-medium;
color: $light-blue;
margin-top: 1.2rem;
}
hr {
border-color: $light-blue;
opacity: 0.4;
margin: 1.6rem 0;
}
.loading {
position: relative;
margin: 0 auto;
width: 10.4em;
height: 10.4em;
&.show {
display: block;
}
.efl-logo {
background-image: url('./assets/images/efl-loader-logo.svg');
background-repeat: no-repeat;
background-position: center;
position: absolute;
z-index: 2;
top: 0;
left: 0;
background-size: 4.2rem 5.1rem;
width: 100%;
height: 100%;
}
.loader {
font-size: 10px;
text-indent: -9999em;
width: 100%;
height: 100%;
border-radius: 100%;
overflow: hidden;
background: rgb(236, 238, 243);
position: relative;
-webkit-animation: load3 1.4s infinite linear;
animation: load3 1.4s infinite linear;
-webkit-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
}
.loader::before {
width: 100%;
height: 50%;
background: -linear-gradient(0deg, #004aa3 0%, #eceef3 50%);
background: -moz-linear-gradient(0deg, #004aa3 0%, #eceef3 50%);
background: -o-linear-gradient(0deg, #004aa3 0%, #eceef3 50%);
background: -ms-linear-gradient(0deg, #004aa3 0%, #eceef3 50%);
background: -webkit-linear-gradient(0deg, #004aa3 0%, #eceef3 50%);
transform-origin: bottom right;
position: absolute;
top: 0;
left: 0;
content: '';
}
.loader::after {
background: $blue-accent3;
width: 90%;
height: 90%;
border-radius: 50%;
content: '';
margin: auto;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
@-webkit-keyframes load3 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes load3 {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
}
.pro-level-2 {
.loading {
position: absolute;
top: calc(50% - 5.2rem);
left: calc(50% - 5.2rem);
}
}
.pro-level-location {
p {
@extend .efl-p-large;
color: $white;
font-weight: 700;
}
label {
@extend .efl-p-small;
color: $light-blue;
display: block;
}
&__postcode {
padding-bottom: 0.8rem;
}
&__clear {
@extend .efl-p-medium;
color: $white;
display: flex;
justify-content: flex-start;
margin-bottom: 2.1rem;
text-decoration: underline;
cursor: pointer;
}
&__distance {
@extend .efl-p-1;
position: relative;
margin-top: 1.6rem;
padding-bottom: 0.8rem;
&--label {
background-color: $white;
color: $blue;
padding: 1rem 4rem;
width: 100%;
display: flex;
border-radius: 2px;
border: 2px solid $light-blue;
position: relative;
justify-content: center;
cursor: pointer;
&::after {
content: '';
background: url('./assets/images/chevron.svg') no-repeat center;
background-color: $grey-light;
width: 4.4rem;
position: absolute;
right: 0;
height: 4.4rem;
top: 0;
background-size: 1rem;
transform: rotate(90deg);
}
}
&--select {
@extend .efl-p-1;
padding: 0.8rem 1.6rem;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 100%;
opacity: 0;
position: absolute;
top: 0;
option {
padding: 0.8rem 1.6rem;
}
&.active {
opacity: 1;
}
}
&--list {
& > ul {
width: 100%;
& > li {
@extend .efl-p-1;
padding: 1.2rem 3rem;
color: $blue;
cursor: pointer;
&:hover {
background-color: $grey-light;
}
}
}
&[aria-expanded='false'] {
display: none;
}
}
}
&__show-more {
font-family: $text-font-ef;
color: $white;
font-size: 1.6rem;
font-weight: 400;
text-transform: uppercase;
letter-spacing: 0.06rem;
background: none;
border: 1px solid $white;
border-radius: 0.25rem;
margin-top: 0.4rem;
padding: 1.5rem;
transition: background 0.2s ease-in;
width: 100%;
&:hover {
background: $white;
color: $blue-accent3;
}
}
&__alert {
background: $white;
border-radius: 0.8rem;
max-width: 46.4rem;
padding: 2.4rem 2.8rem;
margin-top: 22.9rem;
&--title {
@extend .efl-p-small;
color: $red;
padding-left: 3.5rem;
position: relative;
display: flex;
align-items: center;
letter-spacing: 0.16em;
text-transform: uppercase;
padding-bottom: 1.1rem;
&::before {
content: '';
background: url('./assets/images/alert-icon.svg') no-repeat center;
width: 3rem;
height: 3rem;
position: absolute;
left: 0;
}
&::after {
content: '';
border-bottom: 1px solid $grey-light;
width: 100%;
position: absolute;
left: 0;
bottom: 0;
}
}
&--info {
@extend .efl-p-2;
font-weight: 500;
margin-top: 1.6rem;
color: $blue;
}
p {
@extend .efl-p-small;
margin-top: 0.8rem;
color: $color-interface-light;
margin-bottom: 1.6rem;
}
.pro-level-location__distance--label {
border: 1px solid $grey-light;
padding-left: 3.5rem;
}
.start-new-search {
margin-top: 1rem;
justify-content: center;
}
}
}
.cta {
width: 100%;
max-width: 100%;
font-size: 1.6rem;
line-height: 2.4rem;
&.pro-level-current-location {
position: relative;
background-color: $white;
color: $blue;
margin-top: 1.6rem;
text-transform: initial;
padding: 1rem 4rem;
&::after {
content: '';
background: url('./assets/images/map-pin-dark.svg') no-repeat center
right;
width: 2.4rem;
height: 2.4rem;
position: absolute;
right: 1rem;
left: initial;
bottom: initial;
top: initial;
}
.loading {
position: absolute;
width: 3.2rem;
height: 3.2rem;
right: 1.1rem;
.efl-logo {
background-image: url('./assets/images/ef-logo.svg');
background-size: 1.13rem 1.37rem;
}
.loader {
position: absolute;
left: 0;
&::after {
background: $white;
}
}
}
&.searching {
&::after {
display: none;
}
}
}
&.current-location-found {
background-color: $white;
color: $blue;
margin-top: 1.6rem;
text-transform: initial;
padding: 1rem 4rem;
&::after {
content: '';
background: url('./assets/images/tick-circle-blue.svg') no-repeat center
right;
width: 3rem;
height: 3rem;
position: absolute;
right: 1.1rem;
left: initial;
bottom: initial;
top: initial;
}
}
&.location-not-found {
background-color: $white;
color: $red;
border-color: $white;
margin-top: 1.6rem;
text-transform: initial;
padding: 1rem 4rem;
}
&.confirmation-and-payment {
&::after {
content: '';
background: url('./assets/images/tick-circle.svg') no-repeat center
right;
width: 2.1rem;
height: 2.1rem;
position: absolute;
right: 1.6rem;
left: initial;
bottom: initial;
top: initial;
}
}
&.search-pro-level-course {
border: none;
&:hover {
background-color: $white;
color: $red;
}
&[disabled] {
border: none;
color: $light-blue;
background-color: $grey-light;
cursor: default;
}
}
/* stylelint-disable no-descending-specificity */
&.search-pro-level-course,
&.distance-range-alert {
text-align: center;
justify-content: center;
}
&.pro-enter-location-cta {
@extend .efl-p-1;
color: $white;
background-color: transparent;
border: 2px solid $white;
margin-top: 1.6rem;
text-transform: initial;
&:hover {
background-color: transparent;
color: $white;
}
}
}
input {
@extend .efl-p-1;
color: $white;
padding: 1.2rem 4rem 1.1rem 2.4rem;
width: 100%;
border: 2px solid $white;
margin-top: 1.6rem;
background-color: transparent !important;
box-sizing: border-box !important;
line-height: 1.6rem;
border-radius: 2px;
text-align: left;
-webkit-appearance: none;
&:focus {
background: url('./assets/images/search-icon-white.svg') no-repeat 98%
center;
}
&::-webkit-search-cancel-button {
-webkit-appearance: none;
background: url('./assets/images/icon-close-white.svg') no-repeat 98%
center;
width: 1.4rem;
height: 1.4rem;
padding: 0.5rem;
background-size: 1.6rem;
background-color: $blue-accent3;
margin-right: -2.8rem;
display: none;
cursor: pointer;
}
&::-webkit-input-placeholder {
/* Edge */
color: $white;
}
&:-ms-input-placeholder {
/* Internet Explorer 10-11 */
color: $white;
}
&::placeholder {
color: $white;
}
}
// bing map style
#proLevelSearchBoxContainer {
position: relative;
.MicrosoftMap {
position: initial !important;
}
.MicrosoftMap .as_container_search {
width: 100% !important;
text-align: left;
}
.MicrosoftMap .as_container .line1 {
@extend .efl-p-1;
color: $black;
}
.MicrosoftMap .as_container .line2 {
@extend .efl-p-1;
color: $color-interface-light;
margin-top: 0.1rem;
}
.MicrosoftMap .as_img.maps_address {
background-image: url('./assets/images/location-pin.svg');
width: 1.5rem !important;
height: 2.2rem !important;
margin-right: 0.8rem;
}
.MicrosoftMap .as_container .as_suggestion_root_inside {
align-items: center;
}
.MicrosoftMap .as_container .suggestLink {
padding: 0.8rem 2.4rem;
&:hover {
background-color: $grey-light;
}
}
}
&.modal-no-bg {
background: none;
padding: 0;
}
.course-venue-list__list {
& > div {
margin-bottom: 2rem;
&:nth-child(3) {
margin-bottom: 2.5rem;
}
}
}
.course-venue-individual__days p {
grid-template-columns: 0.9fr auto 1fr;
}
.course-venue-individual.showhide {
display: none;
}
@media screen and (min-width: $mq-medium) {
padding: 6.2rem 3.2rem;
background: url('./assets/images/course-pro-level-desk.png') right bottom
no-repeat;
background-color: $blue-accent3;
min-height: 48.4rem;
&__inner {
max-width: 58.6rem;
}
.pro-level-3 {
.course-availability-pro-level__inner {
max-width: 100%;
}
}
h2 {
&::after {
margin-top: 1.6rem;
}
}
.pro-level-location {
&__distance {
&--list {
border: 2px solid $grey-light;
box-sizing: border-box;
border-radius: 0 0 4px 4px;
filter: drop-shadow(0 4px 4px rgba(0, 0, 0, 0.25));
position: absolute;
width: 100%;
background-color: $white;
z-index: 1;
}
&--select {
display: none;
}
}
&__alert {
margin-top: 51.5px;
}
&__clear {
justify-content: flex-end;
}
}
input {
justify-content: flex-start;
padding: 1rem 4rem 1rem 3.2rem;
}
}
@media screen and (min-width: $mq-large) {
.course-venue-individual {
min-width: 30.1rem;
}
.course-venue-list__list {
gap: 2rem;
}
.course-venue-individual__inner {
padding: 2.5rem 2.2rem 2.4rem 2.2rem;
}
}
}
<section class="course-availability-pro-level" data-behavior="course-availability-pro-level" data-course-name="W1VC" data-course-blockid="" data-course-isprocourse="true">
<div class="pro-level-1">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<h2>Find courses in your preferabel region or location</h2>
<div class="pro-level-copy">This block will be used so that the content manager
can put in caveats around travel/distances etc for UEFA C/B
and the A license as the 'ruleset' is different for each
</div>
<hr>
<div class="pro-level-location">
<p>1. Select desired location:</p>
<label>Use your current location or type in a location</label>
<button class="cta cta--primary pro-level-current-location" id="pro-level-current-location" aria-label="use current location">Use current location</button>
<button class="cta cta--primary current-location-found hidden" id="current-location-found" aria-label="location found">Location found</button>
<button class="cta cta--primary location-not-found hidden" aria-label="select desired location">Location Not Found, manually enter below</button>
<button class="cta cta--primary pro-enter-location-cta" aria-label="enter location">Enter Location</button>
<div class="pro-level-location__postcode hidden">
<div id="proLevelSearchBoxContainer">
<input type="text" id="proLevelSearchBox" class="pro-level-location__postcode-input" placeholder="Enter Location" autocomplete="off"/>
</div>
</div>
</div>
<hr>
<div class="pro-level-location">
<p>2. Select desired travel distance:</p>
<label>Choose the maximum distance you wish to travel</label>
<div class="pro-level-location__distance">
<div class="pro-level-location__distance--label" aria-label="select desired travel distance" role="combobox" tabindex="0" aria-labelledby="pro-level-distance" aria-expanded="false">
<span class="filter">Select distance</span>
</div>
<div aria-expanded="false" class="pro-level-location__distance--list">
<ul>
<li tabindex="0" data-value="">Select distance</li>
<li tabindex="0" data-value="5">5 Miles</li>
<li tabindex="0" data-value="10">10 Miles</li>
<li tabindex="0" data-value="20">20 Miles</li>
<li tabindex="0" data-value="25">25 Miles +</li>
</ul>
</div>
<select class="pro-level-location__distance--select">
<option value="">Select distance</option>
<option value="5">5 Miles</option>
<option value="10">10 Miles</option>
<option value="20">20 Miles</option>
<option value="25">25 Miles +</option>
</select>
</div>
</div>
<hr style="margin-bottom: 2.4rem;">
<button class="cta cta--efl search-pro-level-course" aria-label="search course" disabled="disabled">Search</button>
</div>
</div>
<input type="hidden" class="search-longitude" value=""/>
<input type="hidden" class="search-latitude" value=""/>
<input type="hidden" class="search-distance" value=""/>
<input type="hidden" class="search-place" value=""/>
</div>
<div class="pro-level-2 hidden">
<div class="loading">
<div class="loader"></div>
<div class="efl-logo"></div>
</div>
</div>
<div class="pro-level-3 hidden">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<h2>Your nearest UEFA B course locations</h2>
<div class="pro-level-copy">
Showing UEFA B courses <span class="range"></span>
</div>
<hr>
<div class="pro-level-location__clear" role="button" tabindex="0" aria-label="clear results">Clear results</div>
<div class="course-venue-list__list">
{{render '@course-venue-individual' course-availability merge="true"}}
</div>
<button class="pro-level-location__show-more" data-show="Show More" data-hide="Show less">Show More</button>
</div>
</div>
</div>
<div class="pro-level-4 hidden">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<div class="pro-level-location__alert">
<div class="pro-level-location__alert--title">No Courses Found</div>
<div class="pro-level-location__alert--info">There are currently no courses available</div>
<p>Course currently not available in desired location. Try expanding your location radius </p>
<div class="pro-level-location__distance">
<div class="pro-level-location__distance--label" role="combobox" tabindex="0" aria-labelledby="pro-level-distance" aria-expanded="false">
<span class="filter">5 Miles</span>
</div>
<div aria-expanded="false" class="pro-level-location__distance--list">
<ul>
<li tabindex="0" data-value="5">5 Miles</li>
<li tabindex="0" data-value="10">10 Miles</li>
<li tabindex="0" data-value="20">20 Miles</li>
<li tabindex="0" data-value="25">25 Miles +</li>
</ul>
</div>
<select class="pro-level-location__distance--select">
<option value="5">5 Miles</option>
<option value="10">10 Miles</option>
<option value="20">20 Miles</option>
<option value="25">25 Miles +</option>
</select>
</div>
</div>
</div>
</div>
</div>
<div class="pro-level-5 hidden">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<div class="pro-level-location__alert">
<div class="pro-level-location__alert--title">No Courses Found</div>
<div class="pro-level-location__alert--info">Check back again later</div>
<p>Course currently not available in desired location. Try expanding your location radius</p>
<button class="cta cta--efl start-new-search" aria-label="no sourse found, start new search">START A NEW SEARCH</button>
</div>
</div>
</div>
</div>
<div class="pro-level-6 hidden">
<div class="course-availability-pro-level__container">
<div class="course-availability-pro-level__inner">
<div class="pro-level-location__alert">
<div class="pro-level-location__alert--title">DISTANCE ALERT</div>
<div class="pro-level-location__alert--info">Please note that you are advised apply
for a course close to your location</div>
<p>If you are applying for a course that is a sigificant distance from your location there is a higher chance your application may be rejected</p>
<button class="cta cta--efl distance-range-alert" aria-label="next">Next</button>
</div>
</div>
</div>
</div>
</section>