diff options
Diffstat (limited to 'templates/55/ad-hominem/script.js')
-rw-r--r-- | templates/55/ad-hominem/script.js | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/templates/55/ad-hominem/script.js b/templates/55/ad-hominem/script.js new file mode 100644 index 0000000..46a2e5d --- /dev/null +++ b/templates/55/ad-hominem/script.js @@ -0,0 +1,356 @@ +/** + * Page scripts for Ad Hominem Info Template + * + * @author Sascha Leib <sascha@leib.be> + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* everything is contained in the $p namespace: */ +$p = { + + /* called to initialize the entire script */ + init: function() { + + $p.cookie_banner.init(); + $p.linkinfo.init(); + $p.search.init(); + $p.togglers.init(); + $p.langMenu.init(); + + }, + + /* link information */ + linkinfo: { + init: function() { + + /* find all links in the main section */ + var main = document.getElementById("main-layout"); + var al = main.getElementsByTagName("a"); + Array.prototype.forEach.call(al, function (a) { + + Object.entries($p.linkinfo._restURLs).forEach((c) => { + var cls = c[0]; + if (a.classList.contains(cls)) { + a.addEventListener('mouseover', $p.linkinfo._linkHoverCallback); + } + }); + }); + }, + + /* pre-defined REST API URLs for different sites. */ + /* variables are enclosed in %, allowed vars are: */ + /* - basedir = this site's basedir (e.g. "/"), */ + /* - id = the data id of the link (internal only) */ + /* - ln = the link name (e.g. for Wikipedia links) */ + /* types can be 'internal', 'wikimedia', or 'ahtpl' */ + /* for other sites using this template. */ + _restURLs : { + 'wikilink1' : { + url: '%basedir%lib/tpl/ad-hominem/rest/pageinfo.php?id=%id%&v=preview', + type:'internal' + }, + 'iw_wp' : { + url:'https://en.wikipedia.org/api/rest_v1/page/summary/%id%', + type:'wikimedia' + }, + 'iw_wpfr' : { + url:'https://fr.wikipedia.org/api/rest_v1/page/summary/%id%', + type:'wikimedia' + }, + 'iw_wpde' : { + url:'https://de.wikipedia.org/api/rest_v1/page/summary/%id%', + type:'wikimedia' + }, + 'iw_wpes' : { + url:'https://es.wikipedia.org/api/rest_v1/page/summary/%id%', + type:'wikimedia' + }, + 'iw_wppl' : { + url:'https://pl.wikipedia.org/api/rest_v1/page/summary/%id%', + type:'wikimedia' + }, + 'iw_wpja' : { + url:'https://it.wikipedia.org/api/rest_v1/page/summary/%id%', + type:'wikimedia' + }, + 'iw_wpru' : { + url:'https://ru.wikipedia.org/api/rest_v1/page/summary/%id%', + type:'wikimedia' + }, + 'iw_meta' : { + url:'https://meta.wikipedia.org/api/rest_v1/page/summary/%id%', + type:'wikimedia' + }, + 'iw_fo' : { + url:'https://fallacies.online/wiki/lib/tpl/ad-hominem/rest/pageinfo.php?id=%id%&v=preview', + base:'https://fallacies.online/wiki/', + type:'ahtpl' + }, + 'iw_dfo' : { + url:'https://denkfehler.online/wiki/lib/tpl/ad-hominem/rest/pageinfo.php?id=%id%&v=preview', + base:'https://denkfehler.online/wiki/', + type:'ahtpl' + } + }, + /* note: this covers the internal links and the most common + wikipedia lang versions. If you know about any other + relevant sites to be added here, let the author of this + template know (ad@hominem.info) */ + + /* TODO: mechanism to dynamically add sites by site admin */ + + /* callback for the onhover event of links: */ + _linkHoverCallback: function() { + + var a = jQuery(this); + var hi = jQuery.data(this, 'has-info'); + var href = jQuery(this).attr('href'); + var wid = null; + var url = null; + var type = ''; + + /* only if the info hasn't been set yet: */ + if (hi == undefined || hi == '') { + + // remember that we are now working on the link: + jQuery.data(this, 'has-info', '0'); + + // find the URL to query: + try { + for (var cls in $p.linkinfo._restURLs) { + if (a.hasClass(cls)) { + url = $p.linkinfo._restURLs[cls].url; + type = $p.linkinfo._restURLs[cls].type; + break; + } + }; + } catch (e) {} + + /* get the ID to request: */ + switch(type) { + + case 'internal': // internal links + url = url.replace('%basedir%', (typeof BASEDIR!=='undefined'?BASEDIR:'/')); + wid = jQuery(this).data('wiki-id'); + break; + case 'wikimedia': // wikipedia sites + wid = href.substring(href.lastIndexOf('/')+1); + break; + case 'ahtpl': // Other sites with this template + wid = href.substring($p.linkinfo._restURLs[cls].base.length).replaceAll('/', ':'); + break; + default: // unknown -> skip + return; + } + + // URL & ID found? + if (url !== null && typeof wid !== 'undefined') { + + /* load the page info */ + jQuery.ajax({ + url: url.replace('%id%', encodeURIComponent(wid)), + context: a, + dataType: 'json', + crossDomain: true, + error: function(xhr, msg, e) { + console.error(msg); + }, + success: function(data, msg, xhr) { + // build the new title for the element: + if (typeof data.title !== 'undefined') { + jQuery(this).attr('title', data.title + "\n" + data.extract); + jQuery.data(this, 'has-info', '1'); + } + }, + complete: function() { + if (jQuery.data(this, 'has-info') == '0') { + jQuery.removeData(this, 'has-info'); + } + } + }); + } + } + } + }, + + /* anything related to the search */ + search: { + + /* initializer */ + init: function() { + $p.search.gui.init(); + }, + + /* the search gui */ + gui: { + + _container: null, + _elements: { field: null, clear: null, search: null }, + + /* init the gui */ + init: function() { + + try { + + /* find all the search elements: */ + var form = document.getElementById('dw__search'); + + var div = form.getElementsByClassName('search-field')[0]; + $p.search.gui._container = div; + + var field = div.getElementsByTagName('input')[0]; + $p.search.gui._elements.field = field; + field.addEventListener('focus', $p.search.gui.__elementFocus); + field.addEventListener('blur', $p.search.gui.__elementBlur); + + var buttons = div.getElementsByTagName('button'); + Array.prototype.forEach.call(buttons, function(b) { + var type = b.getAttribute('type'); + if (type == 'reset') { + $p.search.gui._elements.clear = b; + } else if (type == 'submit') { + $p.search.gui._elements.search = b; + } + b.addEventListener('focus', $p.search.gui.__elementFocus); + b.addEventListener('blur', $p.search.gui.__elementBlur); + }); + + } catch (e) { + console.warn("Can’t initialize search form."); + console.error(e); + } + }, + + /* call back for fields */ + __elementFocus: function() { + $p.search.gui._container.classList.add("focus"); + }, + __elementBlur: function() { + $p.search.gui._container.classList.remove("focus"); + + } + } + }, + + /* expaning sections, for menus, etc. */ + togglers: { + + /* initialize togglers */ + init: function() { + + const togglers = document.getElementsByClassName("toggle"); + + Array.prototype.forEach.call(togglers, function(t) { + + /* add default state */ + if (!(t.classList.contains('show') || (t.classList.contains('hide')))) { + t.classList.add('auto'); + } + + /* add a callback to the toggler buttons */ + var btn = t.getElementsByClassName('tg_button'); + Array.prototype.forEach.call(btn, function(b) { + b.addEventListener('click', $p.togglers._buttonCallback); + b.classList.add('active'); + }); + + }); + }, + + /* callback for the toggler button click */ + _buttonCallback: function() { + + var t = this.parentNode; + + /* current state of the toggler: */ + var state = 'auto'; + if (t.classList.contains('show')) state = 'show'; + if (t.classList.contains('hide')) state = 'hide'; + if (t.classList.contains('alt')) state = 'alt'; + + /* set new state: */ + var newState = 'alt'; + if (state == 'show') { newState = 'hide' } + else if (state == 'hide') { newState = 'show' } + else if (state == 'alt') { newState = 'auto' } + + t.classList.remove(state); + t.classList.add(newState); + + } + }, + + /* the language menu, if present */ + langMenu: { + /* initialize lang menu */ + init: function() { + + const langMenu = document.getElementById('langButton'); + if (langMenu) { + jQuery(langMenu).click($p.langMenu._btnCallback); + } + }, + + _btnCallback: function(e) { + + const btn = e.currentTarget; + if (btn) { + const menuId = btn.getAttribute('aria-controls'); + const expanded = (btn.getAttribute('aria-expanded') == 'true'); + if (menuId) { + const menu = document.getElementById(menuId); + if (menu) { + if (expanded) { + jQuery(menu).hide(); + btn.setAttribute('aria-expanded', 'false') + } else { + jQuery(menu).show(); + btn.setAttribute('aria-expanded', 'true') + } + } + } + } + } + + }, + /* Cookies info banner */ + cookie_banner: { + + /* initialize Cookies info banner */ + init: function() { + + // find the cookiebanner elements: + var btn = jQuery('#cookiebanner button'); + + var cookie = jQuery.cookie('cookielaw'); + + if ( (cookie !== '1') && (btn.length >= 1) ) { // if found only + + // assign callback: + jQuery(btn).click($p.cookie_banner._buttonCallback); + + // show the banner + jQuery('#cookiebanner').show(); + + // set focus: + jQuery(btn).first().focus(); + } + }, + + /* callback for the "OK" button */ + _buttonCallback: function() { + + const date = new Date(); + date.setFullYear(date.getFullYear() + 1); + + var path = ( typeof BASEDIR !== 'undefined' ? BASEDIR : '/'); + + document.cookie = 'cookielaw=1; path=' + path + '; expires=' + date.toUTCString() + '; SameSite=Lax'; + jQuery('#cookiebanner').remove(); + } + } +}; + +/* load the script when the DOM is ready */ + +window.addEventListener("DOMContentLoaded", $p.init); |