MediaWiki:Common.js/compare.js

/** * 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 = $( '' ).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 = $( ' ' ).attr( {       src: 'http://img200.imageshack.us/img200/7898/transdelrow.png',        width: 14,        height: 13,        alt: '[X]'    } ), $cioImgLoading = $( ' ' ).attr( {       src: mw.config.get( 'stylepath' ) + '/common/progress-wheel.gif',        width: 16,        height: 16,        alt: '...'    } ), $cioImgError = $( ' ' ).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 ) { $( ' ' ).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 = ' \ \  \ Compare Items \ \  \ \ \ ';   // Create the modal box $(' ').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]); } } /** 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($(' ').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 $(' ').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 $(' ').text(str); else return $(' ').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('', '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( ,  ); exchangeData = parseTemplate( exchangeContent, 'exchangeitem' ); }           for ( var i in bonusData ) { var $row = $( ' ' ), $th = $( ' ' ), $delLink = $( '' ).attr( {                       href: '#',                        title: 'Remove this row.'                    } ).click( function  {                        $( this ).closest( 'tr' ).fadeOut( 'slow', function  { $( this ).remove; calcTotals; } );                   } ),                    $itemLink = $( '' ).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    }); } /* */