MediaWiki:Common.js: Difference between revisions

From Bulbanews, your community Pokémon newspaper.
Jump to navigationJump to search
mNo edit summary
No edit summary
 
(11 intermediate revisions by 4 users not shown)
Line 1: Line 1:
/* <pre> */
/* <pre> */
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */
/**** class CollapsibleTables.js
* (c) 2008 by Patrick Westerhoff [poke]
*
* This class allows to make tables collapsible and adds a show/hide button to
* affected tables. Tables which class attribute contains 'collapsible' or
* 'expandable' are affected by this class and can be collapsed; the latter
* automatically hides the content of all sections.
* Header rows are used to divide the table into sections which can be collapsed
* separately. By default the first row of the table is interpreted as a header
* row, however this can be overwritten by adding 'collapsible' to the class
* attribute of header rows. You can also hide a section individually by default
* when in 'collapsible' mode by using 'expandable' as the row's class name
* instead.
*/
function CollapsibleTables ()
{
    var classCollapsible = 'collapsible';
    var classExpandable  = 'expandable';
    var linkTextShow    = '[show]';
    var linkTextHide    = '[hide]';
    var reCollapsible    = new RegExp( '(?:\\s|^)' + classCollapsible + '(?:\\s|$)' );
    var reExpandable    = new RegExp( '(?:\\s|^)' + classExpandable  + '(?:\\s|$)' );
    var sections        = new Array();
    // link element
    var linkElement              = document.createElement( 'a' );
    linkElement.style.fontSize    = '85%';
    linkElement.style.fontWeight  = 'normal';
    linkElement.style.width      = '3em';
    linkElement.style.cssFloat    = 'right';
    linkElement.style.styleFloat  = 'right';
    linkElement.style.textAlign  = 'center';
    linkElement.style.marginLeft  = '1em';
    linkElement.style.padding    = '0px 3px';
    linkElement.href              = 'javascript:void(0);';
    initialize();
    /** private void initialize () :: initializes CollapsibleTables class **/
    function initialize ()
    {
        if ( mw.config.get("wgIsArticle") == false && window.location.href.indexOf( 'action=submit' ) < 0 )
            return;
        var docContent    = document.getElementById( 'bodyContent' ) || document.getElementById( 'article' ) || document.getElementById( 'mw_contentholder' );
        var tables        = docContent.getElementsByTagName( 'table' );
        var sectionId    = -1;
        var defaultStatus;
        for ( var i = 0, n = tables.length; i < n; i++ )
        {
            if ( reCollapsible.test( tables[i].className ) )
                defaultStatus = true;
            else if ( reExpandable.test( tables[i].className ) )
                defaultStatus = false;
            else
                continue;
            var tableRows    = tables[i].rows;
            var sectionFound = false;
            var status      = false;
            for ( var j = 0, m = tableRows.length; j < m; j++ )
            {
                if ( reCollapsible.test( tableRows[j].className ) )
                    status = true;
                else if ( reExpandable.test( tableRows[j].className ) )
                    status = false;
                else
                {
                    if ( sectionFound )
                    {
                        sections[ sectionId ].content.push( tableRows[j] );
                        tableRows[j].style.display = sections[ sectionId ].status ? '' : 'none';
                    }
                    continue;
                }
                var section    = new Object();
                section.header  = tableRows[j];
                section.content = new Array();
                section.status  = defaultStatus ? status : false;
                sections[ ++sectionId ] = section;
                sectionFound            = true;
                initHeaderRow( tableRows[j], sectionId, section.status );
            }
            if ( sectionFound == false )
            {
                var section      = new Object();
                section.header    = tableRows[0];
                section.content  = new Array();
                section.status    = defaultStatus;
                for ( var j = 1; j < tableRows.length; j++ )
                {
                    section.content.push( tableRows[j] );
                    tableRows[j].style.display = section.status ? '' : 'none';
                }
                sections[ ++sectionId ] = section;
                initHeaderRow( tableRows[0], sectionId, defaultStatus );
            }
        }
    }
    /** private void initHeaderRow ( headerRow, sectionId, sectionStatus ) :: adds show/hide button **/
    function initHeaderRow ( headerRow, sectionId, sectionStatus )
    {
        var lastCell, link;
        headerRow.id = 'collapsible-section_' + sectionId;
        lastCell    = headerRow.cells[ headerRow.cells.length - 1 ];
        link        = linkElement.cloneNode( false );
        link.onclick = toggleSection;
        link.appendChild( document.createTextNode( sectionStatus ? linkTextHide : linkTextShow ) );
        lastCell.insertBefore( link, lastCell.firstChild );
    }
    /** private void toggleSection () :: onclick event handler **/
    function toggleSection ()
    {
        var trHead  = this.parentNode.parentNode;
        var section = sections[ trHead.id.substr( 20 ) ];
        var content = section.content;
        var display = section.status ? 'none' : '';
        for ( var i = 0, n = content.length; i < n; i++ )
            content[i].style.display = display;
        section.status      = !section.status;
        this.firstChild.data = section.status ? linkTextHide : linkTextShow;
    }
}
$(document).ready(function() { CollapsibleTables(); } );


function formatDate(t)
function formatDate(t)
{
{
var month = new Array();
    var month = new Array();
month[0] = 'January';
    month[0] = 'January';
month[1] = 'February';
    month[1] = 'February';
month[2] = 'March';
    month[2] = 'March';
month[3] = 'April';
    month[3] = 'April';
month[4] = 'May';
    month[4] = 'May';
month[5] = 'June';
    month[5] = 'June';
month[6] = 'July';
    month[6] = 'July';
month[7] = 'August';
    month[7] = 'August';
month[8] = 'September';
    month[8] = 'September';
month[9] = 'October';
    month[9] = 'October';
month[10] = 'November';
    month[10] = 'November';
month[11] = 'December';
    month[11] = 'December';
 
y = t.getUTCFullYear();
    y = t.getUTCFullYear();
M = t.getUTCMonth();
    M = t.getUTCMonth();
D = t.getUTCDate();
    D = t.getUTCDate();
h = t.getUTCHours();
    h = t.getUTCHours();
m = t.getUTCMinutes();
    m = t.getUTCMinutes();
s = t.getUTCSeconds();
    s = t.getUTCSeconds();
 
if (h > 0 || m > 0 || s > 0)
    if (h > 0 || m > 0 || s > 0)
{
    {
hms = '';
        hms = '';
 
if (s > 10)
        if (s > 10)
hms = ':' + s;
            hms = ':' + s;
else if (s > 0)
        else if (s > 0)
hms = ':0' + s;
            hms = ':0' + s;
 
if (m > 10)
        if (m > 10)
hms = ':' + m + hms;
            hms = ':' + m + hms;
else if (m > 0)
        else if (m > 0)
hms = ':0' + m + hms;
            hms = ':0' + m + hms;
 
if (h > 12)
        if (h > 12)
hms = (h - 12) + hms + ' PM';
            hms = (h - 12) + hms + ' PM';
else if (h > 0)
        else if (h > 0)
hms = h + hms + ' AM';
            hms = h + hms + ' AM';
else
        else
hms = '12' + hms + ' AM';
            hms = '12' + hms + ' AM';
 
return hms + ', ' + month[M] + ' ' + D + ', ' + y;
        return hms + ', ' + month[M] + ' ' + D + ', ' + y;
} else {
    } else {
return month[M] + ' ' + D + ', ' + y;
        return month[M] + ' ' + D + ', ' + y;
}
    }
}
}


function formatTime(h, m, s)
function formatTime(h, m, s)
{
{
var o = '';
    var o = '';
 
if (h != 1)
    if (h != 1)
{
    {
o = h + ' hours ';
        o = h + ' hours ';
} else {
    } else {
o = '1 hour ';
        o = '1 hour ';
}
    }
 
if (m != 1)
    if (m != 1)
{
    {
o += m + ' minutes ';
        o += m + ' minutes ';
} else {
    } else {
o += '1 minute ';
        o += '1 minute ';
}
    }
 
if (s != 1)
    if (s != 1)
{
    {
o += s + ' seconds';
        o += s + ' seconds';
} else {
    } else {
o += '1 second';
        o += '1 second';
}
    }
 
return o;
    return o;
}
}


function updateClocks()
function updateClocks()
{
{
var t = new Date();
    var t = new Date();


setTimeout(updateClocks, 1000);
    setTimeout(updateClocks, 1000);
D = t.getUTCDate();
M = t.getUTCMonth();
y = t.getUTCFullYear();
h = t.getUTCHours();
m = t.getUTCMinutes();
s = t.getUTCSeconds();


t = Date.UTC(y, M, D, h, m, s);
    D = t.getUTCDate();
    M = t.getUTCMonth();
    y = t.getUTCFullYear();
    h = t.getUTCHours();
    m = t.getUTCMinutes();
    s = t.getUTCSeconds();


t = (T - t) / 1000;
    t = Date.UTC(y, M, D, h, m, s);
if (t < 0 && t > -86400 && (h > 0 || m > 0 || s > 0))
{
document.getElementById('countdown-big').innerHTML = 'Today';
document.getElementById('countdown-small').innerHTML = '';
document.getElementById('countdown-target').innerHTML = 'is ' + formatDate(new Date(T + tzOffset)) + ' ' + tz;
return;
} else if (t < 0) {
document.getElementById('countdown-big').innerHTML = 'Past';
document.getElementById('countdown-target').innerHTML = formatDate(new Date(T + tzOffset)) + ' ' + tz;
return;
}
D = Math.floor(t / 86400.0);
h = Math.floor(t % 86400.0 / 3600.0);
m = Math.floor(t % 3600.0 / 60.0);
s = Math.floor(t % 60.0)


if (D == 1)
    t = (T - t) / 1000;
{
 
document.getElementById('countdown-big').innerHTML = '1 day';
    if (t < 0 && t > -86400 && (h > 0 || m > 0 || s > 0))
} else if (D == 0) {
    {
document.getElementById('countdown-big').innerHTML = '';
        document.getElementById('countdown-big').innerHTML = 'Today';
} else {
        document.getElementById('countdown-small').innerHTML = '';
document.getElementById('countdown-big').innerHTML = D + ' days';
        document.getElementById('countdown-target').innerHTML = 'is ' + formatDate(new Date(T + tzOffset)) + ' ' + tz;
}
 
        return;
document.getElementById('countdown-small').innerHTML = formatTime(h, m, s);
    } else if (t < 0) {
        document.getElementById('countdown-big').innerHTML = 'Past';
        document.getElementById('countdown-target').innerHTML = formatDate(new Date(T + tzOffset)) + ' ' + tz;
 
        return;
    }
 
    D = Math.floor(t / 86400.0);
    h = Math.floor(t % 86400.0 / 3600.0);
    m = Math.floor(t % 3600.0 / 60.0);
    s = Math.floor(t % 60.0)
 
    if (D == 1)
    {
        document.getElementById('countdown-big').innerHTML = '1 day';
    } else if (D == 0) {
        document.getElementById('countdown-big').innerHTML = '';
    } else {
        document.getElementById('countdown-big').innerHTML = D + ' days';
    }
 
    document.getElementById('countdown-small').innerHTML = formatTime(h, m, s);
}
}


function startCountdown()
function startCountdown()
{
{
updateClocks();
    document.getElementById('countdown-target').innerHTML = 'to ' + formatDate(new Date(T + tzOffset)) + ' ' + tz;
document.getElementById('countdown-target').innerHTML = 'to ' + formatDate(new Date(T + tzOffset)) + ' ' + tz;
    document.getElementById('countdown').style.display = 'block';
document.getElementById('countdown').style.display = 'block';
    updateClocks();
}
 
/*
Table sorting script  by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/.
Based on a script from http://www.kryogenix.org/code/browser/sorttable/.
Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html .
 
Copyright (c) 1997-2007 Stuart Langridge, Joost de Valk.
 
Version 1.5.7
*/
 
/* You can change these values */
var image_path = "http://www.joostdevalk.nl/code/sortable-table/";
var image_up = "arrow-up.gif";
var image_down = "arrow-down.gif";
var image_none = "arrow-none.gif";
var europeandate = false;
var alternate_row_colors = true;
 
/* Don't change anything below this unless you know what you're doing */
addEvent(window, "load", sortables_init);
 
var SORT_COLUMN_INDEX;
var thead = false;
 
function sortables_init() {
    // Find all tables with class sortable and make them sortable
    if (!document.getElementsByTagName) return;
    tbls = document.getElementsByTagName("table");
    for (ti=0;ti<tbls.length;ti++) {
        thisTbl = tbls[ti];
        if (((' '+thisTbl.className+' ').indexOf("sortable") != -1) && (thisTbl.id)) {
            ts_makeSortable(thisTbl);
        }
    }
}
 
function ts_makeSortable(t) {
    if (t.rows && t.rows.length > 0) {
        if (t.tHead && t.tHead.rows.length > 0) {
            var firstRow = t.tHead.rows[t.tHead.rows.length-1];
            thead = true;
        } else {
            var firstRow = t.rows[0];
        }
    }
    if (!firstRow) return;
 
    // We have a first row: assume it's the header, and make its contents clickable links
    for (var i=0;i<firstRow.cells.length;i++) {
        var cell = firstRow.cells[i];
        var txt = ts_getInnerText(cell);
        if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) {
            cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this, '+i+');return false;">'+txt+'<span class="sortarrow">&nbsp;&nbsp;<img src="'+ image_path + image_none + '" alt="&darr;"/></span></a>';
        }
    }
    if (alternate_row_colors) {
        alternate(t);
    }
}
 
function ts_getInnerText(el) {
    if (typeof el == "string") return el;
    if (typeof el == "undefined") { return el };
    if (el.innerText) return el.innerText; //Not needed but it is faster
    var str = "";
 
    var cs = el.childNodes;
    var l = cs.length;
    for (var i = 0; i < l; i++) {
        switch (cs[i].nodeType) {
            case 1: //ELEMENT_NODE
                str += ts_getInnerText(cs[i]);
                break;
            case 3: //TEXT_NODE
                str += cs[i].nodeValue;
                break;
        }
    }
    return str;
}
 
function ts_resortTable(lnk, clid) {
    var span;
    for (var ci=0;ci<lnk.childNodes.length;ci++) {
        if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
    }
    var spantext = ts_getInnerText(span);
    var td = lnk.parentNode;
    var column = clid || td.cellIndex;
    var t = getParent(td,'TABLE');
    // Work out a type for the column
    if (t.rows.length <= 1) return;
    var itm = "";
    var i = 1;
    while (itm == "" && i < t.tBodies[0].rows.length) {
        var itm = ts_getInnerText(t.tBodies[0].rows[i].cells[column]);
        itm = trim(itm);
        if (itm.substr(0,4) == "<!--" || itm.length == 0) {
            itm = "";
        }
        i++;
    }
    if (itm == "") return;
    sortfn = ts_sort_caseinsensitive;
    if (itm.match(/^\d\d[\/\.-][a-zA-z][a-zA-Z][a-zA-Z][\/\.-]\d\d\d\d$/)) sortfn = ts_sort_date;
    if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d{2}?$/)) sortfn = ts_sort_date;
    if (itm.match(/^-?[£$€Û¢´]\d/)) sortfn = ts_sort_numeric;
    if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)) sortfn = ts_sort_numeric;
    SORT_COLUMN_INDEX = column;
    var firstRow = new Array();
    var newRows = new Array();
    for (k=0;k<t.tBodies.length;k++) {
        for (i=0;i<t.tBodies[k].rows[0].length;i++) {
            firstRow[i] = t.tBodies[k].rows[0][i];
        }
    }
    for (k=0;k<t.tBodies.length;k++) {
        if (!thead) {
            // Skip the first row
            for (j=1;j<t.tBodies[k].rows.length;j++) {
                newRows[j-1] = t.tBodies[k].rows[j];
            }
        } else {
            // Do NOT skip the first row
            for (j=0;j<t.tBodies[k].rows.length;j++) {
                newRows[j] = t.tBodies[k].rows[j];
            }
        }
    }
    newRows.sort(sortfn);
    if (span.getAttribute("sortdir") == 'down') {
        ARROW = '&nbsp;&nbsp;<img src="'+ image_path + image_down + '" alt="&darr;"/>';
        newRows.reverse();
        span.setAttribute('sortdir','up');
    } else {
        ARROW = '&nbsp;&nbsp;<img src="'+ image_path + image_up + '" alt="&uarr;"/>';
        span.setAttribute('sortdir','down');
    }
    // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
    // don't do sortbottom rows
    for (i=0; i<newRows.length; i++) {
        if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) {
            t.tBodies[0].appendChild(newRows[i]);
        }
    }
    // do sortbottom rows only
    for (i=0; i<newRows.length; i++) {
        if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1))
            t.tBodies[0].appendChild(newRows[i]);
    }
    // Delete any other arrows there may be showing
    var allspans = document.getElementsByTagName("span");
    for (var ci=0;ci<allspans.length;ci++) {
        if (allspans[ci].className == 'sortarrow') {
            if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
                allspans[ci].innerHTML = '&nbsp;&nbsp;<img src="'+ image_path + image_none + '" alt="&darr;"/>';
            }
        }
    }
    span.innerHTML = ARROW;
    alternate(t);
}
 
function getParent(el, pTagName) {
    if (el == null) {
        return null;
    } else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) {
        return el;
    } else {
        return getParent(el.parentNode, pTagName);
    }
}
 
function sort_date(date) {
    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
    dt = "00000000";
    if (date.length == 11) {
        mtstr = date.substr(3,3);
        mtstr = mtstr.toLowerCase();
        switch(mtstr) {
            case "jan": var mt = "01"; break;
            case "feb": var mt = "02"; break;
            case "mar": var mt = "03"; break;
            case "apr": var mt = "04"; break;
            case "may": var mt = "05"; break;
            case "jun": var mt = "06"; break;
            case "jul": var mt = "07"; break;
            case "aug": var mt = "08"; break;
            case "sep": var mt = "09"; break;
            case "oct": var mt = "10"; break;
            case "nov": var mt = "11"; break;
            case "dec": var mt = "12"; break;
            // default: var mt = "00";
        }
        dt = date.substr(7,4)+mt+date.substr(0,2);
        return dt;
    } else if (date.length == 10) {
        if (europeandate == false) {
            dt = date.substr(6,4)+date.substr(0,2)+date.substr(3,2);
            return dt;
        } else {
            dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2);
            return dt;
        }
    } else if (date.length == 8) {
        yr = date.substr(6,2);
        if (parseInt(yr) < 50) {
            yr = '20'+yr;
        } else {
            yr = '19'+yr;
        }
        if (europeandate == true) {
            dt = yr+date.substr(3,2)+date.substr(0,2);
            return dt;
        } else {
            dt = yr+date.substr(0,2)+date.substr(3,2);
            return dt;
        }
    }
    return dt;
}
 
function ts_sort_date(a,b) {
    dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
    dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));
 
    if (dt1==dt2) {
        return 0;
    }
    if (dt1<dt2) {
        return -1;
    }
    return 1;
}
function ts_sort_numeric(a,b) {
    var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    aa = clean_num(aa);
    var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    bb = clean_num(bb);
    return compare_numeric(aa,bb);
}
function compare_numeric(a,b) {
    var a = parseFloat(a);
    a = (isNaN(a) ? 0 : a);
    var b = parseFloat(b);
    b = (isNaN(b) ? 0 : b);
    return a - b;
}
function ts_sort_caseinsensitive(a,b) {
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
    if (aa==bb) {
        return 0;
    }
    if (aa<bb) {
        return -1;
    }
    return 1;
}
function ts_sort_default(a,b) {
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa==bb) {
        return 0;
    }
    if (aa<bb) {
        return -1;
    }
    return 1;
}
function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+, NS6 and Mozilla
// By Scott Andrew
{
    if (elm.addEventListener){
        elm.addEventListener(evType, fn, useCapture);
        return true;
    } else if (elm.attachEvent){
        var r = elm.attachEvent("on"+evType, fn);
        return r;
    } else {
        alert("Handler could not be removed");
    }
}
}
function clean_num(str) {
    str = str.replace(new RegExp(/[^-?0-9.]/g),"");
    return str;
}
function trim(s) {
    return s.replace(/^\s+|\s+$/g, "");
}
function alternate(table) {
    // Take object table and get all it's tbodies.
    var tableBodies = table.getElementsByTagName("tbody");
    // Loop through these tbodies
    for (var i = 0; i < tableBodies.length; i++) {
        // Take the tbody, and get all it's rows
        var tableRows = tableBodies[i].getElementsByTagName("tr");
        // Loop through these rows
        // Start at 1 because we want to leave the heading row untouched
        for (var j = 0; j < tableRows.length; j++) {
            // Check if j is even, and apply classes for both possible results
            if ( (j % 2) == 0  ) {
                if ( !(tableRows[j].className.indexOf('odd') == -1) ) {
                    tableRows[j].className = tableRows[j].className.replace('odd', 'even');
                } else {
                    if ( tableRows[j].className.indexOf('even') == -1 ) {
                        tableRows[j].className += " even";
                    }
                }
            } else {
                if ( !(tableRows[j].className.indexOf('even') == -1) ) {
                    tableRows[j].className = tableRows[j].className.replace('even', 'odd');
                } else {
                    if ( tableRows[j].className.indexOf('odd') == -1 ) {
                        tableRows[j].className += " odd";
                    }
                }
            }
        }
    }
}
// Webmaster staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-WM" style="float:right; display:none;"><a href="/wiki/Bulbanews:Webmasters" title="This user is a Webmaster of Bulbagarden."><img src="http://cdn.bulbagarden.net/media/upload/2/26/IconBNWebmaster.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Board of Editors staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-BE" style="float:right; display:none;"><a href="/wiki/Bulbanews:Board_of_Editors" title="This user is a member of the Bulbanews Board of Editors."><img src="http://cdn.bulbagarden.net/media/upload/b/b2/IconBNBoardofEditors.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Executive staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-ES" style="float:right; display:none;"><a href="/wiki/Bulbanews:Executive_Staff" title="This user is a Bulbanews Executive Staff member."><img src="http://cdn.bulbagarden.net/media/upload/b/b2/IconBNBoardofEditors.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Bureaucrat staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-BC" style="float:right; display:none;"><a href="/wiki/Bulbanews:Bureaucrats" title="This user is a Bulbanews Bureaucrat."><img src="http://cdn.bulbagarden.net/media/upload/c/c0/IconBNBureaucrat.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Senior Writer staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-SW" style="float:right; display:none;"><a href="/wiki/Bulbanews:Senior_Writers" title="This user is a Bulbanews Senior Writer."><img src="http://cdn.bulbagarden.net/media/upload/0/0c/IconBNSeniorWriter.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Support Staff staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-SS" style="float:right; display:none;"><a href="/wiki/Bulbanews:Support_Staff" title="This user is a Bulbanews Support Staff member."><img src="http://cdn.bulbagarden.net/media/upload/5/52/IconBNSupportStaff.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Columnist staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-CO" style="float:right; display:none;"><a href="/wiki/Bulbanews:Columnists" title="This user is a Bulbanews Columnist."><img src="http://cdn.bulbagarden.net/media/upload/0/0e/IconBNColumnist.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Translator staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-TR" style="float:right; display:none;"><a href="/wiki/Bulbanews:Translators" title="This user is a Bulbanews Translator."><img src="http://cdn.bulbagarden.net/media/upload/3/33/IconBNTranslator.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Writer staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-WR" style="float:right; display:none;"><a href="/wiki/Bulbanews:Writers" title="This user is a Bulbanews Writer."><img src="http://cdn.bulbagarden.net/media/upload/a/a0/IconBNWriter.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Inactive staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };
    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-IN" style="float:right; display:none;"><a href="/wiki/Bulbanews:Inactive_Staff" title="This user is an inactive Bulbanews staff member. Please direct your inquiries to an active staff member."><img src="http://cdn.bulbagarden.net/media/upload/4/4e/IconBNInactive.png"></a></div>';
    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }
});
// Script to disable the source fields of the new article assistant if they are not needed.
$(document).ready(function() {
    $('#bnSourcetype').change(function() {
        const $sourceType = $(this).val();
        if ($sourceType === 'exclusive' || $sourceType === 'none') {
            $('#bnSourcename').attr('disabled', true).closest('tr').fadeTo('fast', 0.5);
            $('#bnSourcelink').attr('disabled', true).closest('tr').fadeTo('fast', 0.5);
        } else {
            $('#bnSourcename').removeAttr('disabled').closest('tr').fadeTo('fast', 1.0);
            $('#bnSourcelink').removeAttr('disabled').closest('tr').fadeTo('fast', 1.0);
        }
    });
});


/* </pre> */
/* </pre> */

Latest revision as of 06:49, 19 April 2021

/* <pre> */
/* Any JavaScript here will be loaded for all users on every page load. */

/**** class CollapsibleTables.js
 * (c) 2008 by Patrick Westerhoff [poke]
 *
 * This class allows to make tables collapsible and adds a show/hide button to
 * affected tables. Tables which class attribute contains 'collapsible' or
 * 'expandable' are affected by this class and can be collapsed; the latter
 * automatically hides the content of all sections.
 * Header rows are used to divide the table into sections which can be collapsed
 * separately. By default the first row of the table is interpreted as a header
 * row, however this can be overwritten by adding 'collapsible' to the class
 * attribute of header rows. You can also hide a section individually by default
 * when in 'collapsible' mode by using 'expandable' as the row's class name
 * instead.
 */

function CollapsibleTables ()
{
    var classCollapsible = 'collapsible';
    var classExpandable  = 'expandable';
    var linkTextShow     = '[show]';
    var linkTextHide     = '[hide]';

    var reCollapsible    = new RegExp( '(?:\\s|^)' + classCollapsible + '(?:\\s|$)' );
    var reExpandable     = new RegExp( '(?:\\s|^)' + classExpandable  + '(?:\\s|$)' );
    var sections         = new Array();

    // link element
    var linkElement               = document.createElement( 'a' );
    linkElement.style.fontSize    = '85%';
    linkElement.style.fontWeight  = 'normal';
    linkElement.style.width       = '3em';
    linkElement.style.cssFloat    = 'right';
    linkElement.style.styleFloat  = 'right';
    linkElement.style.textAlign   = 'center';
    linkElement.style.marginLeft  = '1em';
    linkElement.style.padding     = '0px 3px';
    linkElement.href              = 'javascript:void(0);';

    initialize();

    /** private void initialize () :: initializes CollapsibleTables class **/
    function initialize ()
    {
        if ( mw.config.get("wgIsArticle") == false && window.location.href.indexOf( 'action=submit' ) < 0 )
            return;

        var docContent    = document.getElementById( 'bodyContent' ) || document.getElementById( 'article' ) || document.getElementById( 'mw_contentholder' );
        var tables        = docContent.getElementsByTagName( 'table' );
        var sectionId     = -1;
        var defaultStatus;

        for ( var i = 0, n = tables.length; i < n; i++ )
        {
            if ( reCollapsible.test( tables[i].className ) )
                defaultStatus = true;
            else if ( reExpandable.test( tables[i].className ) )
                defaultStatus = false;
            else
                continue;

            var tableRows    = tables[i].rows;
            var sectionFound = false;
            var status       = false;

            for ( var j = 0, m = tableRows.length; j < m; j++ )
            {
                if ( reCollapsible.test( tableRows[j].className ) )
                    status = true;
                else if ( reExpandable.test( tableRows[j].className ) )
                    status = false;
                else
                {
                    if ( sectionFound )
                    {
                        sections[ sectionId ].content.push( tableRows[j] );
                        tableRows[j].style.display = sections[ sectionId ].status ? '' : 'none';
                    }

                    continue;
                }

                var section     = new Object();
                section.header  = tableRows[j];
                section.content = new Array();
                section.status  = defaultStatus ? status : false;

                sections[ ++sectionId ] = section;
                sectionFound            = true;

                initHeaderRow( tableRows[j], sectionId, section.status );
            }

            if ( sectionFound == false )
            {
                var section       = new Object();
                section.header    = tableRows[0];
                section.content   = new Array();
                section.status    = defaultStatus;

                for ( var j = 1; j < tableRows.length; j++ )
                {
                    section.content.push( tableRows[j] );
                    tableRows[j].style.display = section.status ? '' : 'none';
                }

                sections[ ++sectionId ] = section;

                initHeaderRow( tableRows[0], sectionId, defaultStatus );
            }
        }
    }

    /** private void initHeaderRow ( headerRow, sectionId, sectionStatus ) :: adds show/hide button **/
    function initHeaderRow ( headerRow, sectionId, sectionStatus )
    {
        var lastCell, link;

        headerRow.id = 'collapsible-section_' + sectionId;
        lastCell     = headerRow.cells[ headerRow.cells.length - 1 ];
        link         = linkElement.cloneNode( false );
        link.onclick = toggleSection;
        link.appendChild( document.createTextNode( sectionStatus ? linkTextHide : linkTextShow ) );

        lastCell.insertBefore( link, lastCell.firstChild );
    }

    /** private void toggleSection () :: onclick event handler **/
    function toggleSection ()
    {
        var trHead  = this.parentNode.parentNode;
        var section = sections[ trHead.id.substr( 20 ) ];
        var content = section.content;
        var display = section.status ? 'none' : '';

        for ( var i = 0, n = content.length; i < n; i++ )
            content[i].style.display = display;

        section.status       = !section.status;
        this.firstChild.data = section.status ? linkTextHide : linkTextShow;
    }
}

$(document).ready(function() { CollapsibleTables(); } );

function formatDate(t)
{
    var month = new Array();
    month[0] = 'January';
    month[1] = 'February';
    month[2] = 'March';
    month[3] = 'April';
    month[4] = 'May';
    month[5] = 'June';
    month[6] = 'July';
    month[7] = 'August';
    month[8] = 'September';
    month[9] = 'October';
    month[10] = 'November';
    month[11] = 'December';

    y = t.getUTCFullYear();
    M = t.getUTCMonth();
    D = t.getUTCDate();
    h = t.getUTCHours();
    m = t.getUTCMinutes();
    s = t.getUTCSeconds();

    if (h > 0 || m > 0 || s > 0)
    {
        hms = '';

        if (s > 10)
            hms = ':' + s;
        else if (s > 0)
            hms = ':0' + s;

        if (m > 10)
            hms = ':' + m + hms;
        else if (m > 0)
            hms = ':0' + m + hms;

        if (h > 12)
            hms = (h - 12) + hms + ' PM';
        else if (h > 0)
            hms = h + hms + ' AM';
        else
            hms = '12' + hms + ' AM';

        return hms + ', ' + month[M] + ' ' + D + ', ' + y;
    } else {
        return month[M] + ' ' + D + ', ' + y;
    }
}

function formatTime(h, m, s)
{
    var o = '';

    if (h != 1)
    {
        o = h + ' hours ';
    } else {
        o = '1 hour ';
    }

    if (m != 1)
    {
        o += m + ' minutes ';
    } else {
        o += '1 minute ';
    }

    if (s != 1)
    {
        o += s + ' seconds';
    } else {
        o += '1 second';
    }

    return o;
}

function updateClocks()
{
    var t = new Date();

    setTimeout(updateClocks, 1000);

    D = t.getUTCDate();
    M = t.getUTCMonth();
    y = t.getUTCFullYear();
    h = t.getUTCHours();
    m = t.getUTCMinutes();
    s = t.getUTCSeconds();

    t = Date.UTC(y, M, D, h, m, s);

    t = (T - t) / 1000;

    if (t < 0 && t > -86400 && (h > 0 || m > 0 || s > 0))
    {
        document.getElementById('countdown-big').innerHTML = 'Today';
        document.getElementById('countdown-small').innerHTML = '';
        document.getElementById('countdown-target').innerHTML = 'is ' + formatDate(new Date(T + tzOffset)) + ' ' + tz;

        return;
    } else if (t < 0) {
        document.getElementById('countdown-big').innerHTML = 'Past';
        document.getElementById('countdown-target').innerHTML = formatDate(new Date(T + tzOffset)) + ' ' + tz;

        return;
    }

    D = Math.floor(t / 86400.0);
    h = Math.floor(t % 86400.0 / 3600.0);
    m = Math.floor(t % 3600.0 / 60.0);
    s = Math.floor(t % 60.0)

    if (D == 1)
    {
        document.getElementById('countdown-big').innerHTML = '1 day';
    } else if (D == 0) {
        document.getElementById('countdown-big').innerHTML = '';
    } else {
        document.getElementById('countdown-big').innerHTML = D + ' days';
    }

    document.getElementById('countdown-small').innerHTML = formatTime(h, m, s);
}

function startCountdown()
{
    document.getElementById('countdown-target').innerHTML = 'to ' + formatDate(new Date(T + tzOffset)) + ' ' + tz;
    document.getElementById('countdown').style.display = 'block';
    updateClocks();
}

/*
Table sorting script  by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/.
Based on a script from http://www.kryogenix.org/code/browser/sorttable/.
Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html .

Copyright (c) 1997-2007 Stuart Langridge, Joost de Valk.

Version 1.5.7
*/

/* You can change these values */
var image_path = "http://www.joostdevalk.nl/code/sortable-table/";
var image_up = "arrow-up.gif";
var image_down = "arrow-down.gif";
var image_none = "arrow-none.gif";
var europeandate = false;
var alternate_row_colors = true;

/* Don't change anything below this unless you know what you're doing */
addEvent(window, "load", sortables_init);

var SORT_COLUMN_INDEX;
var thead = false;

function sortables_init() {
    // Find all tables with class sortable and make them sortable
    if (!document.getElementsByTagName) return;
    tbls = document.getElementsByTagName("table");
    for (ti=0;ti<tbls.length;ti++) {
        thisTbl = tbls[ti];
        if (((' '+thisTbl.className+' ').indexOf("sortable") != -1) && (thisTbl.id)) {
            ts_makeSortable(thisTbl);
        }
    }
}

function ts_makeSortable(t) {
    if (t.rows && t.rows.length > 0) {
        if (t.tHead && t.tHead.rows.length > 0) {
            var firstRow = t.tHead.rows[t.tHead.rows.length-1];
            thead = true;
        } else {
            var firstRow = t.rows[0];
        }
    }
    if (!firstRow) return;

    // We have a first row: assume it's the header, and make its contents clickable links
    for (var i=0;i<firstRow.cells.length;i++) {
        var cell = firstRow.cells[i];
        var txt = ts_getInnerText(cell);
        if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) {
            cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this, '+i+');return false;">'+txt+'<span class="sortarrow">&nbsp;&nbsp;<img src="'+ image_path + image_none + '" alt="&darr;"/></span></a>';
        }
    }
    if (alternate_row_colors) {
        alternate(t);
    }
}

function ts_getInnerText(el) {
    if (typeof el == "string") return el;
    if (typeof el == "undefined") { return el };
    if (el.innerText) return el.innerText;	//Not needed but it is faster
    var str = "";

    var cs = el.childNodes;
    var l = cs.length;
    for (var i = 0; i < l; i++) {
        switch (cs[i].nodeType) {
            case 1: //ELEMENT_NODE
                str += ts_getInnerText(cs[i]);
                break;
            case 3:	//TEXT_NODE
                str += cs[i].nodeValue;
                break;
        }
    }
    return str;
}

function ts_resortTable(lnk, clid) {
    var span;
    for (var ci=0;ci<lnk.childNodes.length;ci++) {
        if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
    }
    var spantext = ts_getInnerText(span);
    var td = lnk.parentNode;
    var column = clid || td.cellIndex;
    var t = getParent(td,'TABLE');
    // Work out a type for the column
    if (t.rows.length <= 1) return;
    var itm = "";
    var i = 1;
    while (itm == "" && i < t.tBodies[0].rows.length) {
        var itm = ts_getInnerText(t.tBodies[0].rows[i].cells[column]);
        itm = trim(itm);
        if (itm.substr(0,4) == "<!--" || itm.length == 0) {
            itm = "";
        }
        i++;
    }
    if (itm == "") return;
    sortfn = ts_sort_caseinsensitive;
    if (itm.match(/^\d\d[\/\.-][a-zA-z][a-zA-Z][a-zA-Z][\/\.-]\d\d\d\d$/)) sortfn = ts_sort_date;
    if (itm.match(/^\d\d[\/\.-]\d\d[\/\.-]\d\d\d{2}?$/)) sortfn = ts_sort_date;
    if (itm.match(/^-?[£$€Û¢´]\d/)) sortfn = ts_sort_numeric;
    if (itm.match(/^-?(\d+[,\.]?)+(E[-+][\d]+)?%?$/)) sortfn = ts_sort_numeric;
    SORT_COLUMN_INDEX = column;
    var firstRow = new Array();
    var newRows = new Array();
    for (k=0;k<t.tBodies.length;k++) {
        for (i=0;i<t.tBodies[k].rows[0].length;i++) {
            firstRow[i] = t.tBodies[k].rows[0][i];
        }
    }
    for (k=0;k<t.tBodies.length;k++) {
        if (!thead) {
            // Skip the first row
            for (j=1;j<t.tBodies[k].rows.length;j++) {
                newRows[j-1] = t.tBodies[k].rows[j];
            }
        } else {
            // Do NOT skip the first row
            for (j=0;j<t.tBodies[k].rows.length;j++) {
                newRows[j] = t.tBodies[k].rows[j];
            }
        }
    }
    newRows.sort(sortfn);
    if (span.getAttribute("sortdir") == 'down') {
        ARROW = '&nbsp;&nbsp;<img src="'+ image_path + image_down + '" alt="&darr;"/>';
        newRows.reverse();
        span.setAttribute('sortdir','up');
    } else {
        ARROW = '&nbsp;&nbsp;<img src="'+ image_path + image_up + '" alt="&uarr;"/>';
        span.setAttribute('sortdir','down');
    }
    // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
    // don't do sortbottom rows
    for (i=0; i<newRows.length; i++) {
        if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) {
            t.tBodies[0].appendChild(newRows[i]);
        }
    }
    // do sortbottom rows only
    for (i=0; i<newRows.length; i++) {
        if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1))
            t.tBodies[0].appendChild(newRows[i]);
    }
    // Delete any other arrows there may be showing
    var allspans = document.getElementsByTagName("span");
    for (var ci=0;ci<allspans.length;ci++) {
        if (allspans[ci].className == 'sortarrow') {
            if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
                allspans[ci].innerHTML = '&nbsp;&nbsp;<img src="'+ image_path + image_none + '" alt="&darr;"/>';
            }
        }
    }
    span.innerHTML = ARROW;
    alternate(t);
}

function getParent(el, pTagName) {
    if (el == null) {
        return null;
    } else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) {
        return el;
    } else {
        return getParent(el.parentNode, pTagName);
    }
}

function sort_date(date) {
    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
    dt = "00000000";
    if (date.length == 11) {
        mtstr = date.substr(3,3);
        mtstr = mtstr.toLowerCase();
        switch(mtstr) {
            case "jan": var mt = "01"; break;
            case "feb": var mt = "02"; break;
            case "mar": var mt = "03"; break;
            case "apr": var mt = "04"; break;
            case "may": var mt = "05"; break;
            case "jun": var mt = "06"; break;
            case "jul": var mt = "07"; break;
            case "aug": var mt = "08"; break;
            case "sep": var mt = "09"; break;
            case "oct": var mt = "10"; break;
            case "nov": var mt = "11"; break;
            case "dec": var mt = "12"; break;
            // default: var mt = "00";
        }
        dt = date.substr(7,4)+mt+date.substr(0,2);
        return dt;
    } else if (date.length == 10) {
        if (europeandate == false) {
            dt = date.substr(6,4)+date.substr(0,2)+date.substr(3,2);
            return dt;
        } else {
            dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2);
            return dt;
        }
    } else if (date.length == 8) {
        yr = date.substr(6,2);
        if (parseInt(yr) < 50) {
            yr = '20'+yr;
        } else {
            yr = '19'+yr;
        }
        if (europeandate == true) {
            dt = yr+date.substr(3,2)+date.substr(0,2);
            return dt;
        } else {
            dt = yr+date.substr(0,2)+date.substr(3,2);
            return dt;
        }
    }
    return dt;
}

function ts_sort_date(a,b) {
    dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
    dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));

    if (dt1==dt2) {
        return 0;
    }
    if (dt1<dt2) {
        return -1;
    }
    return 1;
}
function ts_sort_numeric(a,b) {
    var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    aa = clean_num(aa);
    var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    bb = clean_num(bb);
    return compare_numeric(aa,bb);
}
function compare_numeric(a,b) {
    var a = parseFloat(a);
    a = (isNaN(a) ? 0 : a);
    var b = parseFloat(b);
    b = (isNaN(b) ? 0 : b);
    return a - b;
}
function ts_sort_caseinsensitive(a,b) {
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
    if (aa==bb) {
        return 0;
    }
    if (aa<bb) {
        return -1;
    }
    return 1;
}
function ts_sort_default(a,b) {
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa==bb) {
        return 0;
    }
    if (aa<bb) {
        return -1;
    }
    return 1;
}
function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,	NS6 and Mozilla
// By Scott Andrew
{
    if (elm.addEventListener){
        elm.addEventListener(evType, fn, useCapture);
        return true;
    } else if (elm.attachEvent){
        var r = elm.attachEvent("on"+evType, fn);
        return r;
    } else {
        alert("Handler could not be removed");
    }
}
function clean_num(str) {
    str = str.replace(new RegExp(/[^-?0-9.]/g),"");
    return str;
}
function trim(s) {
    return s.replace(/^\s+|\s+$/g, "");
}
function alternate(table) {
    // Take object table and get all it's tbodies.
    var tableBodies = table.getElementsByTagName("tbody");
    // Loop through these tbodies
    for (var i = 0; i < tableBodies.length; i++) {
        // Take the tbody, and get all it's rows
        var tableRows = tableBodies[i].getElementsByTagName("tr");
        // Loop through these rows
        // Start at 1 because we want to leave the heading row untouched
        for (var j = 0; j < tableRows.length; j++) {
            // Check if j is even, and apply classes for both possible results
            if ( (j % 2) == 0  ) {
                if ( !(tableRows[j].className.indexOf('odd') == -1) ) {
                    tableRows[j].className = tableRows[j].className.replace('odd', 'even');
                } else {
                    if ( tableRows[j].className.indexOf('even') == -1 ) {
                        tableRows[j].className += " even";
                    }
                }
            } else {
                if ( !(tableRows[j].className.indexOf('even') == -1) ) {
                    tableRows[j].className = tableRows[j].className.replace('even', 'odd');
                } else {
                    if ( tableRows[j].className.indexOf('odd') == -1 ) {
                        tableRows[j].className += " odd";
                    }
                }
            }
        }
    }
}


// Webmaster staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-WM" style="float:right; display:none;"><a href="/wiki/Bulbanews:Webmasters" title="This user is a Webmaster of Bulbagarden."><img src="http://cdn.bulbagarden.net/media/upload/2/26/IconBNWebmaster.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Board of Editors staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-BE" style="float:right; display:none;"><a href="/wiki/Bulbanews:Board_of_Editors" title="This user is a member of the Bulbanews Board of Editors."><img src="http://cdn.bulbagarden.net/media/upload/b/b2/IconBNBoardofEditors.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Executive staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-ES" style="float:right; display:none;"><a href="/wiki/Bulbanews:Executive_Staff" title="This user is a Bulbanews Executive Staff member."><img src="http://cdn.bulbagarden.net/media/upload/b/b2/IconBNBoardofEditors.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Bureaucrat staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-BC" style="float:right; display:none;"><a href="/wiki/Bulbanews:Bureaucrats" title="This user is a Bulbanews Bureaucrat."><img src="http://cdn.bulbagarden.net/media/upload/c/c0/IconBNBureaucrat.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Senior Writer staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-SW" style="float:right; display:none;"><a href="/wiki/Bulbanews:Senior_Writers" title="This user is a Bulbanews Senior Writer."><img src="http://cdn.bulbagarden.net/media/upload/0/0c/IconBNSeniorWriter.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Support Staff staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-SS" style="float:right; display:none;"><a href="/wiki/Bulbanews:Support_Staff" title="This user is a Bulbanews Support Staff member."><img src="http://cdn.bulbagarden.net/media/upload/5/52/IconBNSupportStaff.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Columnist staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-CO" style="float:right; display:none;"><a href="/wiki/Bulbanews:Columnists" title="This user is a Bulbanews Columnist."><img src="http://cdn.bulbagarden.net/media/upload/0/0e/IconBNColumnist.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Translator staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-TR" style="float:right; display:none;"><a href="/wiki/Bulbanews:Translators" title="This user is a Bulbanews Translator."><img src="http://cdn.bulbagarden.net/media/upload/3/33/IconBNTranslator.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Writer staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-WR" style="float:right; display:none;"><a href="/wiki/Bulbanews:Writers" title="This user is a Bulbanews Writer."><img src="http://cdn.bulbagarden.net/media/upload/a/a0/IconBNWriter.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});

// Inactive staff icons
$(document).ready(function () {
    if(
        window.location.href.indexOf("/wiki/User:") == -1
    ) {
        if(
            window.location.href.indexOf("/wiki/User_talk:") == -1
        ) {
            return;
        }
    };

    // create div and set innerHTML to link
    var divContainer = document.createElement("div");
    divContainer.innerHTML = '<div class="stafflink-IN" style="float:right; display:none;"><a href="/wiki/Bulbanews:Inactive_Staff" title="This user is an inactive Bulbanews staff member. Please direct your inquiries to an active staff member."><img src="http://cdn.bulbagarden.net/media/upload/4/4e/IconBNInactive.png"></a></div>';

    // insert divContainer into the DOM below the h1
    if(window.location.href.indexOf("&action=edit") == -1) {
        document.getElementById("content").insertBefore(divContainer, document.getElementsByTagName("h1")[0]);
    }

});
// Script to disable the source fields of the new article assistant if they are not needed.
$(document).ready(function() {
    $('#bnSourcetype').change(function() {
        const $sourceType = $(this).val();
        if ($sourceType === 'exclusive' || $sourceType === 'none') {
            $('#bnSourcename').attr('disabled', true).closest('tr').fadeTo('fast', 0.5);
            $('#bnSourcelink').attr('disabled', true).closest('tr').fadeTo('fast', 0.5);
        } else {
            $('#bnSourcename').removeAttr('disabled').closest('tr').fadeTo('fast', 1.0);
            $('#bnSourcelink').removeAttr('disabled').closest('tr').fadeTo('fast', 1.0);
        }
    });
});

/* </pre> */