MediaWiki:Common.js: Difference between revisions

From Elwiki
No edit summary
No edit summary
(403 intermediate revisions by 4 users not shown)
Line 1: Line 1:
var usesClass = (function () {
function matchHeaderText() {
    var reCache = {};
    $('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 () {
    return function (element, className) {
        var rgb = $(this).css('backgroundColor');
        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
        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)') {
addOnloadHook(function(){
            $(this).addClass('force-white');
     $('div.tabdiv > ul > li').click(function(){
        } else if (!$(this).is('tr')) {
         $(this).parent().parent().children('div').hide();
            $(this).addClass('force-black');
         $((this).children('a:first').attr('href')).show();
        }
         $(this).parent().children('li').removeClass('active').addClass('inactive');
    });
         $(this).removeClass('inactive').addClass('active');
    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 + '">');
     });
     });
     $('div.tabdiv > ul > li > a:first').each(function(){
 
         $(this).attr('href', '');
     $('.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 = [],
addOnloadHook(function($) {
            i = 0,
return function() {
            n = arr.length;
$('.tabdiv > div').hide();
        while (i < n) {
$('.tabdiv').each(function() {
            chunks.push(arr.slice(i, i += len));
$(this).find('> ul li').addClass('inactive');
        }
$(this).find('> ul li:first').removeClass('inactive');
        return chunks;
$(this).find('> ul li:first').addClass('active');
    }
$(this).find('> div:first').show();
 
});
 
$('.tabdiv > ul li').each(function() {
    $('.related-skills:not(.skill-table)').each(function () {
var a = $(this).find('a:first');
        var cell = $(this).find('[data-type="table-cell"]');
var target = a.attr('href');
        var limit = $(this).attr('data-limit');
$(a).attr('href', ''); // Opera hates real hrefs
        if (limit !== undefined && limit != '' && !isNaN(limit)) limit = parseInt(limit) * 2;
$(this).click(function() {
        else limit = 8;
$(this).parent().find('> li').removeClass('active');
         var attempt = false;
$(this).parent().find('> li').addClass('inactive');
         $(this).find('[data-type="table-row"]').each(function () {
$(this).addClass('active');
             if ($(this).find('[data-type="table-cell"]').length > limit) attempt = true;
$(this).removeClass('inactive');
$(this).parent().parent().find('> div').hide();
                                $(target).show();
return false;
});
});
}
}(jQuery));
/****************************** Slides JS ******************************/
addOnloadHook(function(){
    $('.slidediv').each(function(){
         var width = $(this).width();
         $(this).find('.prev').click(function(){
             $(this).find('div').scrollLeft -= width + 'px';
        });
        $(this).fine('.next').click(function(){
            $(this).fine('div').scrollLeft += width + 'px';
         });
         });
        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);
/** Collapsible tables code *****************************************************
 
*  Description: Allows tables to be collapsed, showing only the header
    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');
*  Author: User:Bigfoot Lover @ BionicWiki.com
 
*  Added: 24 September 2007
    if ($('.boss-timer').length) {
*/
        mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:BossTimer.js&action=raw&ctype=text/javascript');
/* Add a hook to make buttons, where need be, on every pageload */
addOnloadHook( createTableButtons );
/* Define global variables:
* autoShrink is the number of tables that must exist on the page for usage of "class=collapsible autocollapse"
* minimizeSymbol can be either a symbol such as a minus sign or a word such as hide or disappear
* maximizeSymbol can be either a symbol such as a plus sign or a word such as show or appear */
var autoShrink = 2;
var minimizeSymbol = "hide";
var maximizeSymbol = "show";
/* Define functions that do-the-work */
/* Function toggleTableView() toggles a specified table's view from minimized to maximized, or vice versa */
function toggleTableView( tableIndex, tableShrink )
{
    var Table = document.getElementById( "collapsibleTable" + tableIndex );
    /* If there is no collapsible tables on the page, no need to do any shrinking */
    if (!Table) {
      return false;
     }
     }
 
     var Button = document.getElementById( "collapseButton" + tableIndex );
     if ($('.server-time-wrap').length) {
    /* If no collapsible buttons, no need to do any shrinking */
        mw.loader.load('https://elwiki.net/wiki/index.php?title=MediaWiki:ServerTime.js&action=raw&ctype=text/javascript');
    if (!Button ) {
        return false;
     }
     }
 
     /* Grab the rows of the specified table */
     $('.dungeon-map .region-map').prepend('<div class="tabber-list-toggle"><img src="https://elwiki.net/wiki/images/7/7c/UI_-_Toggle.png"/></div>');
    var Rows = Table.getElementsByTagName( "tr" );  
 
     $('.tabber-list-toggle img').click(function () {
     /* Do the hiding/unhiding */
         $('.tabber-list-toggle img').toggleClass('back');
    if ( Button.firstChild.data == minimizeSymbol || tableShrink == 1 ) {
        $('.dungeon-map .tabber-vertical .tabber-ul').toggleClass('list-hidden');
         /* if the button is set to minimize its contents,
    });
        * then loop through the rows and mark them hidden */
 
        var count = 1;
    $('body').append('<div id="dark-mode-switch"></div>')
        while (Rows.length > count) {
 
          if (Rows[count].parentNode.parentNode.id == ("collapsibleTable" + tableIndex))
    $('#dark-mode-switch').click(function () {
          {
        setCookie('not-new', true);
             Rows[count].style.display = "none";
        if ($('body').hasClass('dark-mode')) {
          }
             setCookie('elwiki-dark-mode', 'false');
          count++;
        } else {
            setCookie('elwiki-dark-mode', 'true');
         }
         }
         /* After marking, change the table to show the maximize symbol */
         setTimeout(function () {
        Button.firstChild.data = maximizeSymbol;
            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 {
     } else {
         /* if the button is set to maximize its contents,
         document.addEventListener("DOMContentLoaded", fn);
        * then loop through the rows and mark them visible */   
        var count = 1;
        while (Rows.length > count) {
          if(Rows[count].parentNode.parentNode.id == ("collapsibleTable" + tableIndex))
          {
              Rows[count].style.display = Rows[0].style.display;
          }
          count++;
        }
        /* After marking, change the table to show the minimize symbol */
        Button.firstChild.data = minimizeSymbol;
     }
     }
}
}
 
/* Funtion createTableButtons() creates the plus or minus symbol and alignment text
function setCookie(name, value, days) {
* to be applied on collapsible tables */
     var expires = "";
function createTableButtons()
     if (days) {
{
         var date = new Date();
    /* Define local variables */
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
     var tableIndex = 0;
        expires = "; expires=" + date.toUTCString();
    var NavBoxes = new Object();
    var Tables = document.getElementsByTagName( "table" );
     /* Use two count variables to handle cases where continue is used */
    var loopcount = 0;
    var count = 0;   
    while (Tables.length > loopcount) {
         /* For all collapsible table on the page, this code goes through
        * them and makes a button for each one individually */
        count = loopcount;
        loopcount++;
        if ( usesClass( Tables[count], "collapsible" ) ) {
            /* Proceed only if a header row and header exist */
            var HeaderRow = Tables[count].getElementsByTagName( "tr" )[0];
            if (!HeaderRow) continue;
            var Header = HeaderRow.getElementsByTagName( "th" )[0];
            if (!Header) continue;
            /* Log where you are in the looping */
            NavBoxes[ tableIndex ] = Tables[count];
            /* Set the identifier of the table being edited in this iteration */
            Tables[count].setAttribute( "id", "collapsibleTable" + tableIndex );
            /* Create the button assuming it is a minimized table
            * to do the initial creation. */
            var Button = document.createElement( "span" );
            var ButtonLink = document.createElement( "a" );
            var ButtonText = document.createTextNode( maximizeSymbol );
            /* Define where the button floats and its font and size.
            * The width should be set to the max character count of
            * the mininizeSymbol and maximizeSymbol + 2. ie. min and max
            * are 3 letters each + 2 = 5em */
            Button.style.styleFloat = "right";
            Button.style.cssFloat = "right";
            Button.style.fontWeight = "normal";
            Button.style.textAlign = "right";
            Button.style.width = "5em";
Button.style.color = "white";
            /* Set the link color and identifier */
            ButtonLink.style.color = Header.style.color;
ButtonLink.style.color = "white";
            ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
            /* Set the destination of the button */
            ButtonLink.setAttribute( "href", "javascript:toggleTableView(" + tableIndex + ");" );
            ButtonLink.appendChild( ButtonText );
            Button.appendChild( document.createTextNode( "[" ) );
            Button.appendChild( ButtonLink );
            Button.appendChild( document.createTextNode( "]" ) );
            /* Load the next header and table for the next iteration */
            Header.insertBefore( Button, Header.childNodes[0] );
            tableIndex++;
        }
     }
     }
     document.cookie = name + "=" + (value || "") + expires + "; path=/";
     /* Earlier in this function, assumed all tables are minimized to do the initial creation.
}
    * Now, loop again through the tables and set those to maximized that need setting,
function getCookie(name) {
    * and set the rows of those that don't as hidden */
    var nameEQ = name + "=";
     loopcount = 0;
    var ca = document.cookie.split(';');
    while (tableIndex > loopcount) {
     for (var i = 0; i < ca.length; i++) {
         /* If autocollapse or collapse is not invalid, maximize; otherwise, minimize */
         var c = ca[i];
         if (((autoShrink > tableIndex) && usesClass( NavBoxes[loopcount], "autocollapse" )) || !usesClass( NavBoxes[loopcount], "collapsed" ) ) {
         while (c.charAt(0) == ' ') c = c.substring(1, c.length);
          toggleTableView( loopcount, 0 );
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        else {
          toggleTableView( loopcount, 1 );
        }
        loopcount++;
     }
     }
    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);
        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) {
      this[this.length]=arguments[0]; return(this.length);}}
        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 = "",
if(color=="transparent"){
        edges = false,
    cn=cn+"x";
        eclass = "",
    ecolor=bk;
        b = false,
    bk="transparent";
        t = false;
     }
 
else if(opt && opt.indexOf("border")>=0){
    if (color == "transparent") {
    var optar=opt.split(" ");
        cn = cn + "x";
    for(i=0;i<optar.length;i++)
        ecolor = bk;
        if(optar[i].indexOf("#")>=0) ecolor=optar[i];
        bk = "transparent";
    if(ecolor=="") ecolor="#666";
     } else if (opt && opt.indexOf("border") >= 0) {
    cn+="e";
        var optar = opt.split(" ");
    edges=true;
        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);
     }
     }
else if(opt && opt.indexOf("smooth")>=0){
    if (opt && opt.indexOf("small") >= 0) cn += "s";
     cn+="a";
    prefixt = cn;
     ecolor=Mix(bk,color);
    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(opt && opt.indexOf("small")>=0) cn+="s";
    if (wich.indexOf("bottom") >= 0) b = true;
prefixt=cn;
    else if (wich.indexOf("bl") >= 0) {
prefixb=cn;
        b = "true";
if(wich.indexOf("all")>=0){t=true;b=true}
        if (wich.indexOf("br") < 0) prefixb += "l";
else if(wich.indexOf("top")>=0) t="true";
    } else if (wich.indexOf("br") >= 0) {
else if(wich.indexOf("tl")>=0){
        b = "true";
    t="true";
        prefixb += "r";
    if(wich.indexOf("tr")<0) prefixt+="l";
     }
     }
else if(wich.indexOf("tr")>=0){
     var v = getElementsBySelector(selector);
     t="true";
    var l = v.length;
    prefixt+="r";
    for (i = 0; i < l; i++) {
    }
        if (edges) AddBorder(v[i], ecolor);
if(wich.indexOf("bottom")>=0) b=true;
        if (t) AddTop(v[i], bk, color, ecolor, prefixt);
else if(wich.indexOf("bl")>=0){
        if (b) AddBottom(v[i], bk, color, ecolor, prefixb);
    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){
function AddBorder(el, bc) {
var i;
    var i;
if(!el.passed){
    if (!el.passed) {
    if(el.childNodes.length==1 && el.childNodes[0].nodeType==3){
        if (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3) {
        var t=el.firstChild.nodeValue;
            var t = el.firstChild.nodeValue;
        el.removeChild(el.lastChild);
            el.removeChild(el.lastChild);
        var d=CreateEl("span");
            var d = CreateEl("span");
        d.style.display="block";
            d.style.display = "block";
        d.appendChild(document.createTextNode(t));
            d.appendChild(document.createTextNode(t));
        el.appendChild(d);
            el.appendChild(d);
         }
         }
    for(i=0;i<el.childNodes.length;i++){
        for (i = 0; i < el.childNodes.length; i++) {
        if(el.childNodes[i].nodeType==1){
            if (el.childNodes[i].nodeType == 1) {
            el.childNodes[i].style.borderLeft="1px solid "+bc;
                el.childNodes[i].style.borderLeft = "1px solid " + bc;
            el.childNodes[i].style.borderRight="1px solid "+bc;
                el.childNodes[i].style.borderRight = "1px solid " + bc;
             }
             }
         }
         }
     }
     }
el.passed=true;
    el.passed = true;
}
}
 
function AddTop(el,bk,color,bc,cn){
function AddTop(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(bc) d.className="artop";
    if (cn.indexOf("s") >= 0) lim = 2;
else d.className="rtop";
    if (bc) d.className = "artop";
d.style.backgroundColor=bk;
    else d.className = "rtop";
for(i=1;i<=lim;i++){
    d.style.backgroundColor = bk;
    var x=CreateEl("b");
    for (i = 1; i <= lim; i++) {
    x.className=cn + i;
        var x = CreateEl("b");
    x.style.backgroundColor=color;
        x.className = cn + i;
    if(bc) x.style.borderColor=bc;
        x.style.backgroundColor = color;
    d.appendChild(x);
        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(bc) d.className="artop";
    if (cn.indexOf("s") >= 0) lim = 2;
else d.className="rtop";
    if (bc) d.className = "artop";
d.style.backgroundColor=bk;
    else d.className = "rtop";
for(i=lim;i>0;i--){
    d.style.backgroundColor = bk;
    var x=CreateEl("b");
    for (i = lim; i > 0; i--) {
    x.className=cn + i;
        var x = CreateEl("b");
    x.style.backgroundColor=color;
        x.className = cn + i;
    if(bc) x.style.borderColor=bc;
        x.style.backgroundColor = color;
    d.appendChild(x);
        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 = "",
if(selector.indexOf(" ")>0){ //descendant selector like "tag#id tag"
        tag = selector,
    s=selector.split(" ");
        f, s = [],
    var fs=s[0].split("#");
        objlist = [];
    if(fs.length==1) return(objlist);
 
    f=document.getElementById(fs[1]);
    if (selector.indexOf(" ") > 0) { //descendant selector like "tag#id tag"
    if(f) return(f.getElementsByTagName(s[1]));
        s = selector.split(" ");
    return(objlist);
        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("#");
        s = selector.split("#");
    tag=s[0];
        tag = s[0];
    selid=s[1];
        selid = s[1];
     }
     }
if(selid!=""){
    if (selid != "") {
    f=document.getElementById(selid);
        f = document.getElementById(selid);
    if(f) objlist.push(f);
        if (f) objlist.push(f);
    return(objlist);
        return (objlist);
     }
     }
if(selector.indexOf(".")>0){ //class selector like "tag.class"
    if (selector.indexOf(".") > 0) { //class selector like "tag.class"
    s=selector.split(".");
        s = selector.split(".");
    tag=s[0];
        tag = s[0];
    selclass=s[1];
        selclass = s[1];
     }
     }
var v=document.getElementsByTagName(tag); // tag selector like "tag"
    var v = document.getElementsByTagName(tag); // tag selector like "tag"
if(selclass=="")
    if (selclass == "")
    return(v);
        return (v);
for(i=0;i<v.length;i++){
    for (i = 0; i < v.length; i++) {
    if(v[i].className.indexOf(selclass)>=0){
        if (v[i].className.indexOf(selclass) >= 0) {
        objlist.push(v[i]);
            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);
        x = parseInt(c1.substr(1 + step1 * i, step1), 16);
    if(step1==1) x=16*x+x;
        if (step1 == 1) x = 16 * x + x;
    y=parseInt(c2.substr(1+step2*i,step2),16);
        y = parseInt(c2.substr(1 + step2 * i, step2), 16);
    if(step2==1) y=16*y+y;
        if (step2 == 1) y = 16 * y + y;
    r[i]=Math.floor((x*50+y*50)/100);
        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())
    if (!NiftyCheck())
    return;
        return;
  Rounded("div#nifty","all","#FFF","#D4DDFF","smooth");
    Rounded("div#nifty", "all", "#FFF", "#D4DDFF", "smooth");
}
}
 
addOnloadHook( doRoundEdges );
/* IE Correction Code **********************************************
/* IE Correction Code **********************************************
  * Description: This is code to fix known bugs in IE
  * Description: This is code to fix known bugs in IE
Line 412: Line 465:
  * Modified 18 October 2007 to fix ie imagemap bug
  * Modified 18 October 2007 to fix ie imagemap bug
  */
  */
 
// setStyleById: given an element id, style property and  
// setStyleById: given an element id, style property and  
// value, apply the style.
// value, apply the style.
Line 421: Line 474:
//
//
function setStyleById(i, p, v) {
function setStyleById(i, p, v) {
var n = document.getElementById(i);
    var n = document.getElementById(i);
n.style[p] = v;
    n.style[p] = v;
}
}
 
/* Add a hook to perform code on every pageload */
function performIE() {
addOnloadHook( 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 437: 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 449: 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);
    randDARTNumber = Math.round(Math.random() * 1000000000000);
}
}
genSetRandDARTNumber();
genSetRandDARTNumber();
 
/* </pre> */
// 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) {
    China Area has GFW abandon foreign sites (include Google).
         // Calling the original implementation first
    As a result, the Google Adsense will not been displayed when China visitor browse it.
         originalSaveComplete.call(this, data);
    However, keeping trying to connect Google server takes lots of time, which result in EXTREME much time in loading the Ads.
        // Custom things
    So I use this hack hope to improve speed for Chinese visitors.
        doRoundEdges();
****/
        enhancements();
/* if(navigator && navigator.language.search("zh") !== -1)
     }
    $(".adsbygoogle").css({"display": "none"});
*/
/****************************** Common Gradient ******************************/
$(function(){
     var rainbowList = $('table > tbody > tr[style*=rainbow]');
    var headerList = $('table > tbody > tr').has('> th').filter(function(){
        return $(this).children('td').length == 0;
     }).filter(function(){
        return $.inArray(this, rainbowList) == -1;
    }).children('th');
    console.log(headerList);
    headerList.each(function(){
         var bgc = $(this).css('background-color');
         $(this).css('background-image', 'linear-gradient(to bottom, #eee, ' + bgc + ')');
    });
    rainbowList.css({
        'backgroundColor': 'orange'
    });
    $('h1 > span:not(.mw-editsection)').addClass('textfloat');
     $('h2 > span:not(.mw-editsection)').addClass('textfloat');
});
});

Revision as of 17: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();
    }
});