Tip of the Day
Skill levels exceeding a recipe's main skill requirement in the crafting interface provide additional Crafting outcome.

MediaWiki:Common.js: Difference between revisions

From Walkscape Walkthrough
change sticky edit link
mNo edit summary
 
(36 intermediate revisions by 2 users not shown)
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */
/* VARIABLES ***********************************************************************************************************************/
/* VARIABLES ***********************************************************************************************************************/
var currentPageUrl = window.location.href;
var currentPageUrl = window.location.href;
var currentPageEditUrl = mw.util.getUrl( null, { action: 'edit' } );
var currentPageEditUrl = mw.util.getUrl(null, {
var currentPageName = mw.util.getUrl( null, null ).replace('/wiki/', '');
action: 'edit'
});
var currentPageName = mw.util.getUrl(null, null).replace('/wiki/', '');
var currentPageNamespaceID = mw.config.get('wgNamespaceNumber');
var currentPageNamespaceID = mw.config.get('wgNamespaceNumber');
//variables needed after page load
//variables needed after page load
var buttons, contents, allLinks;
var buttons, contents, allLinks;
//variables needed for the infobutton
//variables needed for the infobutton
var infobutton, infopanel;
var infobutton, infopanel;
/* *********************************************************************************************************************************/
/* *********************************************************************************************************************************/
// Matomo
// Matomo
var _paq = window._paq = window._paq || [];
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/*
_paq.push(['trackPageView']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
_paq.push(['enableLinkTracking']);
Line 29: Line 25:
   g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
   g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
})();
 
*/
 
 
 
 
 
 
/* sticky edit button */
/* sticky edit button */
// display the button only if #mw-content is present, if we are not in the edit mode, and if we're not in the Special: or Community: namespace
// display the button only if #mw-content is present, if we are not in the edit mode, and if we're not in the Special: or Community: namespace
/*
if (document.body.contains(document.getElementById("mw-content")) && !currentPageUrl.includes("action=") && currentPageNamespaceID != -1 && currentPageNamespaceID != 3004)  {
if (document.body.contains(document.getElementById("mw-content")) && !currentPageUrl.includes("action=") && currentPageNamespaceID != -1 && currentPageNamespaceID != 3004)  {
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<a href="https://wiki-temp.walkscape.app/' + currentPageEditUrl + '"><div id="custom-editbutton"><svg width="40" height="40" viewBox="-12 -10 50 50"><path d="M 20 2 L 26 8 L 8 26 L 2 26 L 2 20 Z M 16 6 L 22 12"></path></svg></div></a>');
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<a href="https://wiki-temp.walkscape.app/' + currentPageEditUrl + '"><div id="custom-editbutton"><svg width="40" height="40" viewBox="-12 -10 50 50"><path d="M 20 2 L 26 8 L 8 26 L 2 26 L 2 20 Z M 16 6 L 22 12"></path></svg></div></a>');
}
}
 
*/
 
 
 
 
 
 
 
 
 
 
///////////////////////////////////////// ADDING THE INFO BUTTON
///////////////////////////////////////// ADDING THE INFO BUTTON
var infotitle = currentPageName + '/doc';
var infotitle = currentPageName + '/doc';
// add the info button ONLY when we use the edit mode now
if (document.body.contains(document.getElementById("mw-content")) && (currentPageUrl.includes("action=edit") || currentPageUrl.includes("action=submit"))) {
mw.loader.using('mediawiki.api', function() {
var api = new mw.Api();
api.get({
action: "query",
titles: [infotitle],
}).then(function(ret) {
$.each(ret.query.pages, function() {
if (this.missing !== "") {
pageExists();
}
});
});


// add the info button ONLY when we use the edit mode now
function pageExists() {
if (document.body.contains(document.getElementById("mw-content")) && (currentPageUrl.includes("action=edit") || currentPageUrl.includes("action=submit")))
api.get({
{
action: 'parse',
mw.loader.using('mediawiki.api', function() {
page: infotitle,
var api = new mw.Api();
contentmodel: 'wikitext'
}).done(function(data) {
api.get( {
InsertInfoPanel(data.parse.text['*']);
    action: "query",
});
    titles: [infotitle],
}
} ).then( function( ret ) {
});
    $.each( ret.query.pages, function() {
        if ( this.missing !== "" ) {
            pageExists();
        }
    } );
});
function pageExists() {
api.get( {
    action: 'parse',
    page: infotitle,
    contentmodel: 'wikitext'
} ).done( function ( data ) {
InsertInfoPanel( data.parse.text['*'] );
});
}
}
});
}


function InsertInfoPanel( text )
function InsertInfoPanel(text) {
{
//check which namespace we're in and adapt the text to it
//check which namespace we're in and adapt the text to it
var infopanelTitle = 'Page';
var infopanelTitle = 'Page';
if (currentPageNamespaceID == 10) { //Template
if (currentPageNamespaceID == 10) { //Template
infopanelTitle = 'Template';
infopanelTitle = 'Template';
}
} else if (currentPageNamespaceID == 828) { //Module
else if (currentPageNamespaceID == 828) { //Module
infopanelTitle = 'Module';
infopanelTitle = 'Module';
}
}
// insert the panel and button
// insert the panel and button
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<div id="custom-infobutton"></div><div id="custom-infopanel" style="display: none"><div id="custom-infopanel-title">' + infopanelTitle + ' Info</div><div id="custom-infopanel-content">' + text + '</div></div>');
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<div id="custom-infobutton"></div><div id="custom-infopanel" style="display: none"><div id="custom-infopanel-title">' + infopanelTitle + ' Info</div><div id="custom-infopanel-content">' + text + '</div></div>');
//set up containers
//set up containers
infopanel = document.getElementById("custom-infopanel");
infopanel = document.getElementById("custom-infopanel");
infobutton = document.getElementById("custom-infobutton");
infobutton = document.getElementById("custom-infobutton");
//add an event listener to the button
//add an event listener to the button
infobutton.addEventListener("click", infobuttonClicked);
infobutton.addEventListener("click", infobuttonClicked);
}
}


 
function infobuttonClicked() {
 
if (infopanel.style.display == 'none') {
function infobuttonClicked()
{
if (infopanel.style.display == 'none')
{
infopanel.style.display = 'block';
infopanel.style.display = 'block';
}
} else {
else
{
infopanel.style.display = 'none';
infopanel.style.display = 'none';
}
}
}
}
/* rename the "DISCUSSION" talk page button to "DOCUMENTATION" */
/* rename the "DISCUSSION" talk page button to "DOCUMENTATION" */
//if there is such a button and we're in the Template: namespace
//if there is such a button and we're in the Template: namespace
if (document.body.contains(document.getElementById("ca-talk")) && currentPageNamespaceID == 10) {
if (document.body.contains(document.getElementById("ca-talk")) && currentPageNamespaceID == 10) {
document.getElementById("ca-talk").innerHTML = '<svg class="cosmos-button-icon" width="28" height="28" viewBox="-2 -2 20 20"><path d="M 4 2 Q 4 0 6 0 L 14 0 Q 16 0 16 2 L 8 2 Q 8 0 6 0 Q 4 0 4 2 L 4 12 Q 4 14 2 14 Q 0 14 0 12 L 2 12 L 0 12 Q 0 14 2 14 L 12 14 Q 14 14 14 12 L 14 4"></path></svg><span class="cosmos-button-text">Documentation</span>';
document.getElementById("ca-talk").innerHTML = '<svg class="cosmos-button-icon" width="28" height="28" viewBox="-2 -2 20 20"><path d="M 4 2 Q 4 0 6 0 L 14 0 Q 16 0 16 2 L 8 2 Q 8 0 6 0 Q 4 0 4 2 L 4 12 Q 4 14 2 14 Q 0 14 0 12 L 2 12 L 0 12 Q 0 14 2 14 L 12 14 Q 14 14 14 12 L 14 4"></path></svg><span class="cosmos-button-text">Documentation</span>';
}
 
 
 
/*Breeding Calculator injection script */
 
 
if (document.body.contains(document.getElementById("calculator")))  {
 
// include jQuery
mw.loader.load( 'https://mercstoria.miraheze.org/w/index.php?title=MediaWiki:JQuery.js&action=raw&ctype=text/javascript' );
//mw.loader.load( 'https://mercstoria.miraheze.org/w/index.php?title=MediaWiki:LazyLoad.js&action=raw&ctype=text/javascript' );
 
// main div for calculator content
var myDiv = document.getElementById("calculator");
myDiv.style.fontFamily = 'verdana';
 
//create div element for hidden database
var hiddenDiv = document.createElement("div");
hiddenDiv.setAttribute("id", "hiddenBox");
hiddenDiv.setAttribute("style", "display:none");
myDiv.appendChild(hiddenDiv);
 
 
var breedable_dragons = {
  "Uncommon": [],
  "Rare": [],
  "Epic": [],
  "Legendary": [],
};
 
var dragons;
var dragon_index;
 
var common_dragons;
var uncommon_dragons;
var rare_dragons;
var epic_dragons;
var legendary_dragons;
 
var selected_type;
var target_dragon;
 
// load data from Template into hiddenBox
// parse textContent into variable dragons
$("#hiddenBox").load('https://dragontamer.miraheze.org/wiki/Template:Dragon_List_Data/Js-calc #data-container', function(){
 
    var dataContainer = this.textContent;
 
    dragons = JSON.parse(dataContainer)['dragons'];
 
    dragon_index = {};
   
    common_dragons = {};
    uncommon_dragons = {};
    rare_dragons = {};
    epic_dragons = {};
    legendary_dragons = {};
 
    for (var i = 0; i < dragons.length; i++) {
 
      dragon_index[dragons[i]['name']] = i
     
      if (dragons[i]['rarity'] == "Common") { common_dragons[dragons[i]['name']] = [ dragons[i]['element1'] , dragons[i]['element2'] ] ; }
      if (dragons[i]['rarity'] == "Uncommon") { uncommon_dragons[dragons[i]['name']] = [ dragons[i]['element1'] , dragons[i]['element2'] ] ; }
      if (dragons[i]['rarity'] == "Rare") { rare_dragons[dragons[i]['name']] = [ dragons[i]['element1'] , dragons[i]['element2'] ] ; }
      if (dragons[i]['rarity'] == "Epic") { epic_dragons[dragons[i]['name']] = [ dragons[i]['element1'] , dragons[i]['element2'] ] ; }
      if (dragons[i]['rarity'] == "Legendary") { legendary_dragons[dragons[i]['name']] = [ dragons[i]['element1'] , dragons[i]['element2'] ] ; }
 
      if (dragons[i]['breedable']) {
          if (dragons[i]['rarity'] == "Uncommon") { breedable_dragons['Uncommon'].push(dragons[i]['name']); }
          if (dragons[i]['rarity'] == "Rare") { breedable_dragons['Rare'].push(dragons[i]['name']); }
          if (dragons[i]['rarity'] == "Epic") { breedable_dragons['Epic'].push(dragons[i]['name']); }
          if (dragons[i]['rarity'] == "Legendary") { breedable_dragons['Legendary'].push(dragons[i]['name']); }
      }
    }
 
   
 
   
 
    define_dragons(dragons,dragon_index,common_dragons,uncommon_dragons,rare_dragons,epic_dragons,legendary_dragons);
 
   
});
 
 
 
//create select rarity type element
var selectListType = document.createElement("select");
selectListType.setAttribute("id", "breed_target_type");
selectListType.setAttribute("onchange", "show_breed_select()");
selectListType.style.width = '100%';
selectListType.style.textAlign = 'center';
myDiv.appendChild(selectListType);
 
//add placeholder option
var optionType = document.createElement("option");
optionType.setAttribute("selected", "True");
optionType.setAttribute("hidden", "True");
optionType.text = "select Rarity";
selectListType.appendChild(optionType);
 
//create select element
var selectList = document.createElement("select");
selectList.setAttribute("id", "breed_target");
selectList.setAttribute("onchange", "calc_dragons()");
selectList.style.width = '100%';
selectList.style.textAlign = 'center';
myDiv.appendChild(selectList);
 
//add placeholder option
var option = document.createElement("option");
option.setAttribute("selected", "True");
option.setAttribute("hidden", "True");
option.text = "select Dragon to breed";
selectList.appendChild(option);
 
//create target table element
var targetTable = document.createElement("table");
targetTable.setAttribute("id", "target_table");
targetTable.style.borderCollapse = "collapse";
targetTable.style.width = '100%';
 
var tr = document.createElement('tr');
var td = document.createElement('td');
td.setAttribute("id", "target_banner");
td.style.textAlign = 'center';
tr.appendChild(td);
targetTable.appendChild(tr);
myDiv.appendChild(targetTable);
 
 
//create result table element
var resultTable = document.createElement("table");
resultTable.setAttribute("id", "result_table");
resultTable.style.width = '100%';
resultTable.style.borderCollapse = "collapse";
resultTable.style.display= 'table';
myDiv.appendChild(resultTable);
 
//create info element
var infofooter = document.createElement("div");
infofooter.setAttribute("id", "infofooter");
infofooter.style.width = '100%';
infofooter.style.textAlign = 'center';
myDiv.appendChild(infofooter);
 
var select = document.getElementById("breed_target");
 
var elements = {
  1: "Nature",
  2: "Fire",
  3: "Water",
  4: "Electric",
  5: "Earth",
  6: "Metal",
  7: "Psychic",
  8: "Light",
  9: "Dark",
  10: "Chaos",
};
 
var elements_img = {
  null : "",
  "Nature": "<img src='https://static.miraheze.org/dragontamerwiki/a/a7/Nature.png'>",
  "Fire": "<img src='https://static.miraheze.org/dragontamerwiki/3/30/Fire.png'>",
  "Water": "<img src='https://static.miraheze.org/dragontamerwiki/9/9d/Water.png'>",
  "Electric": "<img src='https://static.miraheze.org/dragontamerwiki/2/2f/Electric.png'>",
  "Earth": "<img src='https://static.miraheze.org/dragontamerwiki/1/1e/Earth.png'>",
  "Metal": "<img src='https://static.miraheze.org/dragontamerwiki/e/e1/Metal.png'>",
  "Psychic": "<img src='https://static.miraheze.org/dragontamerwiki/2/21/Psychic.png'>",
  "Light": "<img src='https://static.miraheze.org/dragontamerwiki/a/a6/Light.png'>",
  "Dark": "<img src='https://static.miraheze.org/dragontamerwiki/0/0e/Dark.png'>",
  "Chaos": "<img src='https://static.miraheze.org/dragontamerwiki/8/8f/Chaos.png'>",
};
 
var elements_img_tiny = {
  null : "",
  "Nature": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/a/a7/Nature.png'>",
  "Fire": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/3/30/Fire.png'>",
  "Water": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/9/9d/Water.png'>",
  "Electric": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/2/2f/Electric.png'>",
  "Earth": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/1/1e/Earth.png'>",
  "Metal": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/e/e1/Metal.png'>",
  "Psychic": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/2/21/Psychic.png'>",
  "Light": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/a/a6/Light.png'>",
  "Dark": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/0/0e/Dark.png'>",
  "Chaos": "<img height='20' src='https://static.miraheze.org/dragontamerwiki/8/8f/Chaos.png'>",
};
 
var breedable_types = ["Uncommon","Rare","Epic","Legendary"];
 
 
// include all options for type
for (var i = 0; i < breedable_types.length; i++) {
  var opt = breedable_types[i];
  var el = document.createElement("option");
  el.textContent = opt;
  el.value = opt;
  breed_target_type.appendChild(el);
}
 
 
// end of open code
}
 
 
function define_dragons(input,index,common,uncommon,rare,epic,legendary) {
  dragons = input;
  dragon_index = index;
  common_dragons = common;
  uncommon_dragons = uncommon;
  rare_dragons = rare;
  epic_dragons = epic;
  legendary_dragons = legendary;
 
}
 
function print_row(left, right,dragontype, info) {
  // Find a <table> element with id="myTable":
 
  var target_table = document.getElementById("target_table");
  var table = document.getElementById("result_table");
  var infofooter = document.getElementById("infofooter");
  var row = table.insertRow(0);
  var cell1 = row.insertCell(0);
  var cell2 = row.insertCell(1);
 
  var left_content = "<table style='width:100%'><tr>";
  for (var i = 0; i < left.length; i++) {
    left_content += "<td>" + left[i] + "</td><td style='text-align:right'>" + elements_img_tiny[dragontype[left[i]][0]] + elements_img_tiny[dragontype[left[i]][1]] + "</td><tr>";
  }
 
  var right_content = "<table style='width:100%'><tr>";
  for (var i = 0; i < right.length; i++) {
    right_content += "<td>" + right[i] + "</td><td style='text-align:right'>" + elements_img_tiny[dragontype[right[i]][0]] + elements_img_tiny[dragontype[right[i]][1]] + "</td><tr>";
  }
 
  target_table.style.background = "#949494";
  row.style.border = "solid #949494";
  cell1.innerHTML = left_content;
  cell1.style.border = "solid #949494";
  cell2.innerHTML = right_content;
  cell2.style.border = "solid #949494";
  infofooter.innerHTML = info;
}
}
function clear_table() {
  var result_table = document.getElementById("result_table");
  result_table.innerHTML = "";
}
function remove_item(list, item) {
  const index = list.indexOf(item);
  if (index > -1) {
    list.splice(index, 1);
  }
  return list;
}
function show_breed_select() {
selected_type = document.getElementById("breed_target_type").value;
clearOptions(document.getElementById('breed_target'));
if (selected_type == "Uncommon") {
  for (var i = 0; i < breedable_dragons["Uncommon"].length; i++) {
      var opt = breedable_dragons["Uncommon"][i];
      var el = document.createElement("option");
      el.textContent = opt;
      el.value = opt;
      breed_target.appendChild(el);
  }
}
if (selected_type == "Rare") {
  for (var i = 0; i < breedable_dragons["Rare"].length; i++) {
      var opt = breedable_dragons["Rare"][i];
      var el = document.createElement("option");
      el.textContent = opt;
      el.value = opt;
      breed_target.appendChild(el);
  }
}
if (selected_type == "Epic") {
  for (var i = 0; i < breedable_dragons["Epic"].length; i++) {
      var opt = breedable_dragons["Epic"][i];
      var el = document.createElement("option");
      el.textContent = opt;
      el.value = opt;
      breed_target.appendChild(el);
  }
}
if (selected_type == "Legendary") {
  for (var i = 0; i < breedable_dragons["Legendary"].length; i++) {
      var opt = breedable_dragons["Legendary"][i];
      var el = document.createElement("option");
      el.textContent = opt;
      el.value = opt;
      breed_target.appendChild(el);
  }
}
}
function clearOptions(selectElement) {
  var i, L = selectElement.options.length - 1;
  for(i = L; i >= 1; i--) {
      selectElement.remove(i);
  }
}
function calc_dragons() {
  selected_type = document.getElementById("breed_target_type").value;
  target_dragon = document.getElementById("breed_target").value;
  document.getElementById("target_banner").innerHTML = "<div class='shadowbutton'><a href='https://dragontamer.miraheze.org/wiki/Dragon:" + target_dragon + "'><img style='width: 300px;max-width: 100%;' src=" + dragons[dragon_index[target_dragon]]['img'] + "></a></div><br>" + elements_img[dragons[dragon_index[target_dragon]]['element1']] + elements_img[dragons[dragon_index[target_dragon]]['element2']];
clear_table();
// compute uncommon logic
if (selected_type == "Uncommon"){
    var element1 = dragons[dragon_index[target_dragon]]['element1'];
    var element2 = dragons[dragon_index[target_dragon]]['element2'];
    var  result_dragon1 = [];
    var  result_dragon2 = [];
    Object.keys(common_dragons).forEach(function(key) {
    if (common_dragons[key][0] == element1){
    result_dragon1.push(key);
    }
    if (common_dragons[key][0] == element2){
    result_dragon2.push(key);
    }});
    print_row(result_dragon1, result_dragon2,common_dragons,"Consider that only the combination with the highest probability is listed.");
}
// compute rare logic
if (selected_type == "Rare"){
    var element1 = dragons[dragon_index[target_dragon]]['element1'];
    var element2 = dragons[dragon_index[target_dragon]]['element2'];
    var  result_dragon1 = [];
    var  result_dragon2 = [];
    Object.keys(uncommon_dragons).forEach(function(key) {
    if ((uncommon_dragons[key][0] == element1) || (uncommon_dragons[key][1] == element1)){
    result_dragon1.push(key);
    }
    if ((uncommon_dragons[key][0] == element2) || (uncommon_dragons[key][1] == element2)){
    result_dragon2.push(key);
    }});
    print_row(result_dragon1, result_dragon2,uncommon_dragons,"Consider that only the combinations with the highest probability are listed.");
}
// compute epic logic
if (selected_type == "Epic"){
}
  // compute legendary logic
if (selected_type == "Legendary"){
  var unshared_element = dragons[dragon_index[target_dragon]]['element1'];
  if ((unshared_element == "Light") || (unshared_element == "Dark") || (unshared_element == "Chaos")) {
    unshared_element = dragons[dragon_index[target_dragon]]['element2'];
  }
  if (dragons[dragon_index[target_dragon]]['element2'] == "Light") {
    set = ["Electric", "Earth", "Metal"];
  }
  if (dragons[dragon_index[target_dragon]]['element2'] == "Dark") {
    set = ["Nature", "Fire", "Water", "Psychic"];
  }
  // remove unshared_element from set
  set = remove_item(set, unshared_element);
  for (var i = 0; i < set.length; i++) {
    var shared_element = set[i];
    var epic_shared_element = [];
    // filter for shared element
   
    Object.keys(epic_dragons).forEach(function(key) {
    //console.log(key, epic_dragons[key]);
      if ((epic_dragons[key][0] == shared_element) || (epic_dragons[key][1] == shared_element)){
        epic_shared_element.push(key);
      }
});
    var epic_mains = [];
    var remove_list = [];
    epic_shared_element.forEach(function (item, index) {
      //console.log(item, index);
      //console.log("comparing " + dragon + " & " + unshared_element);
      if ((epic_dragons[item][0] == unshared_element) || (epic_dragons[item][1] == unshared_element)) {
        epic_mains.push(item);
        remove_list.push(item);
      }
    });
remove_list.forEach(function (item, index) {
      epic_shared_element = remove_item(epic_shared_element, item);
    });
    print_row(epic_mains, epic_shared_element,epic_dragons,"");
  }
}
}
/* *********************************************************************************************************************************/
/* call specific functions when the page loads */
/* call specific functions when the page loads */
// old browsers or already loaded
// old browsers or already loaded
if (document.readyState!="loading") AfterPageLoad();
if (document.readyState != "loading") AfterPageLoad();
// modern browsers
// modern browsers
else if (document.addEventListener) document.addEventListener("DOMContentLoaded", AfterPageLoad);
else if (document.addEventListener) document.addEventListener("DOMContentLoaded", AfterPageLoad);
/* FUNCTIONS **********************************************************************************************************************/
/* FUNCTIONS **********************************************************************************************************************/
 
function AfterPageLoad() {
 
StartTabs();
 
}
 
/* Tabs */
function AfterPageLoad()
function StartTabs() {
{
buttons = document.getElementsByClassName("tab-button");
StartTabs();
contents = document.getElementsByClassName("tab-content");
MakeLinksMyLanguage();
if (buttons.length > 0) {
clickfunction(buttons[0]);
for (var i = 0; i < buttons.length; i++) {
//console.log("Added Event Listener!");
buttons[i].addEventListener("click", clickfunction);
}
}
}
}


 
function clickfunction(thing) {
 
if (thing.id == null) {
 
thing = this;
 
}
/* Add "Special:MyLanguage/" into the links to automatically redirect to proper language pages */
//buttons
 
for (var i = 0; i < buttons.length; i++) {
function MakeLinksMyLanguage() {
if (buttons[i].id == thing.id) {
allLinks = document.querySelectorAll("a");
buttons[i].classList.remove("tab-disabled");
var linkRegex = new RegExp('\/wiki\/(?!Special:)(?!'+currentPageName+'#)', 'g');
buttons[i].classList.add("tab-active");
 
} else {
for (var i = 0; i < allLinks.length; i++)
buttons[i].classList.remove("tab-active");
{
buttons[i].classList.add("tab-disabled");
// omit links to "Special:" and to the current page.
}
allLinks[i].href = allLinks[i].href.replace(linkRegex, '/wiki/Special:MyLanguage/');
}
}
//contents
for (var i = 0; i < contents.length; i++) {
if (contents[i].id == thing.id) {
contents[i].style.display = 'block'
} else {
contents[i].style.display = 'none'
}
}
}
}


mw.hook('wikipage.content').add(function ($content) {
  var $wrap = $content.find('.tabberresize').first();
  if (!$wrap.length) return;


  function recalc() {
    if (window.matchMedia('(max-width: 850px)').matches) {
      // Mobile: leave sizing to CSS
      $wrap.css({ width: '100%', float: 'none', display: 'block' });
      return;
    }


    // 1) Find widest tab label (measured as rendered <a.tabber__tab>)
    var maxTab = 0;
    $wrap.find('.tabber__tab').each(function () {
      // offsetWidth includes padding/border; safe for equal sizing
      maxTab = Math.max(maxTab, Math.ceil(this.offsetWidth));
    });
    if (!maxTab) maxTab = 90; // fallback


    // Expose to CSS grid
    $wrap.get(0).style.setProperty('--tab-w', maxTab + 'px');


    // 2) Measure the infobox table width (first one in the active panel)
    var $table = $wrap.find('table.ItemInfobox, table.wikitable.ItemInfobox').first();
    var tableW = $table.length ? Math.ceil($table.outerWidth()) : 0;


/* Tabs */
    // 3) Set wrapper width to max(table width, 3 × tab width)
 
    var target = Math.max(tableW, maxTab * 3 + 12);
function StartTabs()
    $wrap.css({
{
      width: target + 'px !important' ,
buttons = document.getElementsByClassName("tab-button");
      float: 'right',
contents = document.getElementsByClassName("tab-content");
      display: 'inline-block',
 
      maxWidth: '100%'
if (buttons.length > 0){
     });
clickfunction(buttons[0]);
 
for (var i = 0; i < buttons.length; i++)
  {
    //console.log("Added Event Listener!");
     buttons[i].addEventListener("click", clickfunction);
   }
   }
}
}


 
   // Initial + on resize (debounced enough for this use)
 
   recalc();
function clickfunction(thing) {
  $(window).on('resize', recalc);
  if (thing.id == null)
});
    {
      thing = this;
    }
 
   //buttons
for (var i = 0; i < buttons.length; i++)
   {
    if (buttons[i].id == thing.id)
      {
        buttons[i].classList.remove("tab-disabled");
        buttons[i].classList.add("tab-active");
      }
    else
      {
        buttons[i].classList.remove("tab-active");
        buttons[i].classList.add("tab-disabled");
      }
  }
  //contents
  for (var i = 0; i < contents.length; i++)
  {
    if (contents[i].id == thing.id)
      {
        contents[i].style.display = 'block'
      }
    else
      {
        contents[i].style.display = 'none'
      }
  }
}

Latest revision as of 02:58, 8 November 2025

/* Any JavaScript here will be loaded for all users on every page load. */
/* VARIABLES ***********************************************************************************************************************/
var currentPageUrl = window.location.href;
var currentPageEditUrl = mw.util.getUrl(null, {
	action: 'edit'
});
var currentPageName = mw.util.getUrl(null, null).replace('/wiki/', '');
var currentPageNamespaceID = mw.config.get('wgNamespaceNumber');
//variables needed after page load
var buttons, contents, allLinks;
//variables needed for the infobutton
var infobutton, infopanel;
/* *********************************************************************************************************************************/
// Matomo
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/*
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
  var u="https://matomo.tools.walkscape.app/";
  _paq.push(['setTrackerUrl', u+'matomo.php']);
  _paq.push(['setSiteId', '5']);
  var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
  g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
*/
/* sticky edit button */
// display the button only if #mw-content is present, if we are not in the edit mode, and if we're not in the Special: or Community: namespace
/*
if (document.body.contains(document.getElementById("mw-content")) && !currentPageUrl.includes("action=") && currentPageNamespaceID != -1 && currentPageNamespaceID != 3004)  {
document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<a href="https://wiki-temp.walkscape.app/' + currentPageEditUrl + '"><div id="custom-editbutton"><svg width="40" height="40" viewBox="-12 -10 50 50"><path d="M 20 2 L 26 8 L 8 26 L 2 26 L 2 20 Z M 16 6 L 22 12"></path></svg></div></a>');
}
*/
///////////////////////////////////////// ADDING THE INFO BUTTON
var infotitle = currentPageName + '/doc';
// add the info button ONLY when we use the edit mode now
if (document.body.contains(document.getElementById("mw-content")) && (currentPageUrl.includes("action=edit") || currentPageUrl.includes("action=submit"))) {
	mw.loader.using('mediawiki.api', function() {
		var api = new mw.Api();
		api.get({
			action: "query",
			titles: [infotitle],
		}).then(function(ret) {
			$.each(ret.query.pages, function() {
				if (this.missing !== "") {
					pageExists();
				}
			});
		});

		function pageExists() {
			api.get({
				action: 'parse',
				page: infotitle,
				contentmodel: 'wikitext'
			}).done(function(data) {
				InsertInfoPanel(data.parse.text['*']);
			});
		}
	});
}

function InsertInfoPanel(text) {
	//check which namespace we're in and adapt the text to it
	var infopanelTitle = 'Page';
	if (currentPageNamespaceID == 10) { //Template
		infopanelTitle = 'Template';
	} else if (currentPageNamespaceID == 828) { //Module
		infopanelTitle = 'Module';
	}
	// insert the panel and button
	document.getElementById("mw-content").insertAdjacentHTML('afterbegin', '<div id="custom-infobutton"></div><div id="custom-infopanel" style="display: none"><div id="custom-infopanel-title">' + infopanelTitle + ' Info</div><div id="custom-infopanel-content">' + text + '</div></div>');
	//set up containers
	infopanel = document.getElementById("custom-infopanel");
	infobutton = document.getElementById("custom-infobutton");
	//add an event listener to the button
	infobutton.addEventListener("click", infobuttonClicked);
}

function infobuttonClicked() {
	if (infopanel.style.display == 'none') {
		infopanel.style.display = 'block';
	} else {
		infopanel.style.display = 'none';
	}
}
/* rename the "DISCUSSION" talk page button to "DOCUMENTATION" */
//if there is such a button and we're in the Template: namespace
if (document.body.contains(document.getElementById("ca-talk")) && currentPageNamespaceID == 10) {
	document.getElementById("ca-talk").innerHTML = '<svg class="cosmos-button-icon" width="28" height="28" viewBox="-2 -2 20 20"><path d="M 4 2 Q 4 0 6 0 L 14 0 Q 16 0 16 2 L 8 2 Q 8 0 6 0 Q 4 0 4 2 L 4 12 Q 4 14 2 14 Q 0 14 0 12 L 2 12 L 0 12 Q 0 14 2 14 L 12 14 Q 14 14 14 12 L 14 4"></path></svg><span class="cosmos-button-text">Documentation</span>';
}
/* call specific functions when the page loads */
// old browsers or already loaded
if (document.readyState != "loading") AfterPageLoad();
// modern browsers
else if (document.addEventListener) document.addEventListener("DOMContentLoaded", AfterPageLoad);
/* FUNCTIONS **********************************************************************************************************************/
function AfterPageLoad() {
	StartTabs();
}
/* Tabs */
function StartTabs() {
	buttons = document.getElementsByClassName("tab-button");
	contents = document.getElementsByClassName("tab-content");
	if (buttons.length > 0) {
		clickfunction(buttons[0]);
		for (var i = 0; i < buttons.length; i++) {
			//console.log("Added Event Listener!");
			buttons[i].addEventListener("click", clickfunction);
		}
	}
}

function clickfunction(thing) {
	if (thing.id == null) {
		thing = this;
	}
	//buttons
	for (var i = 0; i < buttons.length; i++) {
		if (buttons[i].id == thing.id) {
			buttons[i].classList.remove("tab-disabled");
			buttons[i].classList.add("tab-active");
		} else {
			buttons[i].classList.remove("tab-active");
			buttons[i].classList.add("tab-disabled");
		}
	}
	//contents
	for (var i = 0; i < contents.length; i++) {
		if (contents[i].id == thing.id) {
			contents[i].style.display = 'block'
		} else {
			contents[i].style.display = 'none'
		}
	}
}

mw.hook('wikipage.content').add(function ($content) {
  var $wrap = $content.find('.tabberresize').first();
  if (!$wrap.length) return;

  function recalc() {
    if (window.matchMedia('(max-width: 850px)').matches) {
      // Mobile: leave sizing to CSS
      $wrap.css({ width: '100%', float: 'none', display: 'block' });
      return;
    }

    // 1) Find widest tab label (measured as rendered <a.tabber__tab>)
    var maxTab = 0;
    $wrap.find('.tabber__tab').each(function () {
      // offsetWidth includes padding/border; safe for equal sizing
      maxTab = Math.max(maxTab, Math.ceil(this.offsetWidth));
    });
    if (!maxTab) maxTab = 90; // fallback

    // Expose to CSS grid
    $wrap.get(0).style.setProperty('--tab-w', maxTab + 'px');

    // 2) Measure the infobox table width (first one in the active panel)
    var $table = $wrap.find('table.ItemInfobox, table.wikitable.ItemInfobox').first();
    var tableW = $table.length ? Math.ceil($table.outerWidth()) : 0;

    // 3) Set wrapper width to max(table width, 3 × tab width)
    var target = Math.max(tableW, maxTab * 3 + 12);
    $wrap.css({
      width: target + 'px !important' ,
      float: 'right',
      display: 'inline-block',
      maxWidth: '100%'
    });
  }

  // Initial + on resize (debounced enough for this use)
  recalc();
  $(window).on('resize', recalc);
});