MediaWiki:Common.js

From Redemption Wiki
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * Full credit goes to http://runescape.wikia.com/wiki/MediaWiki:Common.js/compare.js
 */

/*jshint multistr:true, strict:false */
/*global mw:true, $:true */

$( '.cioCompareLink' ).each( function () {
    var props = ( $( this ).attr( 'title' ) || '').split( '|' ),
        linkText = (props[0] !== '') ? props[0] : 'Compare items',
        items = (props.length >= 2) ? props.slice(1) : [ mw.config.get( 'wgPageName' ) ],
        $link = $( '<a>' ).attr( {
            href: '#',
            title: 'Compare this item with other items.'
        } ).click( function ( e ) {
            // I'm like 90% sure if you don't specify a href attribute, you don't need a preventDefault
            e.preventDefault();
            cioOpen( items );
        } ).text( linkText );

    $( this ).empty().append( $link );
});

// @todo upload these to the wiki
var $cioImgDelete = $( '<img>' ).attr( {
        src: 'http://img200.imageshack.us/img200/7898/transdelrow.png',
        width: 14,
        height: 13,
        alt: '[X]'
    } ),
    $cioImgLoading = $( '<img>' ).attr( {
        src: mw.config.get( 'stylepath' ) + '/common/progress-wheel.gif',
        width: 16,
        height: 16,
        alt: '...'
    } ),
    $cioImgError = $( '<img>' ).attr( {
        src: 'http://img12.imageshack.us/img12/508/1248624996error.png',
        width: 16,
        height: 16,
        alt: '!!'
    } );
 
/** Open the compare items overlay */
function cioOpen( items ) {
    // Darken the page
    if ( !$( '#overlay' ).length ) {
        $( '<div>' ).attr( 'id', 'overlay' )
                    .appendTo( 'body' )
                    .show()
                    .unbind( 'click' )
                    .click( cioClose );
    } else {
        $( '#overlay' ).show()
                       .unbind( 'click' )
                       .click( cioClose );
    }

    $( document ).keydown( function ( e ) {
        if (e.which == 27) {
            cioClose();
        }
    } );
 
  
    // Build the initial table
    var html = ' \
<div id="cioTitle"> \
 <div id="modalClose" onclick="cioClose();" title="Close this overlay."><img src="http://img693.imageshack.us/img693/9906/closes.png" width="48" height="24" alt="[X]" /></div> \
 Compare Items \
</div> \
<form name="cioCompare" id="cioCompare" onsubmit="cioSubmit(this.cioItem.value); return false;" action="#"> \
    <table> \
        <tr> \
            <td><label for="cioItem">Compare <b>' + mw.config.get( 'wgTitle' ) + '</b> with:</label></td> \
            <td><input type="input" type="text" name="cioItem" id="cioItem" value="" /> <input type="submit" value="Add" /></td> \
        </tr> \
        <tr> \
            <td>&nbsp;</td> \
            <td id="cioStatus"></td> \
        </tr> \
    </table> \
</form> \
<table class="wikitable" id="cioItems"> \
    <thead> \
        <tr> \
            <th rowspan="2">Name</th> \
                <th colspan="3">Mainhand Info</th> \
                <th colspan="3">Offhand Info</th> \
                <th colspan="3">Attributes</th> \
                <th colspan="3"><span style="font-size:80%">Critical Bonuses</span></th> \
                <th width="30">Speed</th> \
                <th width="30">Weight</th> \
            <th width="30">GE</th> \
        </tr> \
        <tr> \
            <th width="35">Style</th> \
            <th width="35"><span style="font-size:80%">Damage</span></th> \
            <th width="35"><span style="font-size:80%">Accuracy</span></th> \
            <th width="35">Style</th> \
            <th width="35"><span style="font-size:80%">Damage</span></th> \
            <th width="35"><span style="font-size:80%">Accuracy</span></th> \
            <th width="35" title="Armour rating"><img src="https://images.wikia.nocookie.net/runescape/images/thumb/d/d8/Defence-icon.png/18px-Defence-icon.png"" alt="Arm" /></th> \
            <th width="35" title="Life bonus"><img src="https://images.wikia.nocookie.net/runescape/images/thumb/1/1d/Constitution-icon.png/21px-Constitution-icon.png" alt="Lif" /></th> \
            <th width="35" title="Prayer bonus"><img src="https://images.wikia.nocookie.net/runescape/images/2/24/Prayer-icon.png" width="20" height="20" alt="Pra" /></th> \
            <th width="35" title="Melee critical"><img src="https://images.wikia.nocookie.net/runescape/images/9/90/Stab_Attack_Style.png" width="11" height="20" alt="Dam" /></th> \
            <th width="35" title="Ranged critical"><img src="https://images.wikia.nocookie.net/runescape/images/7/72/Ranged-icon.png" width="20" height="20" alt="Rng" /></th> \
            <th width="35" title="Magic critical"><img src="https://images.wikia.nocookie.net/runescape/images/7/77/Magic-icon.png" width="20" height="19" alt="Mag" /></th> \
            <th title="Speed"><img src="https://images.wikia.nocookie.net/runescape/images/a/a9/Energy.png" width="17" height="20" alt="Spd" /></th> \
            <th title="Weight (kg)"><img src="https://images.wikia.nocookie.net/runescape/images/f/fc/Weight-icon.png" width="20" height="20" alt="Wgt" /></th> \
            <th title="Grand Exchange Price"><img src="https://images.wikia.nocookie.net/runescape/images/6/65/Coins_25.png" width="20" height="15" alt="GE" /></th> \
        </tr> \
    </thead> \
    <tbody> \
        <tr id="cioTotals"> \
        </tr> \
    </tbody> \
</table>';
 
    // Create the modal box
    $('<div />').html(html).attr('id', 'modal').appendTo('body');
 
    // Center
    $('#modal').css('left', $(window).width() / 2 - ($('#modal').width() / 2));
 
    //os_enableSuggestionsOn('cioItem', 'cioCompare');
 
    // Initial item(s)
    // TODO: Fold multiple item calls into one API query
    for (var i = 0; i < items.length && i < 5; i++) {
        cioSubmit(items[i]);
    }
}
 
//Switch Infobox
if ($('.switch-infobox').length) {
//   importScriptPage('User:-Matt/SwitchInfobox.js', 'runescape');
//   importStylesheetPage('User:-Matt/SwitchInfobox.css', 'runescape');
}

/** Close the overlay. */
function cioClose() {
        //os_disableSuggestionsOn('cioItem');
        $('#modal').fadeOut('normal', function () {
                $('#modal').remove();
                $('#overlay').hide();
        });
        $(document).unbind('keydown');
}
 
/** Submit an AJAX request to add a new item */
function cioSubmit(itemName) {
        // http://www.mredkj.com/javascript/numberFormat.html#addcommas
        function addCommas(nStr) {
                nStr += '';
                x = nStr.split('.');
                x1 = x[0];
                x2 = x.length > 1 ? '.' + x[1] : '';
                var rgx = /(\d+)(\d{3})/;
                while (rgx.test(x1)) {
                        x1 = x1.replace(rgx, '$1' + ',' + '$2');
                }
                return x1 + x2;
        }
 
        /** Calculate bonus totals */
        function calcTotals() {
                var totals = [];
                for (var i = 0; i < 15; i++) {
                        totals[i] = 0;
                }
 
                // Iterate over each row and col
                $('#cioItems tbody tr').not('#cioTotals').each(function() {
                        var i = 0;
                        $(this).children('td').each(function() {
                                var num = $(this).text().replace(/,/g, '');
                                totals[i++] += (isNaN(num) ? 0 : parseInt(num));
                        });
                });
 
                $('#cioTotals').empty().append($('<th />').text('Total'));
        for (var i in totals) {
            // Don't total weapon speeds
            $('#cioTotals').append(format((/(1?2|5)/.test(i)) ? null : (addCommas(totals[i]) + '')));
        }
    }
 
        /** Format a template number and return a (jQuery) table cell */
        function format(str) {
                if (str == null || /no|^\s*<!--.*-->\s$/i.test(str)) {
                        return $('<td />').attr('class', 'cioEmpty').text('--');
                } else {
                        // Prepend + sign to numbers without any sign
                        str = str.replace(/<!--.*?-->/g); //remove comments
                        if (/\d/.test(str.substring(0, 1))) {
                                str = '+' + str;
                        }
 
                        if(/\w/.test(str.substring(0, 1))) return $('<td />').text(str);
                        else return $('<td />').attr('class', (str.substring(0, 1) == '-') ? 'cioNeg' : 'cioPos').text(str);
                }
        }
 
        /** Parse the parameters in a given template.  */
        function parseTemplate(text, tpl) {
                tpl = tpl.replace(/[_ ]/g, '[_ ]');
                var re = new RegExp('{{\\s*(template:)?' + tpl + '\\s*\\|([\\w\\W]+?[^!])}}', 'gi');
 
                var data = [];
                var match;
 
                while (match = re.exec(text)) {
                        var params = match[2].split('|');
                        var j = 1; // Unnamed parameter index
                        var tplData = [];
                        for (var k in params) {
                                var t = params[k].split('=');
                                var name = null;
                                var value = null;
                                if (t.length == 1) { // Unnamed params
                                        name = (j++) + ''; // Cast to string
                                        value = t[0];
                                } else {
                                        name = t[0];
                                        value = t[1];
                                }
 
                                tplData[$.trim(name)] = $.trim(value);
                        }
                        data.push(tplData);
                }
 
                return data;
        }
 
        /** Error message */
        function showError( str ) {
                $( '#cioStatus' ).empty()
                                 .attr( 'class', 'cioError' )
                                 .append( $cioImgError.clone() )
                                 .append( ' ' + str );
        }
 
        /** Ajax error handler */
        function ajaxError( xhr, error ) {
                showError( 'Error: ' + error );
        }
 
        /** Ajax success handler */
        function ajaxSuccess( data ) {
                // @todo Handle error messages from the API
 
                // List of template params to display within each column.
                var bonusCols = [
                        'astab', 'aslash', 'acrush', 'amagic', 'arange',
                        'dstab', 'dslash', 'dcrush', 'dmagic', 'drange',
                        'slot', 'str', 'prayer',
                ];
 
        var pages = data.query.pages,
            exchangePageId = null,
            pageId = null;
 
        for ( var i in pages ) {
            if ( pages[i].ns == '112' ) {
                exchangePageId = pages[i].pageid;
            } else {
                pageId = pages[i].pageid;
            }
        }
 
        if ( pageId == null ) {
            showError( 'Could not find that item.' );
        } else {
            var page = data.query.pages[pageId],
                exchangePage = data.query.pages[exchangePageId],
                pageTitle = page.title,
                pageContent = page.revisions[0]['*'],
                bonusData = parseTemplate(pageContent, 'infobox bonuses'),
                itemData = parseTemplate(pageContent, 'infobox item'),
                exchangeData = [];

            if ( exchangePage ) {
                var exchangeContent = exchangePage.revisions[0]['*'].replace( '{{{View}}}', '' );
                exchangeData = parseTemplate( exchangeContent, 'exchangeitem' );
            }
 
            for ( var i in bonusData ) {
                var $row = $( '<tr>' ),
                    $th = $( '<th>' ),
                    $delLink = $( '<a>' ).attr( {
                        href: '#',
                        title: 'Remove this row.'
                    } ).click( function () {
                        $( this ).closest( 'tr' ).fadeOut( 'slow', function () {
                            $( this ).remove();
                            calcTotals();
                        } );
                    } ),
                    $itemLink = $( '<a>' ).attr( {
                        href: mw.config.get( 'wgArticlePath' ).replace( '$1', encodeURI( pageTitle ) ),
                        title: pageTitle
                    } ).text( pageTitle );
 
                $delLink.append( $cioImgDelete.clone() );
                $th.append( $delLink )
                   .append( ' ' )
                   .append( $itemLink );
                $row.append( $th );
 
                for (var j in bonusCols) {
                    $row.append( format( bonusData[i][bonusCols[j]] ) );
 
                }
 
                $row.append( format( itemData.length ? itemData[0]['weight'] : null ) );
                $row.append( format( exchangeData.length ? exchangeData[0]['Price'] : null ) );
 
                $( '#cioTotals' ).before( $row );
            }
 
            if ( !bonusData.length ) {
                showError( 'No bonus data found for the item.' );
            } else {
                calcTotals();
                $( '#cioStatus' ).empty();
            }
        }
    }
 
    $( '#cioStatus' ).empty()
                     .attr( 'class', 'cioLoading' )
                     .append( $cioImgLoading.clone() )
                     .append( ' Loading...' );
 
    $.ajax( {
        data: {
            'action': 'query',
            'prop': 'revisions',
            'titles': itemName + '|Exchange:' + itemName,
            'rvprop': 'content',
            'redirects': '',
            'format': 'json'
        },
        dataType: 'json',
        success: ajaxSuccess,
        error: ajaxError,
        url: mw.config.get( 'wgScriptPath' ) + '/api.php',
        timeout: 10000 // millisec
    });
}

window.InactiveUsers = { months: 1 };

/* Any JavaScript here will be loaded for all users on every page load. */
 
var tooltips_config = {
    waitForImages: true,
    noCSS: true,
};
 
var tooltips_list = [
    {
        classname: 'unit-tooltip',
        parse: '{'+'{<#unit#>|rank=<#rank#>|size=<#size#>|upgrade=<#upgrade#>|upgrades=<#upgrades#>|upgraded=<#upgraded#>|race=<#race#>|tt=<#tt#>|show=no}}',
        //onShow: function() { if ((this).getElementsByClassName('template-unit')[0]) {Unit = (this).getElementsByClassName('template-unit')[0]; console.info("Onshow var =",Unit); processunit (Unit);} },
    }, {
        classname: 'spell-tooltip',
        parse: '{'+'{<#spell#>|magnitude=<#magnitude#>|tt=<#tt#>}}',
    }, {
        classname: 'ability-tooltip',
        parse: '{'+'{<#ability#>|<#magnitude#>|duration=<#duration#>|tt=<#tt#>|show=no}}',
    }, {
        classname: 'structure-tooltip',
        parse: '{'+'{<#structure#>}}',
    }, {
        classname: 'building-tooltip',
        parse: '{'+'{<#building#>}}',
    }, {
        classname: 'damageability-tooltip',
        parse: '{'+'{<#ability#>|physical=<#physical#>|spirit=<#spirit#>|blight=<#blight#>|fire=<#fire#>|frost=<#frost#>|shock=<#shock#>|tt=<#tt#>|show=no}}',
        onShow: function(handle) { a = handle; writeloc = (this).getElementsByClassName('writedamage')[0]; damagesource = a.parentElement; unitloc = damagesource.parentElement.parentElement; damageCalc (writeloc, damagesource, unitloc); },
    }, {
        classname: 'protection-tooltip',
        parse: '{'+'{Prottable|<#magnitude#>|<#element#>}}',
    }, {
        classname: 'weakness-tooltip',
        parse: '{'+'{Weaktable|<#magnitude#>|<#element#>}}',
    }, {
        classname: 'Pernix/Hover',
        parse: '{'+'{Weaktable|<#magnitude#>|<#element#>}}',
    }
];

mediaWiki.loader.load('/wiki/MediaWiki:DiscordIntegrator/code.js?action=raw&ctype=text/javascript');