comfitu.re/script.js
Fristi 3551e61357 1.5.0 minor release, integrated blogs and logs.
+ Added blogs and logs
+ Added integrated reader and player for blogs and logs
+ Merged websites and projects pages
+ Updated copyright notice
+ Updated theme with css variables and a new color scheme
2022-05-26 18:28:59 +02:00

202 lines
6.6 KiB
JavaScript

(function (){
var comfiture = {};
var activeLink;
var activeContent;
var player;
var reader;
var motds = [
"Made by Fristi",
"Fristi? Fristi habe ich nicht.",
"[Subject quote here]",
"Press R or Z twice to do a barrel roll",
"You wouldn't download a car.",
"The last metroid is in captivity.",
"Suavemente, bésame",
"What is love?",
"Justice in Spades",
"Let's get Volatile",
"Yeah, RIP",
"What a shame.",
"RED SPY IS IN THE BASE",
"try fingers, but hole",
"You don't have the right O you don't have the right"
];
//Set up classes for player and reader
class Player {
#container;
#element;
constructor() {
this.#container = document.querySelector('.player');
if(this.#container) {
this.#element = this.#container.querySelector('audio');
this.#container.querySelector('span.times')
.addEventListener('click', event => {
this.#clear();
this.#container.classList.add('hide');
});
document.querySelector('#logs').addEventListener('click', event => {
if(event.target.tagName != 'A') return;
this.#load(event.target.getAttribute('href'));
event.preventDefault();
});
}
}
#clear() {
this.#element.pause();
this.#element.removeAttribute('src');
}
#load(href) {
this.#clear();
if(this.#container.classList.contains('hide')) {
this.#container.classList.remove('hide');
}
this.#element.setAttribute('src', href);
this.#element.play();
}
}
class Reader {
#container;
#content;
#tabMain;
#loader;
#title;
constructor() {
this.#container = document.querySelector('.reader');
if(this.#container) {
this.#content = this.#container.querySelector('.reader-content');
this.#loader = this.#container.querySelector('span.loader');
this.#tabMain = document.querySelector('.tab-main');
this.#title = this.#container.querySelector('.title');
this.#container.querySelector('a.times')
.addEventListener('click', event => {
this.#clear();
this.#container.classList.add('hide');
this.#tabMain.classList.remove('hide');
this.#title.innerHTML = '';
});
document.querySelector('#blogs .tab-main').addEventListener('click', event => {
if(event.target.tagName != 'A') return;
this.#load(event.target.getAttribute('href'));
event.preventDefault();
});
}
}
#clear() {
this.#content.innerHTML = '';
}
#load(href) {
this.#clear();
this.#tabMain.classList.add('hide');
this.#container.classList.remove('hide');
this.#loader.classList.remove('hide');
this.#title.innerHTML = href.substring(href.lastIndexOf('/')+1);
ajax(href, response => {
let converter = new showdown.Converter();
this.#content.innerHTML = converter.makeHtml(response);
this.#loader.classList.add('hide')
}, () => {
this.#content.innerHTML = "<h1>Could not load resource.</h1> <p>An error occurred, unable to display blog post.</p>";
this.#loader.classList.add('hide')
});
}
}
function ajax(url, onSuccess, onError)
{
let request = new XMLHttpRequest();
request.open('GET', url, true);
request.onload = function() {
if (this.status >= 200 && this.status < 400) {
if(typeof onSuccess === 'function') {
onSuccess(this.response);
}
} else {
if(typeof onError === 'function') {
onError(this.status, this.response);
}
}
};
request.onerror = function () {
console.error('Failed request to ' + url + ', could not connect.');
if(typeof onError === 'function') {
onError(false, null);
}
}
request.send();
}
function switchActiveContent(id)
{
let link = document.querySelector('a[href="'+id+'"]');
let content = document.querySelector(id);
if(link && content) {
if(activeLink) activeLink.classList.remove('active');
if(activeContent) activeContent.classList.add('hide');
link.classList.add('active');
content.classList.remove('hide');
activeLink = link;
activeContent = content;
} else {
console.error('Error: not switching content; link or content element for id ' + id + ' does not exist.');
}
}
//Onload
window.addEventListener('load', function(){
//Hide all content
let contents = document.querySelectorAll('.content-tab');
contents.forEach(function (element) {
element.classList.add('hide');
});
//Activate content matching hash in url (or home instead)
let hash = window.location.hash;
if(!hash) hash = '#home';
switchActiveContent(hash);
//Set up reader and player
player = new Player();
reader = new Reader();
//Add click event handlers for header/footer links
document.querySelectorAll('header, footer').forEach(element => {
element.addEventListener('click', event => {
if(event.target.tagName != 'A') return;
let hash = event.target.getAttribute('href');
switchActiveContent(hash);
});
});
});
//Global functions
comfiture.setupWallpaper = function () {
let wallpaper = 'a' + (Math.floor(Math.random() * 12) + 1) + '.gif';
document.querySelector('.background').style.backgroundImage = 'url("backgrounds/'+wallpaper+'")';
};
comfiture.printMotd = function () {
let motd = motds[Math.floor(Math.random() * motds.length)];
document.write(motd);
}
//Expose comfiture object to document
window.comfiture = comfiture;
})();