fara-web/js/fara.js

249 lines
6.2 KiB
JavaScript

//use strict;
localStorage.setItem('online', true);
/**
* Export constants!!
* @todo titles, vimeoVids
*/
export const titles = [
]
export const vimeoVids = {
'thumb_prologo' : '478632535',
'thumb_viaggiatore' : '562518107',
'thumb_faresi' : '562529310',
'thumb_piazza' : '443587380',
'thumb_antonio' : '606341398',
'thumb_francesco' : '471773781',
'thumb_nobili' : '562534835',
'thumb_rocco' : '606346781',
'thumb_alberto' : '606372910',
'thumb_disputa' : '471537982',
'thumb_duomo' : '606343917',
'thumb_loredana' : '513080769',
'thumb_pietro' : '455576197',
'thumb_castello' : '562536148',
'thumb_sabini' : '542321131',
'thumb_monumento' : '606362546',
'thumb_eva' : '606352547',
'thumb_toto' : '606348670',
'thumb_fuori' : '606358668',
'thumb_carro' : '562262086',
};
/**
* 'Slide' background images
* in landing page
* @todo Preload iamges?? https://stackoverflow.com/questions/3646036/preloading-images-with-javascript
*/
export function sliderBg()
{
let nextimage = 0;
let header = document.querySelector('header');
slider();
function slider() {
/*** Fade in??*/
//opacity = 1;
let images = [
'img/lp-bg/fara_bg_1.jpg',
'img/lp-bg/fara_bg_2.jpg',
'img/lp-bg/fara_bg_3.jpg',
'img/lp-bg/fara_bg_4.jpg',
'img/lp-bg/fara_bg_5.jpg',
];
if (nextimage >= images.length) {
nextimage = 0;
}
header.setAttribute('style', 'background-image : url("' + images[nextimage++] + '");');
setTimeout(slider, 2000);
}
}
/**
* @todo
* Simple slideshow (Credits page)
*/
export function slideshow()
{
let slideIndex = 0;
carousel();
function carousel() {
let i;
let slides = document.querySelectorAll(".slide");
for (i = 0; i < slides.length; i++) {
slides[i].classList.add("hide");
slides[i].classList.remove("show");
}
slideIndex++;
if (slideIndex > slides.length) {
slideIndex = 1;
}
slides[slideIndex-1].classList.remove("hide");
slides[slideIndex-1].classList.add("show");
setTimeout(carousel, 2000); // Change image every 2 seconds
}
}
/**
* @todo Interactive SVG?
* The canvas should be drawn into an overlay
* container (always fullscreen)
*/
export function interactiveMap()
{
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
const img = new Image;
img.src = 'img/mappa.png';
img.onload = () => {
ctx.drawImage(img, 0, 0);
}
}
/**
* Menu keys for accessibility
*/
export function menuKeys()
{
document.addEventListener('keypress', e => {
let keyCode = e.code;
if (keyCode.includes('Digit')) {
let numCode = keyCode.replace('Digit', '');
let menuK = {
'1' : 'itinerario.html',
'2' : 'progetto.html',
'4': 'credits.html',
};
for (let k in menuK) {
if (k === numCode)
window.location.href = menuK[k];
}
}
});
}
/**
* Apply active class to nav links
* @todo Inefficient?
*/
export function activeNav()
{
let navlinks = Array.from(document.querySelectorAll('#links a'));
navlinks.forEach(element => {
let ref = element.href.substr(element.href.lastIndexOf('/'), element.href.length);
if (window.location.href.includes(ref)) {
element.setAttribute('class', 'active');
}
});
}
/**
* Show vertical nav on mobile
*/
export function mobileNav()
{
let menu = document.querySelector('i');
if (menu) {
menu.addEventListener('click', () => {
document.querySelector('.side-nav').classList.remove('d-hide');
document.querySelector('.side-nav').classList.remove('slide-out');
document.querySelector('body').classList.add('opaque');
});
let close = document.querySelector('#close-nav');
close.addEventListener('click', () => {
document.querySelector('.side-nav').classList.add('d-hide');
document.querySelector('body').classList.remove('opaque');
});
}
}
/**
* Get video source for given
* link and open video page
*/
export function openVideo(a)
{
let aNodes = a.childNodes;
// Hacky??
let title = a.parentElement
.nextElementSibling
.firstElementChild
.innerHTML
.trim();
let vStr = '';
aNodes.forEach(n => {
if (n.src) {
vStr = n.src;
vStr = vStr.substr(vStr.lastIndexOf('/')+1, vStr.length)
.replace(/thumb_(.*)\.\w+$/, 'vid_$1.mp4');
}
});
localStorage.setItem('vidURI', vStr);
localStorage.setItem('vidTitle', title);
/**
* Go to video page
*/
window.location.href = 'video.html';
}
/**
* Activate background on scroll for nav only
* if not small screen
*/
export function navOnScroll()
{
let nav = document.querySelector('#nav');
let links = document.querySelector('#links');
if (window.pageYOffset !== 0) {
nav.classList.add('bg-white', 'border');
nav.classList.remove('text-gray');
links.classList.add('nav-dark');
links.classList.remove('nav-light');
}
else {
if (!document.querySelector('header').classList.contains('itin')) {
nav.classList.add('text-gray');
links.classList.remove('nav-dark');
links.classList.add('nav-light');
}
nav.classList.remove('bg-white', 'border');
}
}
/**
* Generate anchors in 'itinerario' to
* track click position to go back to
* when closing video page...
*/
export function genAnchors()
{
let sections = document.querySelectorAll('.poi');
let count = 0;
sections.forEach(s => {
let a = document.createElement('a');
count++;
a.id = 's' + new String(count);
s.prepend(a);
});
}