MediaWiki:Common.js/compare.js

/* */ // Shamelessly little changed from Quarenon's script. // Add links to compare templates $('.cioCompareLinkBeta').each(function {		var props = ($(this).attr('title')||).split('|');		var linkText = (props[0] != ) ? props[0] : 'Compare items';		var items = (props.length >= 2) ? props.slice(1) : [ wgPageName ];		var $link = $('').attr({href: '#', title: 'Compare this item with others.'}).click(function { cioOpen(items) }).text(linkText);		$(this).empty.append($link); }); var $cioImgDelete = $(' ').attr({src: 'http://img200.imageshack.us/img200/7898/transdelrow.png', width: 14, height: 13, alt: '[X]'}); var $cioImgLoading = $(' ').attr({src: stylepath + '/common/progress-wheel.gif', width: 16, height: 16, alt: '...'}); var $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 $(' ').attr('id', 'overlay').appendTo('body').show; // 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').remove;		}); } /** 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 (col 15) $('#cioTotals').append(format((i == 18) ? null : (addCommas(totals[i]) + ''))); }		}		/** Format a template number and return a (jQuery) table cell */ function format(str) { if (str == null) { return $(' ').attr('class', 'cioEmpty').text('--'); } else { // Prepend + sign to numbers without any sign if (str.substring(0, 1) != '-' && str.substring(0, 1) != '+') { str = '+' + str; }						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 = new Array; 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 = [ 'mainDamage', 'mainBonus', 'mainStyle', 'offDamage', 'offBonus', 'offStyle', 'defence', 'life', 'pray', 'meleecrit', 'rangedcrit', 'magiccrit', 'aspeed' ];		var pages = data.query.pages; var exchangePageId = null; var 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]; var exchangePage = data.query.pages[exchangePageId]; var pageTitle = page.title; var pageContent = page.revisions[0]['*']; var bonusData = parseTemplate(pageContent, 'armour bonuses'); var itemData = parseTemplate(pageContent, 'infobox item'); var exchangeData = []; if (exchangePage) { var exchangeContent = exchangePage.revisions[0]['*'].replace(, ); exchangeData = parseTemplate(exchangeContent, 'exchangeitem'); }			for (var i in bonusData) { var $row = $(' '); var $th = $(' '); var $delLink = $('').attr({href: '#', title: 'Remove this row.'}).click(function {					$(this).closest('tr').fadeOut('slow', function { $(this).remove; calcTotals; } );				}); var $itemLink = $('').attr({href: 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: wgScriptPath + '/api.php',		timeout: 10000 // millisec	}); } /* */