4,554
edits
No edit summary |
No edit summary |
||
(48 intermediate revisions by the same user not shown) | |||
Line 176: | Line 176: | ||
if ($("#home").length > 0) { | if ($("#home").length > 0) { | ||
// This code will only run only on the homepage. | // This code will only run only on the homepage. | ||
$(".home-block-view").show(); | $(".home-block-view").show(); | ||
$(".home-chronicle-block-button, .home-block-view-button").addClass( | $(".home-chronicle-block-button, .home-block-view-button").addClass( | ||
Line 184: | Line 182: | ||
); | ); | ||
// Initially hide list view sorting buttons and set the default sorted view for block | // Initially hide list view sorting buttons and set the default sorted view for block | ||
$( | $( | ||
Line 197: | Line 194: | ||
$(".home-list-view-button").click(function () { | $(".home-list-view-button").click(function () { | ||
$(".home-list-sorting-buttons").css("display", "flex"); | $(".home-list-sorting-buttons").css("display", "flex"); | ||
// Switching view classes | // Switching view classes | ||
Line 882: | Line 878: | ||
function openModal(cardElement, event) { | function openModal(cardElement, event) { | ||
event.stopPropagation(); | event.stopPropagation(); | ||
$("#print-chooser").hide(); | |||
$("#show-article").removeClass("print-opts-open"); | |||
var pageTitle = $(cardElement).data("page") || null; // e.g. "090" | var pageTitle = $(cardElement).data("page") || null; // e.g. "090" | ||
window.currentEntryTitle = pageTitle; | window.currentEntryTitle = pageTitle; | ||
Line 1,223: | Line 1,221: | ||
// closeModal function | // closeModal function | ||
function closeModal() { | function closeModal() { | ||
$("#print-chooser").hide(); | |||
$("#show-article").removeClass("print-opts-open"); | |||
if ($(".home-chronicle-list").is(":visible")) { | if ($(".home-chronicle-list").is(":visible")) { | ||
$(".home-list-view").css("width", "100%"); | $(".home-list-view").css("width", "100%"); | ||
Line 1,260: | Line 1,260: | ||
}); | }); | ||
// --- PRINT | // HERE SHOULD BE THE NEW CODE!!!! | ||
/ | /* ---------- Softwear PRINT (scoped, ES5-safe) ---------- */ | ||
function | |||
/* helpers */ | |||
function swPrintPreloadFont() { | |||
var link = document.createElement("link"); | var link = document.createElement("link"); | ||
link.rel = "preload"; | link.rel = "preload"; | ||
Line 1,270: | Line 1,272: | ||
link.crossOrigin = "anonymous"; | link.crossOrigin = "anonymous"; | ||
document.head.appendChild(link); | document.head.appendChild(link); | ||
} | } | ||
function swPrintCacheBust(url) { | |||
function | |||
return url + (url.indexOf("?") > -1 ? "&" : "?") + "_=" + Date.now(); | return url + (url.indexOf("?") > -1 ? "&" : "?") + "_=" + Date.now(); | ||
} | } | ||
function swEnsurePrintChooser() { | |||
var $chooser = jQuery("#print-chooser"); | |||
if ($chooser.length) return $chooser; | |||
$chooser = jQuery( | |||
'<div id="print-chooser" class="print-chooser" style="display:none;">' + | |||
'<a href="#" id="print-with-border" class="print-choice">show border</a> ' + | |||
'<a href="#" id="print-no-border" class="print-choice">hide border</a>' + | |||
"</div>" | |||
); | |||
jQuery("#print-button").after($chooser); | |||
// Bind once on the chooser to catch nested elements | |||
if (!$chooser.data("swBound")) { | |||
function chooserFire(ev, where) { | |||
ev = ev || window.event; | |||
var t = ev && (ev.target || ev.srcElement); | |||
var a = t && t.closest ? t.closest("a[id]") : null; | |||
$ | if (!a) return; | ||
var id = a.getAttribute("id"); | |||
if (id !== "print-with-border" && id !== "print-no-border") return; | |||
if (ev.preventDefault) ev.preventDefault(); | |||
if (ev.stopImmediatePropagation) ev.stopImmediatePropagation(); | |||
if (ev.stopPropagation) ev.stopPropagation(); | |||
swHandlePrintChoice(id, (window.jQuery && jQuery(a)) || null); | |||
return false; | |||
} | |||
$chooser.on("pointerdown", chooserFire); | |||
$chooser.on("touchstart", chooserFire); | |||
$chooser.on("mousedown", chooserFire); | |||
$chooser.on("click", chooserFire); | |||
$chooser.data("swBound", true); | |||
} | } | ||
return $chooser; | |||
} | |||
function swHidePrintUI() { | |||
jQuery("#print-chooser").hide(); | |||
jQuery("#show-article").removeClass("print-opts-open"); | |||
} | |||
/* small boot probe */ | |||
. | (function () { | ||
try { | |||
console.log("[swprint] probe on load", { | |||
printButton: !!document.getElementById("print-button"), | |||
chooserExists: !!document.getElementById("print-chooser"), | |||
localPrintOnlyCount: jQuery(".print-only").length, | |||
showArticleExists: !!document.getElementById("show-article"), | |||
}); | |||
} catch (e) {} | |||
})(); | |||
/* core: build iframe and print */ | |||
function swBuildIframeAndPrint(printHtml, borderPref, $btn) { | |||
// iframe | |||
var iframe = document.createElement("iframe"); | |||
iframe.style.position = "fixed"; | |||
iframe.style.right = "0"; | |||
iframe.style.bottom = "0"; | |||
iframe.style.width = "0"; | |||
iframe.style.height = "0"; | |||
iframe.style.border = "0"; | |||
document.body.appendChild(iframe); | |||
var doc = iframe.contentDocument || iframe.contentWindow.document; | |||
doc.open(); | |||
doc.write( | |||
'<!doctype html><html><head><meta charset="utf-8"><title>Print</title></head><body></body></html>' | |||
); | |||
doc.close(); | |||
// make relative URLs resolve | |||
var base = doc.createElement("base"); | |||
base.href = location.origin + "/"; | |||
doc.head.appendChild(base); | |||
// print.css | |||
var linkCss = doc.createElement("link"); | |||
linkCss.rel = "stylesheet"; | |||
linkCss.href = swPrintCacheBust( | |||
"/index.php?title=MediaWiki:Print.css&action=raw&ctype=text/css" | |||
); | |||
var cssLoaded = new Promise(function (resolve) { | |||
linkCss.onload = resolve; | |||
linkCss.onerror = resolve; | |||
}); | |||
// font preload (inside iframe) | |||
var linkFont = doc.createElement("link"); | |||
linkFont.rel = "preload"; | |||
linkFont.as = "font"; | |||
linkFont.type = "font/woff2"; | |||
linkFont.href = "/fonts/HALColant-TextRegular.woff2?v=20250820"; | |||
linkFont.crossOrigin = "anonymous"; | |||
doc.head.appendChild(linkFont); | |||
doc.head.appendChild(linkCss); | |||
// inject HTML | |||
doc.body.innerHTML = printHtml; | |||
// sanitize: remove inner .print-no-border if user chose WITH border | |||
(function () { | |||
var stray = doc.querySelectorAll(".print-no-border"); | |||
if (borderPref === "with" && stray.length) { | |||
Array.prototype.forEach.call(stray, function (el) { | |||
el.className = (el.className || "") | |||
.replace(/\bprint-no-border\b/g, "") | |||
.trim(); | |||
}); | |||
} | |||
})(); | |||
// apply border preference to <html> | |||
(function () { | |||
var htmlEl = doc.documentElement; | |||
if (borderPref === "without") { | |||
if (htmlEl.classList) htmlEl.classList.add("print-no-border"); | |||
else if ( | |||
" | (" " + htmlEl.className + " ").indexOf(" print-no-border ") === -1 | ||
) { | |||
htmlEl.className += " print-no-border"; | |||
} | |||
} else { | |||
if (htmlEl.classList) htmlEl.classList.remove("print-no-border"); | |||
else | |||
htmlEl.className = (htmlEl.className || "").replace( | |||
/\bprint-no-border\b/g, | |||
"" | |||
" | |||
); | ); | ||
} | |||
})(); | |||
// OPTIONAL: glue label + body together (extra safety vs. page breaks) | |||
(function () { | |||
var style = doc.createElement("style"); | |||
style.textContent = | |||
"@media print{.sw-keep{break-inside:avoid;page-break-inside:avoid;}}"; | |||
doc.head.appendChild(style); | |||
var pairs = [ | |||
[".article-label-description", ".article-description"], | |||
[".article-label-reflection", ".article-reflection"], | |||
[".article-label-external-reference", ".article-external-reference"], | |||
[".article-label-quote", ".article-quote"], | |||
[".article-label-modification-date", ".article-modification-date"], | |||
]; | |||
for (var i = 0; i < pairs.length; i++) { | |||
var labelSel = pairs[i][0]; | |||
var bodySel = pairs[i][1]; | |||
var labels = doc.querySelectorAll(labelSel); | |||
for (var j = 0; j < labels.length; j++) { | |||
var label = labels[j]; | |||
})(); | var body = label.nextElementSibling; | ||
if (!body || !body.matches(bodySel)) continue; | |||
var wrap = doc.createElement("div"); | |||
wrap.className = "sw-keep"; | |||
label.parentNode.insertBefore(wrap, label); | |||
wrap.appendChild(label); | |||
wrap.appendChild(body); | |||
} | |||
} | |||
})(); | |||
// clean empty paragraphs | |||
(function () { | |||
var ps = doc.querySelectorAll("#article-content p"); | |||
Array.prototype.forEach.call(ps, function (p) { | |||
var txt = (p.textContent || "").replace(/\u00a0/g, " ").trim(); | |||
var onlyBr = | |||
p.children && | |||
p.children.length === 1 && | |||
p.firstElementChild && | |||
p.firstElementChild.tagName === "BR"; | |||
if ( | |||
(!txt && !p.querySelector("img, a, strong, em, span:not(:empty)")) || | |||
onlyBr | |||
) { | |||
if (p.parentNode) p.parentNode.removeChild(p); | |||
} | |||
}); | |||
var root = doc.getElementById("article-content"); | |||
if (root) { | |||
var kids = Array.prototype.slice.call(root.childNodes); | |||
for (var k = 0; k < kids.length; k++) { | |||
var n = kids[k]; | |||
if (n.nodeType === 3 && !n.textContent.replace(/\s+/g, "")) { | |||
root.removeChild(n); | |||
} | |||
} | } | ||
} | |||
})(); | |||
// inline micro-tweaks for print spacing | |||
(function () { | |||
var css = | |||
"@media print{" + | |||
" .article-description p,.article-reflection p,.article-external-reference p,.article-quote p{margin:0 0 1.2mm!important;}" + | |||
" .article-description p:last-child,.article-reflection p:last-child,.article-external-reference p:last-child,.article-quote p:last-child{margin-bottom:0!important;}" + | |||
" .article-entry-number,.link-pdf,.article-type,.article-metadata,.article-images,.article-description,.article-reflection,.article-external-reference,.article-quote,.article-mod-line{padding-bottom:1mm!important;}" + | |||
" .article-label-description + .article-description," + | |||
" .article-label-reflection + .article-reflection," + | |||
" .article-label-external-reference + .article-external-reference," + | |||
" .article-label-quote + .article-quote," + | |||
" .article-label-modification-date + .article-modification-date{margin-top:0!important;}" + | |||
" .article-title-link{margin:0!important;padding:0!important;}" + | |||
" .article-title-link > *{margin:0!important;}" + | |||
" .link-pdf{margin-top:0!important;}" + | |||
" #article-content > :last-child{padding-bottom:0!important;}" + | |||
" #article-content > :last-child::after{content:none!important;}" + | |||
"}"; | |||
var style = doc.createElement("style"); | |||
style.type = "text/css"; | |||
style.appendChild(doc.createTextNode(css)); | |||
doc.head.appendChild(style); | |||
})(); | |||
// link tweaks (wrapping / underline) | |||
(function () { | |||
var styleFix = doc.createElement("style"); | |||
styleFix.textContent = | |||
"@media print {.article-external-reference a,.link-pdf a{white-space:nowrap!important;word-break:normal!important;overflow-wrap:normal!important;text-decoration:underline}.article-external-reference{overflow-wrap:anywhere;word-break:break-word}a[href]{position:relative}}"; | |||
doc.head.appendChild(styleFix); | |||
var refs = doc.querySelectorAll(".article-external-reference a[href]"); | |||
Array.prototype.forEach.call(refs, function (a) { | |||
var txt = (a.textContent || "").trim(); | |||
var href = a.getAttribute("href") || ""; | |||
var looksLongUrl = /^https?:\/\//i.test(txt) && txt.length > 60; | |||
if (looksLongUrl) { | |||
try { | |||
var u = new URL(href, doc.baseURI); | |||
var label = | |||
}); | u.hostname + (u.pathname.replace(/\/$/, "") ? u.pathname : ""); | ||
if (label.length > 40) label = label.slice(0, 37) + "…"; | |||
a.textContent = label; | |||
} catch (e) { | |||
a.textContent = "Link"; | |||
} | |||
} | } | ||
a.style.whiteSpace = "nowrap"; | |||
a.style.wordBreak = "normal"; | |||
a.style.overflowWrap = "normal"; | |||
}); | |||
})(); | |||
function | // waits | ||
function waitImages() { | |||
var imgs = [].slice.call(doc.images || []); | |||
if (!imgs.length) return Promise.resolve(); | |||
return Promise.all( | |||
imgs.map(function (img) { | |||
if (img.decode) { | |||
try { | |||
return img.decode().catch(function () {}); | |||
} catch (e) {} | |||
} | |||
return new Promise(function (res) { | return new Promise(function (res) { | ||
( | if (img.complete) return res(); | ||
img.onload = img.onerror = function () { | |||
res(); | |||
}; | |||
}); | }); | ||
}) | |||
); | |||
} | |||
function waitFonts(timeoutMs) { | |||
if (!doc.fonts || !doc.fonts.ready) return Promise.resolve(); | |||
var ready = doc.fonts.ready; | |||
var t = new Promise(function (res) { | |||
setTimeout(res, timeoutMs || 1200); | |||
}); | |||
return Promise.race([ready, t]); | |||
} | |||
function waitSpecificFont(timeoutMs) { | |||
if (!doc.fonts || !doc.fonts.load) return Promise.resolve(); | |||
var p = Promise.all([ | |||
doc.fonts.load('400 16px "HALColant-TextRegular"'), | |||
doc.fonts.load('normal 16px "HALColant-TextRegular"'), | |||
]); | |||
var t = new Promise(function (res) { | |||
setTimeout(res, timeoutMs || 1200); | |||
}); | |||
return Promise.race([p, t]); | |||
} | |||
function nextFrame() { | |||
return new Promise(function (res) { | |||
(iframe.contentWindow.requestAnimationFrame || setTimeout)(res, 0); | |||
}); | |||
} | |||
Promise.all([ | |||
cssLoaded, | |||
waitImages(), | |||
waitFonts(1200), | |||
waitSpecificFont(1200), | |||
nextFrame(), | |||
]) | |||
.then(function () { | |||
// filename via document.title | |||
var entryNum = ""; | |||
var numEl = doc.querySelector(".article-entry-number"); | |||
if (numEl) { | |||
var m = (numEl.textContent || "").match(/\d+/); | |||
entryNum = m ? m[0] : ""; | |||
} | } | ||
var desiredTitle = | |||
(entryNum ? entryNum + "." : "") + "softwear.directory"; | |||
var oldIframeTitle = doc.title; | |||
var oldParentTitle = document.title; | |||
iframe.contentWindow.onafterprint = function () { | iframe.contentWindow.onafterprint = function () { | ||
try { | |||
doc.title = oldIframeTitle; | |||
document.title = oldParentTitle; | |||
} catch (e) {} | |||
setTimeout(function () { | setTimeout(function () { | ||
if (iframe.parentNode) iframe.parentNode.removeChild(iframe); | if (iframe.parentNode) iframe.parentNode.removeChild(iframe); | ||
}, 100); | }, 100); | ||
$btn.data("busy", false); | if ($btn && $btn.length) $btn.data("busy", false); | ||
}; | }; | ||
doc.title = desiredTitle; | |||
document.title = desiredTitle; | |||
iframe.contentWindow.focus(); | |||
iframe.contentWindow.print(); | |||
// safety cleanup | |||
setTimeout(function () { | |||
try { | try { | ||
iframe. | doc.title = oldIframeTitle; | ||
document.title = oldParentTitle; | |||
} catch (e) {} | |||
if (iframe.parentNode) iframe.parentNode.removeChild(iframe); | |||
if ($btn && $btn.length) $btn.data("busy", false); | |||
}, 1000); | |||
}) | |||
.catch(function () { | |||
} | if ($btn && $btn.length) $btn.data("busy", false); | ||
}); | |||
} | |||
/* decide source & kick print */ | |||
function swHandlePrintChoice(id, $btn) { | |||
if ($btn && $btn.data("busy")) return; | |||
if ($btn && $btn.length) $btn.data("busy", true); | |||
var borderPref = id === "print-no-border" ? "without" : "with"; | |||
swPrintPreloadFont(); | |||
// prefer local .print-only (Entry page) | |||
var localPrintOnly = jQuery(".print-only").first(); | |||
if (localPrintOnly.length) { | |||
swHidePrintUI(); | |||
swBuildIframeAndPrint(localPrintOnly.prop("outerHTML"), borderPref, $btn); | |||
return; | |||
} | |||
// otherwise fetch by title (modal/home) | |||
var title = | |||
window.currentEntryTitle || | |||
(window.mw && mw.config && mw.config.get && mw.config.get("wgPageName")); | |||
if (!title) { | |||
window.print(); | |||
if ($btn && $btn.length) $btn.data("busy", false); | |||
return; | |||
} | |||
var pageUrl = | |||
window.mw && mw.util && mw.util.getUrl | |||
? mw.util.getUrl(title) | |||
: "/wiki/" + String(title); | |||
jQuery | |||
.get(swPrintCacheBust(pageUrl)) | |||
.done(function (html) { | |||
var $tmp = jQuery("<div>").html(html); | |||
var $print = $tmp.find(".print-only").first(); | |||
if (!$print.length) { | |||
window.print(); | |||
if ($btn && $btn.length) $btn.data("busy", false); | |||
return; | |||
} | |||
swHidePrintUI(); | |||
swBuildIframeAndPrint($print.prop("outerHTML"), borderPref, $btn); | |||
}) | }) | ||
.fail(function ( | .fail(function () { | ||
window.print(); | window.print(); | ||
jQuery("#print-button").data("busy", false); | |||
}); | }); | ||
} | |||
/* bind current choice anchors (defensive, for Entry pages) */ | |||
function swBindChoiceAnchors() { | |||
var sel = "#print-with-border, #print-no-border"; | |||
var els = document.querySelectorAll(sel); | |||
for (var i = 0; i < els.length; i++) { | |||
(function (el) { | |||
if (el.__swChoiceBound) return; | |||
el.__swChoiceBound = true; | |||
// ensure clickable/accessible | |||
try { | |||
el.style.pointerEvents = el.style.pointerEvents || "auto"; | |||
if (!el.getAttribute("role")) el.setAttribute("role", "button"); | |||
if (!el.getAttribute("tabindex")) el.setAttribute("tabindex", "0"); | |||
} catch (e) {} | |||
function fire(ev) { | |||
if (ev && ev.preventDefault) ev.preventDefault(); | |||
if (ev && ev.stopImmediatePropagation) ev.stopImmediatePropagation(); | |||
if (ev && ev.stopPropagation) ev.stopPropagation(); | |||
var $a = (window.jQuery && jQuery(el)) || null; | |||
swHandlePrintChoice(el.id, $a); | |||
return false; | |||
} | |||
// early + normal phases | |||
el.addEventListener("pointerdown", fire, true); | |||
el.addEventListener("touchstart", fire, true); | |||
el.addEventListener("mousedown", fire, true); | |||
el.addEventListener("click", fire, true); | |||
el.addEventListener("click", fire, false); | |||
if (!el.onclick) el.onclick = fire; | |||
// keyboard | |||
el.addEventListener( | |||
"keydown", | |||
function (e) { | |||
var k = e.key || e.keyCode; | |||
if (k === "Enter" || k === 13 || k === " " || k === 32) fire(e); | |||
}, | |||
true | |||
); | |||
})(els[i]); | |||
} | |||
} | |||
/* early global catcher (minimal) */ | |||
(function () { | |||
if (window.__swprintEarlyCatcher) return; | |||
window.__swprintEarlyCatcher = true; | |||
function routeEarly(ev) { | |||
var t = ev.target; | |||
if (!t || !t.closest) return; | |||
var a = t.closest("a#print-with-border, a#print-no-border"); | |||
if (!a) return; | |||
if (ev.preventDefault) ev.preventDefault(); | |||
if (ev.stopImmediatePropagation) ev.stopImmediatePropagation(); | |||
if (ev.stopPropagation) ev.stopPropagation(); | |||
swHandlePrintChoice(a.id, (window.jQuery && jQuery(a)) || null); | |||
return false; | |||
} | |||
window.addEventListener("pointerdown", routeEarly, true); | |||
window.addEventListener("touchstart", routeEarly, true); | |||
window.addEventListener("mousedown", routeEarly, true); | |||
})(); | |||
/* wiring (namespaced) */ | |||
jQuery(document).off("click.swprint"); | |||
jQuery(document).on( | |||
"click.swprint", | |||
"#print-button, #print-chooser, #print-options", | |||
function (e) { | |||
// main [print] toggler | |||
if (jQuery(e.target).closest("#print-button").length) { | |||
e.preventDefault(); | |||
var $chooser = swEnsurePrintChooser(); | |||
$chooser.css({ position: "absolute", zIndex: 99999 }); | |||
$chooser.toggle(); | |||
var visible = $chooser.is(":visible"); | |||
jQuery("#show-article").toggleClass("print-opts-open", visible); | |||
// ensure anchors are bound (important on Entry pages) | |||
swBindChoiceAnchors(); | |||
return; | |||
} | |||
// click directly on a choice link (fallback path) | |||
var $choice = jQuery(e.target).closest( | |||
"a#print-with-border, a#print-no-border" | |||
); | |||
if (!$choice.length) return; | |||
e.preventDefault(); | |||
swHandlePrintChoice($choice.attr("id"), $choice); | |||
} | |||
); | |||
// map any <button> inside chooser to its host anchor | |||
jQuery(document).on( | |||
"click.swprintChoiceBtn2", | |||
"#print-chooser button", | |||
function (e) { | |||
var host = this.closest( | |||
'[id="print-with-border"], [id="print-no-border"]' | |||
); | |||
if (!host) return; | |||
e.preventDefault(); | |||
swHandlePrintChoice(host.id, (window.jQuery && jQuery(host)) || null); | |||
} | |||
); | |||
// hide choices on ESC | |||
jQuery(document).on("keydown.swprint", function (e) { | |||
if (e && e.keyCode === 27) swHidePrintUI(); | |||
}); | }); | ||
/* ---------- /Softwear PRINT ---------- */ | |||
// Close modal with Close button | // Close modal with Close button | ||
$("#close-button").on("click", function () { | $("#close-button").on("click", function () { | ||
$("#print-chooser").hide(); | |||
$("#show-article").removeClass("print-opts-open"); | |||
$(".list-container").removeClass("fade-out"); | $(".list-container").removeClass("fade-out"); | ||
closeModal(); | closeModal(); | ||
Line 1,614: | Line 1,856: | ||
} | } | ||
// | // paragraph-formatting block | ||
if (jQuery("#show-article-wrapper-entry").length) { | |||
if ( | |||
function formatParagraphs(text) { | function formatParagraphs(text) { | ||
var | // split on newlines, drop empty lines, wrap each in <p> | ||
var parts = String(text || "").split("\n"); | |||
var out = []; | |||
for (var i = 0; i < parts.length; i++) { | |||
var p = parts[i].replace(/^\s+|\s+$/g, ""); | |||
if (p) out.push("<p>" + p + "</p>"); | |||
} | |||
return out.join(""); | |||
} | } | ||
jQuery( | |||
"#show-article .article-description, #show-article .article-reflection" | |||
var | ).each(function () { | ||
var $el = jQuery(this); | |||
if ($el.children("p").length > 0) return; // already formatted by PageForms | |||
var rawText = $el.text(); | |||
$el.html(formatParagraphs(rawText)); | |||
}); | |||
var | |||
$ | |||
} | |||
} | } | ||
Line 1,707: | Line 1,939: | ||
// Check if #submit button exists and add event listener if it does | // Check if #submit button exists and add event listener if it does | ||
var submitButton = document.querySelector("#submit"); | var submitButton = document.querySelector("#submit"); | ||
if (submitButton) { | if (submitButton) { | ||
// Add click event listener | // Add click event listener | ||
submitButton.addEventListener("click", function (event) { | submitButton.addEventListener("click", function (event) { | ||
event.preventDefault(); // Prevent the default link behavior | event.preventDefault(); // Prevent the default link behavior | ||