wobbly/main.js

105 lines
2.6 KiB
JavaScript

// DOM Elements
var wobblyWindow
var wobblyHelpButton
var wobblyHelp
var wobblyUp
var wobblyAddressBar
var wobblyGo
var startpage = 'gemini://tildeverse.org/'
function geminiInit() {
wobblyWindow = document.getElementById("wobbly-window")
wobblyHelpButton = document.getElementById('wobbly-help-button')
wobblyHelp = document.getElementById('wobbly-help')
wobblyUp = document.getElementById('wobbly-up')
wobblyAddressBar = document.getElementById('wobbly-addressbar')
wobblyGo = document.getElementById('wobbly-go')
wobblyHelpButton.addEventListener('click', geminiHelpToggle)
wobblyUp.addEventListener('click', geminiUp)
wobblyAddressBar.addEventListener('keypress', geminiEnterListener)
wobblyGo.addEventListener('click', geminiGo)
// Hijack all clicks for gemini links
document.addEventListener('click', geminiLinkClickListener, false)
window.addEventListener('popstate', goFromURL)
// Clear screen to init
wobblyWindow.innerHTML = ""
goFromURL()
}
function goFromURL() {
query_string = window.location.href.split('?')
if (query_string.length > 1){
startpage = query_string[1]
}
wobblyAddressBar.value = startpage
geminiGo()
}
function geminiHelpToggle() {
if (wobblyHelpButton.innerHTML === 'Help') {
wobblyHelp.style.display = 'block'
wobblyHelpButton.innerHTML = "Unhelp"
} else {
wobblyHelp.style.display = 'none'
wobblyHelpButton.innerHTML = "Help"
}
}
function geminiGo() {
url = wobblyAddressBar.value.trim().split("?")[0]
const pushurl = new URL(window.location.href.split('?')[0] + '?' + url)
window.history.pushState({}, '', pushurl)
if (url.length == 0) {
return
}
if (! url.startsWith("gemini://")) {
url = "gemini://" + url
}
const xmlHttp = new XMLHttpRequest()
xmlHttp.open( "GET", "browser.cgi?" + url )
xmlHttp.onload = function () {
const body = xmlHttp.responseText
wobblyWindow.innerHTML = body
}
xmlHttp.send(null)
}
// Big thanks to idiomdrottning for fixing my geminiUp function <3
function geminiUp() {
const components = wobblyAddressBar.value.match(/\/[^/]*/g)
if ("/" == components.pop()) components.pop()
if (components.length == 1) return
wobblyAddressBar.value = "gemini:" + components.join("") + "/"
geminiGo()
}
function geminiEnterListener(e) {
if(e.keyCode === 13) {
e.preventDefault()
geminiGo()
}
}
function geminiLinkClickListener(e) {
if (e.target.tagName === 'A' && e.target.href.startsWith("gemini://")) {
// We only care about clicked gemini:// links
e.preventDefault()
wobblyAddressBar.value = e.target.href
geminiGo()
} else {
return
}
}
window.onload = function () {
geminiInit()
}