MediaWiki:Common.js: Difference between revisions
From Elwiki
mNo edit summary |
No edit summary |
||
(486 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
function matchHeaderText() { | |||
$('table[cellpadding="5"][border="1"][style] tr[style]:not(.dungeon-page-fields tr), table[cellpadding="5"][border="1"][style] tr[class]:not(.dungeon-page-fields tr), .instance-page .segment-header, .auto-header-color .segment-header, .alt-langs th, .updates-table th, table[cellpadding="5"][border="1"][class*="colortable-"] th, .auto-text-color .segment-header').each(function () { | |||
$(' | var rgb = $(this).css('backgroundColor'); | ||
$(' | var colors = rgb.match(/\d+/g); | ||
var o = Math.round(((parseInt(colors[0]) * 299) + (parseInt(colors[1]) * 587) + (parseInt(colors[2]) * 114)) / 1000); | |||
if ($(this).parents('.section-characters').length) return; | |||
if (o < 155 && rgb != 'rgba(0, 0, 0, 0)') { | |||
$(this).addClass('force-white'); | |||
} else if (!$(this).is('tr')) { | |||
$(this).addClass('force-black'); | |||
} | |||
}); | |||
setTimeout(function () { | |||
$('.segment-partial .mw-collapsible-text, .segment .mw-collapsible-text').each(function () { | |||
var matched_white = $(this).parents('.segment').find('.segment-header:eq(0)').hasClass('force-white'); | |||
var matched_black = $(this).parents('.segment').find('.segment-header:eq(0)').hasClass('force-black'); | |||
if (matched_white) { | |||
$(this).addClass('force-white') | |||
} else if (matched_black) { | |||
$(this).addClass('force-black') | |||
} | |||
}); | |||
}, 50); | |||
} | |||
var loadJS = function (url, implementationCode, location) { | |||
var scriptTag = document.createElement('script'); | |||
scriptTag.src = url; | |||
scriptTag.onload = implementationCode; | |||
scriptTag.onreadystatechange = implementationCode; | |||
location.appendChild(scriptTag); | |||
}; | |||
var popperLoaded = function () { | |||
var tippyLoaded = function () { | |||
tippy('.tippy-btn', { | |||
interactive: true, | |||
allowHTML: true, | |||
appendTo: document.body, | |||
delay: 200 | |||
}); | |||
document.body.classList.add('tippy-loaded'); | |||
}; | |||
loadJS('https://elwiki.net/wiki/index.php?title=MediaWiki:Tippy.js&action=raw&ctype=text/javascript', tippyLoaded, document.body); | |||
} | |||
function enhancements() { | |||
$('.infobox .tabs-tabbox').before('<div class="tabs-background"></div>'); | |||
$('dfn').parents('p').remove(); | |||
$('.sidebar-chunk #nav > ul > li:has(".mw-selflink")').find('> a').addClass('mw-has-selflink'); | |||
if (window.location.pathname == '/w/Special:RecentChanges') $('#mw-site-navigation .sidebar-chunk a[href="/w/Special:RecentChanges"]').addClass('mw-has-selflink'); | |||
$('#p-banner').html("<span><span class='main-accent'>El</span>wiki</span>"); | |||
$('.region-map img[alt="About this image"]').attr('src', 'https://elwiki.net/wiki/images/1/1f/UI_-_Help.png').show(); | |||
$('table[cellpadding="5"][border="1"][style] tr[style*="rgb(68, 68, 68)"] th').css('border-color', 'black'); | |||
matchHeaderText(); | |||
$('.skill-nav-skill:has(.mw-selflink)').addClass('self-skill'); | |||
$("#ca-ve-edit").clone().attr('id', 'ca-ve-edit-clone').prependTo($('#p-views .mw-portlet-body ul')); | |||
$("#ca-ve-edit").hide(); | |||
var rows_to_highlight = [ | |||
'Normal', | |||
'[Enhanced]', | |||
'PvE', | |||
'PvP' | |||
] | |||
rows_to_highlight.forEach(function (rowContent) { | |||
var rows = $('[class^="colortable-"] td b:contains("' + rowContent + '")'); | |||
rows.each(function () { | |||
const textContent = $(this).parents('td')[0].textContent.trim(); | |||
if (textContent == rowContent) $(this).parent().addClass('tone-4'); | |||
}) | |||
}) | |||
loadJS('https://unpkg.com/@popperjs/core@2.11.6/dist/umd/popper.min.js', popperLoaded, document.body); | |||
/ | $('.related-skills td[width="150"]').each(function () { | ||
if (!$(this).find('.skill-wrap').length) { | |||
$(this).wrapInner('<div class="skill-wrap-text"></div>'); | |||
$(this).wrapInner('<div class="skill-wrap"></div>'); | |||
} | |||
}); | |||
$('.related-skills:not(.no-div):not(.skill-table)').each(function () { | |||
var limit = $(this).attr('width'); | |||
var limitString = ''; | |||
if (limit !== undefined) limitString = " data-limit='" + limit + "'"; | |||
$(this).replaceWith($(this).html() | |||
.replace(/<tbody/gi, "<div class='" + $(this).attr('class') + "'" + limitString) | |||
.replace(/<tr/gi, "<div data-type='table-row'") | |||
.replace(/<\/tr>/gi, "</div>") | |||
.replace(/<td/gi, "<div data-type='table-cell'") | |||
.replace(/<\/td>/gi, "</div>") | |||
.replace(/<th/gi, "<div data-type='table-head'") | |||
.replace(/<\/th>/gi, "</div>") | |||
.replace(/<\/tbody/gi, "<\/div") | |||
); | |||
}); | |||
var | $('.skill-wrap:not(.no-div .skill-wrap, .skill-table .skill-wrap)').each(function () { | ||
var link = $(this).find('> .skill-wrap-text a:not(.image)').attr('href'); | |||
$(this).wrap('<a href="' + link + '">'); | |||
}); | |||
$('.related-skills.no-div td[width="150"]').click(function () { | |||
$(this).find('.skill-wrap > .skill-wrap-text a:not(.image)').get(0).click(); | |||
}); | |||
var | function chunk(arr, len) { | ||
var chunks = [], | |||
i = 0, | |||
return | n = arr.length; | ||
while (i < n) { | |||
chunks.push(arr.slice(i, i += len)); | |||
} | |||
return chunks; | |||
} | } | ||
$('.related-skills:not(.skill-table)').each(function () { | |||
var cell = $(this).find('[data-type="table-cell"]'); | |||
var limit = $(this).attr('data-limit'); | |||
if (limit !== undefined && limit != '' && !isNaN(limit)) limit = parseInt(limit) * 2; | |||
var | else limit = 8; | ||
var attempt = false; | |||
$(this).find('[data-type="table-row"]').each(function () { | |||
if ($(this).find('[data-type="table-cell"]').length > limit) attempt = true; | |||
}); | |||
if (attempt) { | |||
var overflow_elems = chunk(cell, limit); | |||
$(this).empty(); | |||
for (var i = 0; i < overflow_elems.length; i++) { | |||
$(this).append('<div data-type="table-row">'); | |||
$(this).find('[data-type="table-row"]:last').append(overflow_elems[i]); | |||
} | |||
} | } | ||
}); | |||
} | $('.related-skills:not(.no-div):not(.skill-table)').addClass('shown'); | ||
$('.boss-timer-section .tabber-tab').click(function (e) { | |||
if (e.screenX && e.screenX != 0 && e.screenY && e.screenY != 0) { | |||
setCookie('current-server-timer', $(this).text()); | |||
} | } | ||
}); | |||
} | |||
$('.henir-stage .inner').click(function (e) { | |||
e.preventDefault(); | |||
function | var link = $(this).find('a:not(.tippy-content a)').attr('href'); | ||
{ | //window.location.href = window.location.origin + link; | ||
window.open(window.location.origin + link) | |||
}); | |||
setTimeout(function () { $('.current-info .segment-contents > .mw-collapsible-content').addClass('shown') }, 100); | |||
if (typeof character_banner_exists !== undefined) mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:Character-Banner.js&action=raw&ctype=text/javascript'); | |||
if ($('.boss-timer').length) { | |||
mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:BossTimer.js&action=raw&ctype=text/javascript'); | |||
} | |||
if ($('.server-time-wrap').length) { | |||
mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:ServerTime.js&action=raw&ctype=text/javascript'); | |||
} | |||
$('.dungeon-map .region-map').prepend('<div class="tabber-list-toggle"><img src="https://elwiki.net/wiki/images/7/7c/UI_-_Toggle.png"/></div>'); | |||
$('.tabber-list-toggle img').click(function () { | |||
$('.tabber-list-toggle img').toggleClass('back'); | |||
$('.dungeon-map .tabber-vertical .tabber-ul').toggleClass('list-hidden'); | |||
}); | |||
$('body').append('<div id="dark-mode-switch"></div>') | |||
$('#dark-mode-switch').click(function () { | |||
setCookie('not-new', true); | |||
if ($('body').hasClass('dark-mode')) { | |||
setCookie('elwiki-dark-mode', 'false'); | |||
} else { | |||
setCookie('elwiki-dark-mode', 'true'); | |||
} | |||
setTimeout(function () { | |||
window.location.reload(1); | |||
}, 50) | |||
}); | |||
if (getCookie('elwiki-dark-mode') == 'true') $('body').addClass('dark-mode'); | |||
if (getCookie('not-new') == null) $('#dark-mode-switch').addClass('new'); | |||
// This is pretty cringe, tabs don't load sometimes | |||
if (!$('.tabber-new.loaded').length) mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:Gadget-Tabs.js&action=raw&ctype=text/javascript') | |||
} | |||
$(function () { | |||
doRoundEdges(); | |||
performIE(); | |||
enhancements(); | |||
// Fix the preview button losing custom script output | |||
// This is a complete ChatGPT moment, I couldn't be arsed to debug on my own | |||
$(document).on('DOMNodeInserted', function (event) { | |||
var element = event.target; | |||
if ($(element).hasClass('previewnote')) { | |||
var previewLoaded = $(element).find('.previewloading').length == 0; | |||
if (previewLoaded && !$(element).hasClass('custom-preview-run')) { | |||
$(element).addClass('custom-preview-run'); | |||
enhancements(); | |||
} | |||
} | } | ||
}); | |||
}); | |||
if ($('.skin-minerva').length) { | |||
var time_loading = 0; | |||
var chkReadyState = setInterval(function () { | |||
if (document.readyState == "complete" || time_loading > 3000) { | |||
// clear the interval | |||
clearInterval(chkReadyState); | |||
$('#loading-screen').css({ transition: '300ms', pointerEvents: 'none', opacity: 0 }); | |||
} | |||
time_loading += 100; | |||
}, 100); | |||
} | |||
function docReady(fn) { | |||
// see if DOM is already available | |||
if (document.readyState === "complete" || document.readyState === "interactive") { | |||
// call on next available tick | |||
setTimeout(fn, 1); | |||
} else { | |||
document.addEventListener("DOMContentLoaded", fn); | |||
} | } | ||
} | |||
function setCookie(name, value, days) { | |||
var expires = ""; | |||
if (days) { | |||
var date = new Date(); | |||
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); | |||
expires = "; expires=" + date.toUTCString(); | |||
} | |||
document.cookie = name + "=" + (value || "") + expires + "; path=/"; | |||
} | |||
function getCookie(name) { | |||
var nameEQ = name + "="; | |||
var ca = document.cookie.split(';'); | |||
for (var i = 0; i < ca.length; i++) { | |||
var c = ca[i]; | |||
while (c.charAt(0) == ' ') c = c.substring(1, c.length); | |||
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); | |||
} | } | ||
return null; | |||
} | } | ||
var usesClass = (function () { | |||
var reCache = {}; | |||
return function (element, className) { | |||
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); | |||
}; | |||
})(); | |||
/* JavaScript for rounding borders | /* JavaScript for rounding borders | ||
Source: http://webdesign.html.it/articoli/leggi/528/more-nifty-corners */ | Source: http://webdesign.html.it/articoli/leggi/528/more-nifty-corners */ | ||
function NiftyCheck(){ | function NiftyCheck() { | ||
if(!document.getElementById || !document.createElement) | if (!document.getElementById || !document.createElement) | ||
return (false); | |||
isXHTML=/html\:/.test(document.getElementsByTagName('body')[0].nodeName); | isXHTML = /html\:/.test(document.getElementsByTagName('body')[0].nodeName); | ||
if(Array.prototype.push==null){Array.prototype.push=function(){ | if (Array.prototype.push == null) { | ||
Array.prototype.push = function () { | |||
return(true); | this[this.length] = arguments[0]; | ||
return (this.length); | |||
} | |||
} | |||
return (true); | |||
} | } | ||
function Rounded(selector,wich,bk,color,opt){ | function Rounded(selector, wich, bk, color, opt) { | ||
var i,prefixt,prefixb,cn="r",ecolor="",edges=false,eclass="",b=false,t=false; | var i, prefixt, prefixb, cn = "r", | ||
ecolor = "", | |||
edges = false, | |||
eclass = "", | |||
b = false, | |||
t = false; | |||
if(color=="transparent"){ | if (color == "transparent") { | ||
cn = cn + "x"; | |||
ecolor = bk; | |||
bk = "transparent"; | |||
} | } else if (opt && opt.indexOf("border") >= 0) { | ||
else if(opt && opt.indexOf("border")>=0){ | var optar = opt.split(" "); | ||
for (i = 0; i < optar.length; i++) | |||
if (optar[i].indexOf("#") >= 0) ecolor = optar[i]; | |||
if (ecolor == "") ecolor = "#666"; | |||
cn += "e"; | |||
edges = true; | |||
} else if (opt && opt.indexOf("smooth") >= 0) { | |||
} | cn += "a"; | ||
else if(opt && opt.indexOf("smooth")>=0){ | ecolor = Mix(bk, color); | ||
} | } | ||
if(opt && opt.indexOf("small")>=0) cn+="s"; | if (opt && opt.indexOf("small") >= 0) cn += "s"; | ||
prefixt=cn; | prefixt = cn; | ||
prefixb=cn; | prefixb = cn; | ||
if(wich.indexOf("all")>=0){t=true;b=true} | if (wich.indexOf("all") >= 0) { | ||
else if(wich.indexOf("top")>=0) t="true"; | t = true; | ||
else if(wich.indexOf("tl")>=0){ | b = true | ||
} else if (wich.indexOf("top") >= 0) t = "true"; | |||
else if (wich.indexOf("tl") >= 0) { | |||
t = "true"; | |||
if (wich.indexOf("tr") < 0) prefixt += "l"; | |||
} else if (wich.indexOf("tr") >= 0) { | |||
t = "true"; | |||
prefixt += "r"; | |||
} | } | ||
else if(wich.indexOf(" | if (wich.indexOf("bottom") >= 0) b = true; | ||
else if (wich.indexOf("bl") >= 0) { | |||
b = "true"; | |||
if (wich.indexOf("br") < 0) prefixb += "l"; | |||
} else if (wich.indexOf("br") >= 0) { | |||
b = "true"; | |||
prefixb += "r"; | |||
} | } | ||
var v = getElementsBySelector(selector); | |||
var l = v.length; | |||
for (i = 0; i < l; i++) { | |||
if (edges) AddBorder(v[i], ecolor); | |||
if (t) AddTop(v[i], bk, color, ecolor, prefixt); | |||
if (b) AddBottom(v[i], bk, color, ecolor, prefixb); | |||
var v=getElementsBySelector(selector); | |||
var l=v.length; | |||
for(i=0;i<l;i++){ | |||
} | } | ||
} | } | ||
function AddBorder(el,bc){ | function AddBorder(el, bc) { | ||
var i; | var i; | ||
if(!el.passed){ | if (!el.passed) { | ||
if (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3) { | |||
var t = el.firstChild.nodeValue; | |||
el.removeChild(el.lastChild); | |||
var d = CreateEl("span"); | |||
d.style.display = "block"; | |||
d.appendChild(document.createTextNode(t)); | |||
el.appendChild(d); | |||
} | } | ||
for (i = 0; i < el.childNodes.length; i++) { | |||
if (el.childNodes[i].nodeType == 1) { | |||
el.childNodes[i].style.borderLeft = "1px solid " + bc; | |||
el.childNodes[i].style.borderRight = "1px solid " + bc; | |||
} | } | ||
} | } | ||
} | } | ||
el.passed=true; | el.passed = true; | ||
} | } | ||
if(cn.indexOf("s")>=0) lim=2; | function AddTop(el, bk, color, bc, cn) { | ||
if(bc) d.className="artop"; | var i, lim = 4, | ||
else d.className="rtop"; | d = CreateEl("b"); | ||
d.style.backgroundColor=bk; | |||
for(i=1;i<=lim;i++){ | if (cn.indexOf("s") >= 0) lim = 2; | ||
if (bc) d.className = "artop"; | |||
else d.className = "rtop"; | |||
d.style.backgroundColor = bk; | |||
for (i = 1; i <= lim; i++) { | |||
var x = CreateEl("b"); | |||
x.className = cn + i; | |||
x.style.backgroundColor = color; | |||
if (bc) x.style.borderColor = bc; | |||
d.appendChild(x); | |||
} | } | ||
el.style.paddingTop=0; | el.style.paddingTop = 0; | ||
el.insertBefore(d,el.firstChild); | el.insertBefore(d, el.firstChild); | ||
} | } | ||
function AddBottom(el,bk,color,bc,cn){ | function AddBottom(el, bk, color, bc, cn) { | ||
var i,lim=4,d=CreateEl("b"); | var i, lim = 4, | ||
d = CreateEl("b"); | |||
if(cn.indexOf("s")>=0) lim=2; | if (cn.indexOf("s") >= 0) lim = 2; | ||
if(bc) d.className="artop"; | if (bc) d.className = "artop"; | ||
else d.className="rtop"; | else d.className = "rtop"; | ||
d.style.backgroundColor=bk; | d.style.backgroundColor = bk; | ||
for(i=lim;i>0;i--){ | for (i = lim; i > 0; i--) { | ||
var x = CreateEl("b"); | |||
x.className = cn + i; | |||
x.style.backgroundColor = color; | |||
if (bc) x.style.borderColor = bc; | |||
d.appendChild(x); | |||
} | } | ||
el.style.paddingBottom=0; | el.style.paddingBottom = 0; | ||
el.appendChild(d); | el.appendChild(d); | ||
} | } | ||
function CreateEl(x){ | function CreateEl(x) { | ||
if(isXHTML) return(document.createElementNS('http://www.w3.org/1999/xhtml',x)); | if (isXHTML) return (document.createElementNS('http://www.w3.org/1999/xhtml', x)); | ||
else return(document.createElement(x)); | else return (document.createElement(x)); | ||
} | } | ||
function getElementsBySelector(selector){ | function getElementsBySelector(selector) { | ||
var i,selid="",selclass="",tag=selector,f,s=[],objlist=[]; | var i, selid = "", | ||
selclass = "", | |||
tag = selector, | |||
f, s = [], | |||
objlist = []; | |||
if(selector.indexOf(" ")>0){ | if (selector.indexOf(" ") > 0) { //descendant selector like "tag#id tag" | ||
s = selector.split(" "); | |||
var fs = s[0].split("#"); | |||
if (fs.length == 1) return (objlist); | |||
f = document.getElementById(fs[1]); | |||
if (f) return (f.getElementsByTagName(s[1])); | |||
return (objlist); | |||
} | } | ||
if(selector.indexOf("#")>0){ //id selector like "tag#id" | if (selector.indexOf("#") > 0) { //id selector like "tag#id" | ||
s = selector.split("#"); | |||
tag = s[0]; | |||
selid = s[1]; | |||
} | } | ||
if(selid!=""){ | if (selid != "") { | ||
f = document.getElementById(selid); | |||
if (f) objlist.push(f); | |||
return (objlist); | |||
} | } | ||
if(selector.indexOf(".")>0){ | if (selector.indexOf(".") > 0) { //class selector like "tag.class" | ||
s = selector.split("."); | |||
tag = s[0]; | |||
selclass = s[1]; | |||
} | } | ||
var v=document.getElementsByTagName(tag); | var v = document.getElementsByTagName(tag); // tag selector like "tag" | ||
if(selclass=="") | if (selclass == "") | ||
return (v); | |||
for(i=0;i<v.length;i++){ | for (i = 0; i < v.length; i++) { | ||
if (v[i].className.indexOf(selclass) >= 0) { | |||
objlist.push(v[i]); | |||
} | } | ||
} | } | ||
return(objlist); | return (objlist); | ||
} | } | ||
function Mix(c1,c2){ | function Mix(c1, c2) { | ||
var i,step1,step2,x,y,r=new Array(3); | var i, step1, step2, x, y, r = new Array(3); | ||
if(c1.length==4)step1=1; | if (c1.length == 4) step1 = 1; | ||
else step1=2; | else step1 = 2; | ||
if(c2.length==4) step2=1; | if (c2.length == 4) step2 = 1; | ||
else step2=2; | else step2 = 2; | ||
for(i=0;i<3;i++){ | for (i = 0; i < 3; i++) { | ||
x = parseInt(c1.substr(1 + step1 * i, step1), 16); | |||
if (step1 == 1) x = 16 * x + x; | |||
y = parseInt(c2.substr(1 + step2 * i, step2), 16); | |||
if (step2 == 1) y = 16 * y + y; | |||
r[i] = Math.floor((x * 50 + y * 50) / 100); | |||
} | } | ||
return("#"+r[0].toString(16)+r[1].toString(16)+r[2].toString(16)); | return ("#" + r[0].toString(16) + r[1].toString(16) + r[2].toString(16)); | ||
} | } | ||
function doRoundEdges(){ | function doRoundEdges() { | ||
if (!NiftyCheck()) | |||
return; | |||
Rounded("div#nifty", "all", "#FFF", "#D4DDFF", "smooth"); | |||
} | } | ||
/* IE Correction Code ********************************************** | /* IE Correction Code ********************************************** | ||
Line 407: | Line 474: | ||
// | // | ||
function setStyleById(i, p, v) { | function setStyleById(i, p, v) { | ||
var n = document.getElementById(i); | |||
n.style[p] = v; | |||
} | } | ||
function performIE() { | |||
if (-1 != navigator.userAgent.indexOf("MSIE")) { | |||
function performIE() | |||
{ | |||
if ( -1 != navigator.userAgent.indexOf ("MSIE") ) { | |||
/* perform Microsoft Internet Explorer-specific subs */ | /* perform Microsoft Internet Explorer-specific subs */ | ||
var Divs = document.getElementsByTagName( "div" ); | var Divs = document.getElementsByTagName("div"); | ||
var divCnt = 0; | var divCnt = 0; | ||
var divID = ""; | var divID = ""; | ||
Line 423: | Line 487: | ||
var CurrDiv = Divs[0]; | var CurrDiv = Divs[0]; | ||
var s = ""; | var s = ""; | ||
while (Divs.length > divCnt) { | while (Divs.length > divCnt) { | ||
s = eval("CurrDiv.style.ietop"); | s = eval("CurrDiv.style.ietop"); | ||
if ((s != "") && (s != null)) { | if ((s != "") && (s != null)) { | ||
divID = "mapDiv" + divCnt; | divID = "mapDiv" + divCnt; | ||
CurrDiv.setAttribute( "id", divID ); | CurrDiv.setAttribute("id", divID); | ||
setStyleById(divID, "top", CurrDiv.style.ietop); | setStyleById(divID, "top", CurrDiv.style.ietop); | ||
} | } | ||
Line 435: | Line 499: | ||
} | } | ||
} | } | ||
} | } | ||
//Fix height issue with ads | |||
var HeightFix = $("#mw-content-block"); | |||
//$("#mw-related-navigation").css("min-height", HeightFix.height()); | |||
$("#mw-related-navigation").attr("style", "min-height: " + HeightFix.height() + "px !important"); | |||
//Get Ad Dart Number | //Get Ad Dart Number | ||
var randDARTNumber=0; | var randDARTNumber = 0; | ||
function genSetRandDARTNumber() | |||
{ | function genSetRandDARTNumber() { | ||
randDARTNumber = Math.round(Math.random() * 1000000000000); | |||
} | } | ||
genSetRandDARTNumber(); | genSetRandDARTNumber(); | ||
/ | // Fix scripts literally disappearing when clicking "save changes" in VE | ||
mw.hook('ve.activationComplete').add(function () { | |||
var originalSaveComplete = ve.init.mw.ArticleTarget.prototype.saveComplete; | |||
ve.init.mw.ArticleTarget.prototype.saveComplete = function (data) { | |||
// Calling the original implementation first | |||
originalSaveComplete.call(this, data); | |||
// Custom things | |||
doRoundEdges(); | |||
enhancements(); | |||
} | |||
}); |
Revision as of 16:47, 13 March 2024
function matchHeaderText() {
$('table[cellpadding="5"][border="1"][style] tr[style]:not(.dungeon-page-fields tr), table[cellpadding="5"][border="1"][style] tr[class]:not(.dungeon-page-fields tr), .instance-page .segment-header, .auto-header-color .segment-header, .alt-langs th, .updates-table th, table[cellpadding="5"][border="1"][class*="colortable-"] th, .auto-text-color .segment-header').each(function () {
var rgb = $(this).css('backgroundColor');
var colors = rgb.match(/\d+/g);
var o = Math.round(((parseInt(colors[0]) * 299) + (parseInt(colors[1]) * 587) + (parseInt(colors[2]) * 114)) / 1000);
if ($(this).parents('.section-characters').length) return;
if (o < 155 && rgb != 'rgba(0, 0, 0, 0)') {
$(this).addClass('force-white');
} else if (!$(this).is('tr')) {
$(this).addClass('force-black');
}
});
setTimeout(function () {
$('.segment-partial .mw-collapsible-text, .segment .mw-collapsible-text').each(function () {
var matched_white = $(this).parents('.segment').find('.segment-header:eq(0)').hasClass('force-white');
var matched_black = $(this).parents('.segment').find('.segment-header:eq(0)').hasClass('force-black');
if (matched_white) {
$(this).addClass('force-white')
} else if (matched_black) {
$(this).addClass('force-black')
}
});
}, 50);
}
var loadJS = function (url, implementationCode, location) {
var scriptTag = document.createElement('script');
scriptTag.src = url;
scriptTag.onload = implementationCode;
scriptTag.onreadystatechange = implementationCode;
location.appendChild(scriptTag);
};
var popperLoaded = function () {
var tippyLoaded = function () {
tippy('.tippy-btn', {
interactive: true,
allowHTML: true,
appendTo: document.body,
delay: 200
});
document.body.classList.add('tippy-loaded');
};
loadJS('https://elwiki.net/wiki/index.php?title=MediaWiki:Tippy.js&action=raw&ctype=text/javascript', tippyLoaded, document.body);
}
function enhancements() {
$('.infobox .tabs-tabbox').before('<div class="tabs-background"></div>');
$('dfn').parents('p').remove();
$('.sidebar-chunk #nav > ul > li:has(".mw-selflink")').find('> a').addClass('mw-has-selflink');
if (window.location.pathname == '/w/Special:RecentChanges') $('#mw-site-navigation .sidebar-chunk a[href="/w/Special:RecentChanges"]').addClass('mw-has-selflink');
$('#p-banner').html("<span><span class='main-accent'>El</span>wiki</span>");
$('.region-map img[alt="About this image"]').attr('src', 'https://elwiki.net/wiki/images/1/1f/UI_-_Help.png').show();
$('table[cellpadding="5"][border="1"][style] tr[style*="rgb(68, 68, 68)"] th').css('border-color', 'black');
matchHeaderText();
$('.skill-nav-skill:has(.mw-selflink)').addClass('self-skill');
$("#ca-ve-edit").clone().attr('id', 'ca-ve-edit-clone').prependTo($('#p-views .mw-portlet-body ul'));
$("#ca-ve-edit").hide();
var rows_to_highlight = [
'Normal',
'[Enhanced]',
'PvE',
'PvP'
]
rows_to_highlight.forEach(function (rowContent) {
var rows = $('[class^="colortable-"] td b:contains("' + rowContent + '")');
rows.each(function () {
const textContent = $(this).parents('td')[0].textContent.trim();
if (textContent == rowContent) $(this).parent().addClass('tone-4');
})
})
loadJS('https://unpkg.com/@popperjs/core@2.11.6/dist/umd/popper.min.js', popperLoaded, document.body);
$('.related-skills td[width="150"]').each(function () {
if (!$(this).find('.skill-wrap').length) {
$(this).wrapInner('<div class="skill-wrap-text"></div>');
$(this).wrapInner('<div class="skill-wrap"></div>');
}
});
$('.related-skills:not(.no-div):not(.skill-table)').each(function () {
var limit = $(this).attr('width');
var limitString = '';
if (limit !== undefined) limitString = " data-limit='" + limit + "'";
$(this).replaceWith($(this).html()
.replace(/<tbody/gi, "<div class='" + $(this).attr('class') + "'" + limitString)
.replace(/<tr/gi, "<div data-type='table-row'")
.replace(/<\/tr>/gi, "</div>")
.replace(/<td/gi, "<div data-type='table-cell'")
.replace(/<\/td>/gi, "</div>")
.replace(/<th/gi, "<div data-type='table-head'")
.replace(/<\/th>/gi, "</div>")
.replace(/<\/tbody/gi, "<\/div")
);
});
$('.skill-wrap:not(.no-div .skill-wrap, .skill-table .skill-wrap)').each(function () {
var link = $(this).find('> .skill-wrap-text a:not(.image)').attr('href');
$(this).wrap('<a href="' + link + '">');
});
$('.related-skills.no-div td[width="150"]').click(function () {
$(this).find('.skill-wrap > .skill-wrap-text a:not(.image)').get(0).click();
});
function chunk(arr, len) {
var chunks = [],
i = 0,
n = arr.length;
while (i < n) {
chunks.push(arr.slice(i, i += len));
}
return chunks;
}
$('.related-skills:not(.skill-table)').each(function () {
var cell = $(this).find('[data-type="table-cell"]');
var limit = $(this).attr('data-limit');
if (limit !== undefined && limit != '' && !isNaN(limit)) limit = parseInt(limit) * 2;
else limit = 8;
var attempt = false;
$(this).find('[data-type="table-row"]').each(function () {
if ($(this).find('[data-type="table-cell"]').length > limit) attempt = true;
});
if (attempt) {
var overflow_elems = chunk(cell, limit);
$(this).empty();
for (var i = 0; i < overflow_elems.length; i++) {
$(this).append('<div data-type="table-row">');
$(this).find('[data-type="table-row"]:last').append(overflow_elems[i]);
}
}
});
$('.related-skills:not(.no-div):not(.skill-table)').addClass('shown');
$('.boss-timer-section .tabber-tab').click(function (e) {
if (e.screenX && e.screenX != 0 && e.screenY && e.screenY != 0) {
setCookie('current-server-timer', $(this).text());
}
});
$('.henir-stage .inner').click(function (e) {
e.preventDefault();
var link = $(this).find('a:not(.tippy-content a)').attr('href');
//window.location.href = window.location.origin + link;
window.open(window.location.origin + link)
});
setTimeout(function () { $('.current-info .segment-contents > .mw-collapsible-content').addClass('shown') }, 100);
if (typeof character_banner_exists !== undefined) mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:Character-Banner.js&action=raw&ctype=text/javascript');
if ($('.boss-timer').length) {
mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:BossTimer.js&action=raw&ctype=text/javascript');
}
if ($('.server-time-wrap').length) {
mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:ServerTime.js&action=raw&ctype=text/javascript');
}
$('.dungeon-map .region-map').prepend('<div class="tabber-list-toggle"><img src="https://elwiki.net/wiki/images/7/7c/UI_-_Toggle.png"/></div>');
$('.tabber-list-toggle img').click(function () {
$('.tabber-list-toggle img').toggleClass('back');
$('.dungeon-map .tabber-vertical .tabber-ul').toggleClass('list-hidden');
});
$('body').append('<div id="dark-mode-switch"></div>')
$('#dark-mode-switch').click(function () {
setCookie('not-new', true);
if ($('body').hasClass('dark-mode')) {
setCookie('elwiki-dark-mode', 'false');
} else {
setCookie('elwiki-dark-mode', 'true');
}
setTimeout(function () {
window.location.reload(1);
}, 50)
});
if (getCookie('elwiki-dark-mode') == 'true') $('body').addClass('dark-mode');
if (getCookie('not-new') == null) $('#dark-mode-switch').addClass('new');
// This is pretty cringe, tabs don't load sometimes
if (!$('.tabber-new.loaded').length) mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:Gadget-Tabs.js&action=raw&ctype=text/javascript')
}
$(function () {
doRoundEdges();
performIE();
enhancements();
// Fix the preview button losing custom script output
// This is a complete ChatGPT moment, I couldn't be arsed to debug on my own
$(document).on('DOMNodeInserted', function (event) {
var element = event.target;
if ($(element).hasClass('previewnote')) {
var previewLoaded = $(element).find('.previewloading').length == 0;
if (previewLoaded && !$(element).hasClass('custom-preview-run')) {
$(element).addClass('custom-preview-run');
enhancements();
}
}
});
});
if ($('.skin-minerva').length) {
var time_loading = 0;
var chkReadyState = setInterval(function () {
if (document.readyState == "complete" || time_loading > 3000) {
// clear the interval
clearInterval(chkReadyState);
$('#loading-screen').css({ transition: '300ms', pointerEvents: 'none', opacity: 0 });
}
time_loading += 100;
}, 100);
}
function docReady(fn) {
// see if DOM is already available
if (document.readyState === "complete" || document.readyState === "interactive") {
// call on next available tick
setTimeout(fn, 1);
} else {
document.addEventListener("DOMContentLoaded", fn);
}
}
function setCookie(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
var usesClass = (function () {
var reCache = {};
return function (element, className) {
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
};
})();
/* JavaScript for rounding borders
Source: http://webdesign.html.it/articoli/leggi/528/more-nifty-corners */
function NiftyCheck() {
if (!document.getElementById || !document.createElement)
return (false);
isXHTML = /html\:/.test(document.getElementsByTagName('body')[0].nodeName);
if (Array.prototype.push == null) {
Array.prototype.push = function () {
this[this.length] = arguments[0];
return (this.length);
}
}
return (true);
}
function Rounded(selector, wich, bk, color, opt) {
var i, prefixt, prefixb, cn = "r",
ecolor = "",
edges = false,
eclass = "",
b = false,
t = false;
if (color == "transparent") {
cn = cn + "x";
ecolor = bk;
bk = "transparent";
} else if (opt && opt.indexOf("border") >= 0) {
var optar = opt.split(" ");
for (i = 0; i < optar.length; i++)
if (optar[i].indexOf("#") >= 0) ecolor = optar[i];
if (ecolor == "") ecolor = "#666";
cn += "e";
edges = true;
} else if (opt && opt.indexOf("smooth") >= 0) {
cn += "a";
ecolor = Mix(bk, color);
}
if (opt && opt.indexOf("small") >= 0) cn += "s";
prefixt = cn;
prefixb = cn;
if (wich.indexOf("all") >= 0) {
t = true;
b = true
} else if (wich.indexOf("top") >= 0) t = "true";
else if (wich.indexOf("tl") >= 0) {
t = "true";
if (wich.indexOf("tr") < 0) prefixt += "l";
} else if (wich.indexOf("tr") >= 0) {
t = "true";
prefixt += "r";
}
if (wich.indexOf("bottom") >= 0) b = true;
else if (wich.indexOf("bl") >= 0) {
b = "true";
if (wich.indexOf("br") < 0) prefixb += "l";
} else if (wich.indexOf("br") >= 0) {
b = "true";
prefixb += "r";
}
var v = getElementsBySelector(selector);
var l = v.length;
for (i = 0; i < l; i++) {
if (edges) AddBorder(v[i], ecolor);
if (t) AddTop(v[i], bk, color, ecolor, prefixt);
if (b) AddBottom(v[i], bk, color, ecolor, prefixb);
}
}
function AddBorder(el, bc) {
var i;
if (!el.passed) {
if (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3) {
var t = el.firstChild.nodeValue;
el.removeChild(el.lastChild);
var d = CreateEl("span");
d.style.display = "block";
d.appendChild(document.createTextNode(t));
el.appendChild(d);
}
for (i = 0; i < el.childNodes.length; i++) {
if (el.childNodes[i].nodeType == 1) {
el.childNodes[i].style.borderLeft = "1px solid " + bc;
el.childNodes[i].style.borderRight = "1px solid " + bc;
}
}
}
el.passed = true;
}
function AddTop(el, bk, color, bc, cn) {
var i, lim = 4,
d = CreateEl("b");
if (cn.indexOf("s") >= 0) lim = 2;
if (bc) d.className = "artop";
else d.className = "rtop";
d.style.backgroundColor = bk;
for (i = 1; i <= lim; i++) {
var x = CreateEl("b");
x.className = cn + i;
x.style.backgroundColor = color;
if (bc) x.style.borderColor = bc;
d.appendChild(x);
}
el.style.paddingTop = 0;
el.insertBefore(d, el.firstChild);
}
function AddBottom(el, bk, color, bc, cn) {
var i, lim = 4,
d = CreateEl("b");
if (cn.indexOf("s") >= 0) lim = 2;
if (bc) d.className = "artop";
else d.className = "rtop";
d.style.backgroundColor = bk;
for (i = lim; i > 0; i--) {
var x = CreateEl("b");
x.className = cn + i;
x.style.backgroundColor = color;
if (bc) x.style.borderColor = bc;
d.appendChild(x);
}
el.style.paddingBottom = 0;
el.appendChild(d);
}
function CreateEl(x) {
if (isXHTML) return (document.createElementNS('http://www.w3.org/1999/xhtml', x));
else return (document.createElement(x));
}
function getElementsBySelector(selector) {
var i, selid = "",
selclass = "",
tag = selector,
f, s = [],
objlist = [];
if (selector.indexOf(" ") > 0) { //descendant selector like "tag#id tag"
s = selector.split(" ");
var fs = s[0].split("#");
if (fs.length == 1) return (objlist);
f = document.getElementById(fs[1]);
if (f) return (f.getElementsByTagName(s[1]));
return (objlist);
}
if (selector.indexOf("#") > 0) { //id selector like "tag#id"
s = selector.split("#");
tag = s[0];
selid = s[1];
}
if (selid != "") {
f = document.getElementById(selid);
if (f) objlist.push(f);
return (objlist);
}
if (selector.indexOf(".") > 0) { //class selector like "tag.class"
s = selector.split(".");
tag = s[0];
selclass = s[1];
}
var v = document.getElementsByTagName(tag); // tag selector like "tag"
if (selclass == "")
return (v);
for (i = 0; i < v.length; i++) {
if (v[i].className.indexOf(selclass) >= 0) {
objlist.push(v[i]);
}
}
return (objlist);
}
function Mix(c1, c2) {
var i, step1, step2, x, y, r = new Array(3);
if (c1.length == 4) step1 = 1;
else step1 = 2;
if (c2.length == 4) step2 = 1;
else step2 = 2;
for (i = 0; i < 3; i++) {
x = parseInt(c1.substr(1 + step1 * i, step1), 16);
if (step1 == 1) x = 16 * x + x;
y = parseInt(c2.substr(1 + step2 * i, step2), 16);
if (step2 == 1) y = 16 * y + y;
r[i] = Math.floor((x * 50 + y * 50) / 100);
}
return ("#" + r[0].toString(16) + r[1].toString(16) + r[2].toString(16));
}
function doRoundEdges() {
if (!NiftyCheck())
return;
Rounded("div#nifty", "all", "#FFF", "#D4DDFF", "smooth");
}
/* IE Correction Code **********************************************
* Description: This is code to fix known bugs in IE
* Detects if an IE browser and applies browser-specific code
* Author: User:Bigfoot Lover @ Bionic Wiki
* Added: 8 October 2007
* Modified 18 October 2007 to fix ie imagemap bug
*/
// setStyleById: given an element id, style property and
// value, apply the style.
// args:
// i - element id
// p - property
// v - value
//
function setStyleById(i, p, v) {
var n = document.getElementById(i);
n.style[p] = v;
}
function performIE() {
if (-1 != navigator.userAgent.indexOf("MSIE")) {
/* perform Microsoft Internet Explorer-specific subs */
var Divs = document.getElementsByTagName("div");
var divCnt = 0;
var divID = "";
if (Divs.length > 0) {
var CurrDiv = Divs[0];
var s = "";
while (Divs.length > divCnt) {
s = eval("CurrDiv.style.ietop");
if ((s != "") && (s != null)) {
divID = "mapDiv" + divCnt;
CurrDiv.setAttribute("id", divID);
setStyleById(divID, "top", CurrDiv.style.ietop);
}
divCnt++;
CurrDiv = Divs[divCnt];
}
}
}
}
//Fix height issue with ads
var HeightFix = $("#mw-content-block");
//$("#mw-related-navigation").css("min-height", HeightFix.height());
$("#mw-related-navigation").attr("style", "min-height: " + HeightFix.height() + "px !important");
//Get Ad Dart Number
var randDARTNumber = 0;
function genSetRandDARTNumber() {
randDARTNumber = Math.round(Math.random() * 1000000000000);
}
genSetRandDARTNumber();
// Fix scripts literally disappearing when clicking "save changes" in VE
mw.hook('ve.activationComplete').add(function () {
var originalSaveComplete = ve.init.mw.ArticleTarget.prototype.saveComplete;
ve.init.mw.ArticleTarget.prototype.saveComplete = function (data) {
// Calling the original implementation first
originalSaveComplete.call(this, data);
// Custom things
doRoundEdges();
enhancements();
}
});