105 lines
2.6 KiB
JavaScript
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()
|
|
}
|