window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60);}; })(); (() => { let video; if(elem = document.querySelector("#my-video")) { video = new v0ck(elem); document.addEventListener("keydown", e => { if(e.key === " " && e.target.tagName !== "INPUT") { video[video.paused ? 'play' : 'pause'](); document.querySelector('.v0ck_overlay').classList[video.paused ? 'remove' : 'add']('v0ck_hidden'); } }); document.getElementById('togglebg').addEventListener('click', function (e) { e.preventDefault(); background = !background; localStorage.setItem('background', background.toString()); var canvas = document.getElementById('bg'); if (background) { canvas.classList.add('fader-in'); canvas.classList.remove('fader-out'); } else { canvas.classList.add('fader-out'); canvas.classList.remove('fader-in'); } animationLoop(); }); if(elem !== null) { if(localStorage.getItem('background') == undefined) { localStorage.setItem('background', 'true'); } var background = localStorage.getItem('background') === 'true'; var canvas = document.getElementById('bg'); var context = canvas.getContext('2d'); var cw = canvas.width = canvas.clientWidth | 0; var ch = canvas.height = canvas.clientHeight | 0; function animationLoop() { if(video.paused || video.ended || !background) return; context.drawImage(video, 0, 0, cw, ch); window.requestAnimFrame(animationLoop); } elem.addEventListener('play', animationLoop); } } let tt = false; const stimeout = 500; const changePage = (e, pbwork = true) => { pbwork && document.querySelector("nav.navbar").classList.add("pbwork"); !tt && (tt = setTimeout(() => e.click(), stimeout)); }; // const clickOnElementBinding = selector => () => (elem = document.querySelector(selector)) ? elem.click() : null; const keybindings = { "ArrowLeft": clickOnElementBinding("#next"), "a": clickOnElementBinding("#next"), "ArrowRight": clickOnElementBinding("#prev"), "d": clickOnElementBinding("#prev"), "r": clickOnElementBinding("#random"), " ": clickOnElementBinding("#f0ck-image") }; document.addEventListener("keydown", e => { if(e.key in keybindings && e.target.tagName !== "INPUT") { if(e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) return; e.preventDefault(); keybindings[e.key](); } }); // // const imgSize = e => new Promise((res, _) => { const i = new Image(); i.addEventListener('load', function() { res({ width: this.width, height: this.height }); }); i.src = e.src; }); // const wheelEventListener = function(event) { if (event.target.closest('.media-object')) { if (event.deltaY < 0) { document.getElementById('next').click(); } else if (event.deltaY > 0) { document.getElementById('prev').click(); } } }; window.addEventListener('wheel', wheelEventListener); // if(f0ckimage = document.querySelector("img#f0ck-image")) { const f0ckimagescroll = document.querySelector("#image-scroll"); let isImageExpanded = false; console.log("entry point - image unclicked") f0ckimage.addEventListener("click", async e => { e.preventDefault(); const img = await imgSize(f0ckimage); console.log("img clicked"); if (isImageExpanded) { isImageExpanded = false; f0ckimagescroll.removeAttribute("style"); f0ckimage.removeAttribute("style"); console.log("image is not expanded") window.addEventListener('wheel', wheelEventListener); } else { if (img.width > img.height) return; isImageExpanded = true; window.removeEventListener('wheel', wheelEventListener); f0ckimagescroll.setAttribute("style", "overflow-y: scroll"); f0ckimage.setAttribute("style", "max-height: none; height: auto; width: 100%; position: absolute; left: 0; border: var(--img-border-width) solid var(--img-border-color); border-top: none; border-bottom: none;"); } }); } // // let tts = 0; const scroll_treshold = 1; if([...document.querySelectorAll("div.posts")].length === 1) { document.addEventListener("wheel", e => { if(Math.ceil(window.innerHeight + window.scrollY) >= document.querySelector('#main').offsetHeight && e.deltaY > 0) { // down if(elem = document.querySelector(".pagination > .next:not(.disabled)")) { if(tts < scroll_treshold) { document.querySelector("div#footbar").style.boxShadow = "inset 0px 4px 0px var(--footbar-color)"; document.querySelector("div#footbar").style.color = "var(--footbar-color)"; tts++; } else changePage(elem); } } else if(window.scrollY <= 0 && e.deltaY < 0) { // up if(elem = document.querySelector(".pagination > .prev:not(.disabled)")) { if(tts < scroll_treshold) { document.querySelector("nav.navbar").style.boxShadow = "0px 2px 0px var(--loading-indicator-color)"; document.querySelector("nav.navbar").style.transition = ".2s ease-in-out"; tts++; } else changePage(elem); } } else { tts = 0; document.querySelector("div#footbar").style.boxShadow = "unset"; document.querySelector("div#footbar").style.color = "transparent"; document.querySelector("nav.navbar").style.boxShadow = "unset"; } }); } const rmatch = /\/p\/(\d+?)/; if(document.referrer.match(rmatch) && document.location.href.match(rmatch)) if(document.location.href.match(rmatch) < document.referrer.match(rmatch)) document.body.scrollTop = document.body.scrollHeight; // // const swipeRT = { xDown: null, yDown: null, xDiff: null, yDiff: null, timeDown: null, startEl: null }; const swipeOpt = { treshold: 20, // 20px timeout: 500 // 500ms }; document.addEventListener('touchstart', e => { swipeRT.startEl = e.target; swipeRT.timeDown = Date.now(); swipeRT.xDown = e.touches[0].clientX; swipeRT.yDown = e.touches[0].clientY; swipeRT.xDiff = 0; swipeRT.yDiff = 0; }, false); document.addEventListener('touchmove', e => { if(!swipeRT.xDown || !swipeRT.yDown) return; swipeRT.xDiff = swipeRT.xDown - e.touches[0].clientX; swipeRT.yDiff = swipeRT.yDown - e.touches[0].clientY; }, false); document.addEventListener('touchend', e => { if(swipeRT.startEl !== e.target) return; const timeDiff = Date.now() - swipeRT.timeDown; let elem; if(Math.abs(swipeRT.xDiff) > Math.abs(swipeRT.yDiff)) { if(Math.abs(swipeRT.xDiff) > swipeOpt.treshold && timeDiff < swipeOpt.timeout) { if(swipeRT.xDiff > 0) // left elem = document.querySelector(".pagination > .next:not(.disabled)"); else // right elem = document.querySelector(".pagination > .prev:not(.disabled)"); } } else { if(Math.abs(swipeRT.yDiff) > swipeOpt.treshold && timeDiff < swipeOpt.timeout) { if(navbar = document.querySelector("nav.navbar") && document.querySelector("div.posts")) { if(swipeRT.yDiff > 0 && (window.innerHeight + window.scrollY) >= document.body.offsetHeight) // up elem = document.querySelector(".pagination > .next:not(.disabled)"); else if(swipeRT.yDiff <= 0 && window.scrollY <= 0 && document.querySelector("div.posts")) // down elem = document.querySelector(".pagination > .prev:not(.disabled)"); } } } swipeRT.xDown = null; swipeRT.yDown = null; swipeRT.timeDown = null; if(elem) changePage(elem); }, false); // // if(audioElement = document.querySelector("audio")) { const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); canvas.width = 1920; canvas.height = 1080; setTimeout(() => { document.querySelector(".v0ck").insertAdjacentElement("afterbegin", canvas); }, 400); const audioCtx = new AudioContext(); const analyser = audioCtx.createAnalyser(); analyser.fftSize = 2048; const source = audioCtx.createMediaElementSource(audioElement); source.connect(analyser); source.connect(audioCtx.destination); let data = new Uint8Array(analyser.frequencyBinCount); requestAnimationFrame(loopingFunction); function loopingFunction() { requestAnimationFrame(loopingFunction); analyser.getByteFrequencyData(data); draw(data); } function draw(data) { data = [ ...data ]; ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = getComputedStyle(document.body).getPropertyValue("--accent"); data.forEach((value, i) => { const percent = value / 256; const height = (canvas.height * percent / 2) - 40; const offset = canvas.height - height - 1; const barWidth = canvas.width / analyser.frequencyBinCount; ctx.fillRect(i * barWidth, offset, barWidth, height); }); } audioElement.onplay = () => { audioCtx.resume(); }; } // // if(elem = document.querySelector("#my-video") && "mediaSession" in navigator) { const playpauseEvent = () => { video[video.paused ? 'play' : 'pause'](); document.querySelector('.v0ck_overlay').classList[video.paused ? 'remove' : 'add']('v0ck_hidden'); }; navigator.mediaSession.setActionHandler('play', playpauseEvent); navigator.mediaSession.setActionHandler('pause', playpauseEvent); navigator.mediaSession.setActionHandler('stop', playpauseEvent); navigator.mediaSession.setActionHandler('previoustrack', () => { if(link = document.querySelector(".pagination > .prev:not(.disabled)")) changePage(link); }); navigator.mediaSession.setActionHandler('nexttrack', () => { if(link = document.querySelector(".pagination > .next:not(.disabled)")) changePage(link); }); } // // // })();