MediaWiki:Common.js: Difference between revisions

From Elwiki
mNo edit summary
No edit summary
(349 intermediate revisions by 4 users not shown)
Line 1: Line 1:
var usesClass = (function() {
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 = {};
     var reCache = {};
     return function(element, className) {
     return function (element, className) {
         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
     };
     };
Line 14: Line 269:
     isXHTML = /html\:/.test(document.getElementsByTagName('body')[0].nodeName);
     isXHTML = /html\:/.test(document.getElementsByTagName('body')[0].nodeName);
     if (Array.prototype.push == null) {
     if (Array.prototype.push == null) {
         Array.prototype.push = function() {
         Array.prototype.push = function () {
             this[this.length] = arguments[0];
             this[this.length] = arguments[0];
             return (this.length);
             return (this.length);
Line 202: Line 457:
     Rounded("div#nifty", "all", "#FFF", "#D4DDFF", "smooth");
     Rounded("div#nifty", "all", "#FFF", "#D4DDFF", "smooth");
}
}
addOnloadHook(doRoundEdges);


/* IE Correction Code **********************************************
/* IE Correction Code **********************************************
Line 234: Line 477:
     n.style[p] = v;
     n.style[p] = v;
}
}
/* Add a hook to perform code on every pageload */
addOnloadHook(performIE);


function performIE() {
function performIE() {
Line 260: Line 500:
     }
     }
}
}
//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
Line 269: Line 514:
genSetRandDARTNumber();
genSetRandDARTNumber();


/* </pre> */
// Fix scripts literally disappearing when clicking "save changes" in VE
 
mw.hook('ve.activationComplete').add(function () {
/****************************** Common Gradient ******************************/
    var originalSaveComplete = ve.init.mw.ArticleTarget.prototype.saveComplete;
$(function(){
     ve.init.mw.ArticleTarget.prototype.saveComplete = function (data) {
    /* Deal with non-transparent headers */
        // Calling the original implementation first
    var grad_transparent = $(document.createElement('span')).css('background-color'); /* Transparent Calculated Color*/
        originalSaveComplete.call(this, data);
    $('tr:not(:has(td))').not('.rainbow').children('th').each(function(){
         // Custom things
        var grad_color = $(this).css('background-color') || $(this).parent().css('background-color');
         doRoundEdges();
        if(grad_transparent != grad_color){ /* If bgcolor is not transparent */
         enhancements();
            $(this).css('background-image', ['linear-gradient(to bottom', '#eee', grad_color + ')'].join(','));
     }
        }
    });
     /* Deal with rainbow rows */
/*    $('tr.rainbow').each(function(){
        var rb_totalWidth = parseInt($(this).outerWidth(true));
        var rb_cStart, rb_cEnd, rb_sumWidth = 0;
        $(this).children('td, th').each(function(){
            rb_cStart = ['hsl(' + parseFloat(rb_sumWidth / rb_totalWidth * 360).toString(), '100%', '75%)'].join(',');
            rb_sumWidth += $(this).outerWidth(true);
            rb_cEnd = ['hsl(' + parseFloat(rb_sumWidth / rb_totalWidth * 360).toString(), '100%', '75%)'].join(',');
            $(this).css({
                'background-image': ['linear-gradient(to right', rb_cStart, rb_cEnd + ')'].join(',')
            });
         });
    });*/
    /*
         $('table.odd-stripe > tbody > tr:has(td):').css('background-color', function(){
            return $(this).parent().parent().css('background-color');
         });
        $('table.odd-strip').css('background-color', 'transparent');
     */
});
});
/**** Persist Header H2 ****/

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();
    }
});