<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://herocopia.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js</id>
	<title>MediaWiki:Common.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://herocopia.com/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js"/>
	<link rel="alternate" type="text/html" href="https://herocopia.com/index.php?title=MediaWiki:Common.js&amp;action=history"/>
	<updated>2026-08-31T05:50:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://herocopia.com/index.php?title=MediaWiki:Common.js&amp;diff=3266&amp;oldid=prev</id>
		<title>Infobroker: TableSorter for MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://herocopia.com/index.php?title=MediaWiki:Common.js&amp;diff=3266&amp;oldid=prev"/>
		<updated>2013-10-18T14:45:20Z</updated>

		<summary type="html">&lt;p&gt;TableSorter for MediaWiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * TableSorter for MediaWiki&lt;br /&gt;
 *&lt;br /&gt;
 * Written 2011 Leo Koppelkamm&lt;br /&gt;
 * Based on tablesorter.com plugin, written (c) 2007 Christian Bach.&lt;br /&gt;
 *&lt;br /&gt;
 * Dual licensed under the MIT and GPL licenses:&lt;br /&gt;
 * http://www.opensource.org/licenses/mit-license.php&lt;br /&gt;
 * http://www.gnu.org/licenses/gpl.html&lt;br /&gt;
 *&lt;br /&gt;
 * @depends on mw.config (wgDigitTransformTable, wgMonthNames, wgMonthNamesShort,&lt;br /&gt;
 * wgDefaultDateFormat, wgContentLanguage)&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 *&lt;br /&gt;
 * @description Create a sortable table with multi-column sorting capabilitys&lt;br /&gt;
 *&lt;br /&gt;
 * @example $( 'table' ).tablesorter();&lt;br /&gt;
 * @desc Create a simple tablesorter interface.&lt;br /&gt;
 *&lt;br /&gt;
 * @option String cssHeader ( optional ) A string of the class name to be appended&lt;br /&gt;
 *         to sortable tr elements in the thead of the table. Default value:&lt;br /&gt;
 *         &amp;quot;header&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * @option String cssAsc ( optional ) A string of the class name to be appended to&lt;br /&gt;
 *         sortable tr elements in the thead on a ascending sort. Default value:&lt;br /&gt;
 *         &amp;quot;headerSortUp&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * @option String cssDesc ( optional ) A string of the class name to be appended&lt;br /&gt;
 *         to sortable tr elements in the thead on a descending sort. Default&lt;br /&gt;
 *         value: &amp;quot;headerSortDown&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * @option String sortInitialOrder ( optional ) A string of the inital sorting&lt;br /&gt;
 *         order can be asc or desc. Default value: &amp;quot;asc&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * @option String sortMultisortKey ( optional ) A string of the multi-column sort&lt;br /&gt;
 *         key. Default value: &amp;quot;shiftKey&amp;quot;&lt;br /&gt;
 *&lt;br /&gt;
 * @option Boolean sortLocaleCompare ( optional ) Boolean flag indicating whatever&lt;br /&gt;
 *         to use String.localeCampare method or not. Set to false.&lt;br /&gt;
 *&lt;br /&gt;
 * @option Boolean cancelSelection ( optional ) Boolean flag indicating if&lt;br /&gt;
 *         tablesorter should cancel selection of the table headers text.&lt;br /&gt;
 *         Default value: true&lt;br /&gt;
 *&lt;br /&gt;
 * @option Boolean debug ( optional ) Boolean flag indicating if tablesorter&lt;br /&gt;
 *         should display debuging information usefull for development.&lt;br /&gt;
 *&lt;br /&gt;
 * @type jQuery&lt;br /&gt;
 *&lt;br /&gt;
 * @name tablesorter&lt;br /&gt;
 *&lt;br /&gt;
 * @cat Plugins/Tablesorter&lt;br /&gt;
 *&lt;br /&gt;
 * @author Christian Bach/christian.bach@polyester.se&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
( function( $ ) {&lt;br /&gt;
&lt;br /&gt;
	/* Local scope */&lt;br /&gt;
&lt;br /&gt;
	var	ts,&lt;br /&gt;
		parsers = [];&lt;br /&gt;
&lt;br /&gt;
	/* Parser utility functions */&lt;br /&gt;
&lt;br /&gt;
	function getParserById( name ) {&lt;br /&gt;
		var len = parsers.length;&lt;br /&gt;
		for ( var i = 0; i &amp;lt; len; i++ ) {&lt;br /&gt;
			if ( parsers[i].id.toLowerCase() === name.toLowerCase() ) {&lt;br /&gt;
				return parsers[i];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getElementText( node ) {&lt;br /&gt;
		var $node = $( node ),&lt;br /&gt;
			data = $node.attr( 'data-sort-value' );&lt;br /&gt;
		if ( data !== undefined ) {&lt;br /&gt;
			return data;&lt;br /&gt;
		} else {&lt;br /&gt;
			return $node.text();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getTextFromRowAndCellIndex( rows, rowIndex, cellIndex ) {&lt;br /&gt;
		if ( rows[rowIndex] &amp;amp;&amp;amp; rows[rowIndex].cells[cellIndex] ) {&lt;br /&gt;
			return $.trim( getElementText( rows[rowIndex].cells[cellIndex] ) );&lt;br /&gt;
		} else {&lt;br /&gt;
			return '';&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function detectParserForColumn( table, rows, cellIndex ) {&lt;br /&gt;
		var	l = parsers.length,&lt;br /&gt;
			nodeValue,&lt;br /&gt;
			// Start with 1 because 0 is the fallback parser&lt;br /&gt;
			i = 1,&lt;br /&gt;
			rowIndex = 0,&lt;br /&gt;
			concurrent = 0,&lt;br /&gt;
			needed = ( rows.length &amp;gt; 4 ) ? 5 : rows.length;&lt;br /&gt;
&lt;br /&gt;
		while( i &amp;lt; l ) {&lt;br /&gt;
			nodeValue = getTextFromRowAndCellIndex( rows, rowIndex, cellIndex );&lt;br /&gt;
			if ( nodeValue !== '') {&lt;br /&gt;
				if ( parsers[i].is( nodeValue, table ) ) {&lt;br /&gt;
					concurrent++;&lt;br /&gt;
					rowIndex++;&lt;br /&gt;
					if ( concurrent &amp;gt;= needed ) {&lt;br /&gt;
						// Confirmed the parser for multiple cells, let's return it&lt;br /&gt;
						return parsers[i];&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					// Check next parser, reset rows&lt;br /&gt;
					i++;&lt;br /&gt;
					rowIndex = 0;&lt;br /&gt;
					concurrent = 0;&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				// Empty cell&lt;br /&gt;
				rowIndex++;&lt;br /&gt;
				if ( rowIndex &amp;gt; rows.length ) {&lt;br /&gt;
					rowIndex = 0;&lt;br /&gt;
					i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// 0 is always the generic parser (text)&lt;br /&gt;
		return parsers[0];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildParserCache( table, $headers ) {&lt;br /&gt;
		var	rows = table.tBodies[0].rows,&lt;br /&gt;
			sortType,&lt;br /&gt;
			parsers = [];&lt;br /&gt;
&lt;br /&gt;
		if ( rows[0] ) {&lt;br /&gt;
&lt;br /&gt;
			var	cells = rows[0].cells,&lt;br /&gt;
				len = cells.length,&lt;br /&gt;
				i, parser;&lt;br /&gt;
&lt;br /&gt;
			for ( i = 0; i &amp;lt; len; i++ ) {&lt;br /&gt;
				parser = false;&lt;br /&gt;
				sortType = $headers.eq( i ).data( 'sort-type' );&lt;br /&gt;
				if ( sortType !== undefined ) {&lt;br /&gt;
					parser = getParserById( sortType );&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if ( parser === false ) {&lt;br /&gt;
					parser = detectParserForColumn( table, rows, i );&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				parsers.push( parser );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return parsers;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Other utility functions */&lt;br /&gt;
&lt;br /&gt;
	function buildCache( table ) {&lt;br /&gt;
		var	totalRows = ( table.tBodies[0] &amp;amp;&amp;amp; table.tBodies[0].rows.length ) || 0,&lt;br /&gt;
			totalCells = ( table.tBodies[0].rows[0] &amp;amp;&amp;amp; table.tBodies[0].rows[0].cells.length ) || 0,&lt;br /&gt;
			parsers = table.config.parsers,&lt;br /&gt;
			cache = {&lt;br /&gt;
				row: [],&lt;br /&gt;
				normalized: []&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
		for ( var i = 0; i &amp;lt; totalRows; ++i ) {&lt;br /&gt;
&lt;br /&gt;
			// Add the table data to main data array&lt;br /&gt;
			var	$row = $( table.tBodies[0].rows[i] ),&lt;br /&gt;
				cols = [];&lt;br /&gt;
&lt;br /&gt;
			// if this is a child row, add it to the last row's children and&lt;br /&gt;
			// continue to the next row&lt;br /&gt;
			if ( $row.hasClass( table.config.cssChildRow ) ) {&lt;br /&gt;
				cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add( $row );&lt;br /&gt;
				// go to the next for loop&lt;br /&gt;
				continue;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cache.row.push( $row );&lt;br /&gt;
&lt;br /&gt;
			for ( var j = 0; j &amp;lt; totalCells; ++j ) {&lt;br /&gt;
				cols.push( parsers[j].format( getElementText( $row[0].cells[j] ), table, $row[0].cells[j] ) );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			cols.push( cache.normalized.length ); // add position for rowCache&lt;br /&gt;
			cache.normalized.push( cols );&lt;br /&gt;
			cols = null;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return cache;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function appendToTable( table, cache ) {&lt;br /&gt;
		var	row = cache.row,&lt;br /&gt;
			normalized = cache.normalized,&lt;br /&gt;
			totalRows = normalized.length,&lt;br /&gt;
			checkCell = ( normalized[0].length - 1 ),&lt;br /&gt;
			fragment = document.createDocumentFragment();&lt;br /&gt;
&lt;br /&gt;
		for ( var i = 0; i &amp;lt; totalRows; i++ ) {&lt;br /&gt;
			var pos = normalized[i][checkCell];&lt;br /&gt;
&lt;br /&gt;
			var l = row[pos].length;&lt;br /&gt;
&lt;br /&gt;
			for ( var j = 0; j &amp;lt; l; j++ ) {&lt;br /&gt;
				fragment.appendChild( row[pos][j] );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
		table.tBodies[0].appendChild( fragment );&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Find all header rows in a thead-less table and put them in a &amp;lt;thead&amp;gt; tag.&lt;br /&gt;
	 * This only treats a row as a header row if it contains only &amp;lt;th&amp;gt;s (no &amp;lt;td&amp;gt;s)&lt;br /&gt;
	 * and if it is preceded entirely by header rows. The algorithm stops when&lt;br /&gt;
	 * it encounters the first non-header row.&lt;br /&gt;
	 * &lt;br /&gt;
	 * After this, it will look at all rows at the bottom for footer rows&lt;br /&gt;
	 * And place these in a tfoot using similar rules.&lt;br /&gt;
	 * @param $table jQuery object for a &amp;lt;table&amp;gt;&lt;br /&gt;
	 */ &lt;br /&gt;
	function emulateTHeadAndFoot( $table ) {&lt;br /&gt;
		var $rows = $table.find( '&amp;gt; tbody &amp;gt; tr' );&lt;br /&gt;
		if( !$table.get(0).tHead ) {&lt;br /&gt;
			var $thead = $( '&amp;lt;thead&amp;gt;' );&lt;br /&gt;
			$rows.each( function() {&lt;br /&gt;
				if ( $(this).children( 'td' ).length &amp;gt; 0 ) {&lt;br /&gt;
					// This row contains a &amp;lt;td&amp;gt;, so it's not a header row&lt;br /&gt;
					// Stop here&lt;br /&gt;
					return false;&lt;br /&gt;
				}&lt;br /&gt;
				$thead.append( this );&lt;br /&gt;
			} );&lt;br /&gt;
			$table.prepend( $thead );&lt;br /&gt;
		}&lt;br /&gt;
		if( !$table.get(0).tFoot ) {&lt;br /&gt;
			var $tfoot = $( '&amp;lt;tfoot&amp;gt;' );&lt;br /&gt;
			var len = $rows.length;&lt;br /&gt;
			for ( var i = len-1; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
				if( $( $rows[i] ).children( 'td' ).length &amp;gt; 0 ){&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
				$tfoot.prepend( $( $rows[i] ));&lt;br /&gt;
			} &lt;br /&gt;
			$table.append( $tfoot );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildHeaders( table, msg ) {&lt;br /&gt;
		var	maxSeen = 0,&lt;br /&gt;
			longest,&lt;br /&gt;
			realCellIndex = 0,&lt;br /&gt;
			$tableHeaders = $( 'thead:eq(0) tr', table );&lt;br /&gt;
		if ( $tableHeaders.length &amp;gt; 1 ) {&lt;br /&gt;
			$tableHeaders.each(function() {&lt;br /&gt;
				if ( this.cells.length &amp;gt; maxSeen ) {&lt;br /&gt;
					maxSeen = this.cells.length;&lt;br /&gt;
					longest = this;&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			$tableHeaders = $( longest );&lt;br /&gt;
		}&lt;br /&gt;
		$tableHeaders = $tableHeaders.children( 'th' ).each( function( index ) {&lt;br /&gt;
			this.column = realCellIndex;&lt;br /&gt;
&lt;br /&gt;
			var colspan = this.colspan;&lt;br /&gt;
			colspan = colspan ? parseInt( colspan, 10 ) : 1;&lt;br /&gt;
			realCellIndex += colspan;&lt;br /&gt;
&lt;br /&gt;
			this.order = 0;&lt;br /&gt;
			this.count = 0;&lt;br /&gt;
&lt;br /&gt;
			if ( $( this ).is( '.unsortable' ) ) {&lt;br /&gt;
				this.sortDisabled = true;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( !this.sortDisabled ) {&lt;br /&gt;
				var $th = $( this ).addClass( table.config.cssHeader ).attr( 'title', msg[1] );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// add cell to headerList&lt;br /&gt;
			table.config.headerList[index] = this;&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		return $tableHeaders;&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function isValueInArray( v, a ) {&lt;br /&gt;
		var l = a.length;&lt;br /&gt;
		for ( var i = 0; i &amp;lt; l; i++ ) {&lt;br /&gt;
			if ( a[i][0] == v ) {&lt;br /&gt;
				return true;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function setHeadersCss( table, $headers, list, css, msg ) {&lt;br /&gt;
		// Remove all header information&lt;br /&gt;
		$headers.removeClass( css[0] ).removeClass( css[1] );&lt;br /&gt;
&lt;br /&gt;
		var h = [];&lt;br /&gt;
		$headers.each( function( offset ) {&lt;br /&gt;
			if ( !this.sortDisabled ) {&lt;br /&gt;
				h[this.column] = $( this );&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		var l = list.length;&lt;br /&gt;
		for ( var i = 0; i &amp;lt; l; i++ ) {&lt;br /&gt;
			h[ list[i][0] ].addClass( css[ list[i][1] ] ).attr( 'title', msg[ list[i][1] ] );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function sortText( a, b ) {&lt;br /&gt;
		return ( (a &amp;lt; b) ? false : ((a &amp;gt; b) ? true : 0) );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function sortTextDesc( a, b ) {&lt;br /&gt;
		return ( (b &amp;lt; a) ? false : ((b &amp;gt; a) ? true : 0) );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function checkSorting( array1, array2, sortList ) {&lt;br /&gt;
		var col, fn, ret;&lt;br /&gt;
		for ( var i = 0, len = sortList.length; i &amp;lt; len; i++ ) {&lt;br /&gt;
			col = sortList[i][0];&lt;br /&gt;
			fn = ( sortList[i][1] ) ? sortTextDesc : sortText;&lt;br /&gt;
			ret = fn.call( this, array1[col], array2[col] );&lt;br /&gt;
			if ( ret !== 0 ) {&lt;br /&gt;
				return ret;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Merge sort algorithm&lt;br /&gt;
	// Based on http://en.literateprograms.org/Merge_sort_(JavaScript)&lt;br /&gt;
	function mergeSortHelper( array, begin, beginRight, end, sortList ) {&lt;br /&gt;
		for ( ; begin &amp;lt; beginRight; ++begin ) {&lt;br /&gt;
			if ( checkSorting( array[begin], array[beginRight], sortList ) ) {&lt;br /&gt;
				var v = array[begin];&lt;br /&gt;
				array[begin] = array[beginRight];&lt;br /&gt;
				var begin2 = beginRight;&lt;br /&gt;
				while ( begin2 + 1 &amp;lt; end &amp;amp;&amp;amp; checkSorting( v, array[begin2 + 1], sortList ) ) {&lt;br /&gt;
					var tmp = array[begin2];&lt;br /&gt;
					array[begin2] = array[begin2 + 1];&lt;br /&gt;
					array[begin2 + 1] = tmp;&lt;br /&gt;
					++begin2;&lt;br /&gt;
				}&lt;br /&gt;
				array[begin2] = v;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function mergeSort(array, begin, end, sortList) {&lt;br /&gt;
		var size = end - begin;&lt;br /&gt;
		if ( size &amp;lt; 2 ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var beginRight = begin + Math.floor(size / 2);&lt;br /&gt;
&lt;br /&gt;
		mergeSort( array, begin, beginRight, sortList );&lt;br /&gt;
		mergeSort( array, beginRight, end, sortList );&lt;br /&gt;
		mergeSortHelper( array, begin, beginRight, end, sortList );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function multisort( table, sortList, cache ) {&lt;br /&gt;
		var i = sortList.length;&lt;br /&gt;
		mergeSort( cache.normalized, 0, cache.normalized.length, sortList );&lt;br /&gt;
&lt;br /&gt;
		return cache;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildTransformTable() {&lt;br /&gt;
		var digits = '0123456789,.'.split( '' );&lt;br /&gt;
		var separatorTransformTable = mw.config.get( 'wgSeparatorTransformTable' );&lt;br /&gt;
		var digitTransformTable = mw.config.get( 'wgDigitTransformTable' );&lt;br /&gt;
		if ( separatorTransformTable === null || ( separatorTransformTable[0] === '' &amp;amp;&amp;amp; digitTransformTable[2] === '' ) ) {&lt;br /&gt;
			ts.transformTable = false;&lt;br /&gt;
		} else {&lt;br /&gt;
			ts.transformTable = {};&lt;br /&gt;
&lt;br /&gt;
			// Unpack the transform table&lt;br /&gt;
			var ascii = separatorTransformTable[0].split( &amp;quot;\t&amp;quot; ).concat( digitTransformTable[0].split( &amp;quot;\t&amp;quot; ) );&lt;br /&gt;
			var localised = separatorTransformTable[1].split( &amp;quot;\t&amp;quot; ).concat( digitTransformTable[1].split( &amp;quot;\t&amp;quot; ) );&lt;br /&gt;
&lt;br /&gt;
			// Construct regex for number identification&lt;br /&gt;
			for ( var i = 0; i &amp;lt; ascii.length; i++ ) {&lt;br /&gt;
				ts.transformTable[localised[i]] = ascii[i];&lt;br /&gt;
				digits.push( $.escapeRE( localised[i] ) );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		var digitClass = '[' + digits.join( '', digits ) + ']';&lt;br /&gt;
&lt;br /&gt;
		// We allow a trailing percent sign, which we just strip. This works fine&lt;br /&gt;
		// if percents and regular numbers aren't being mixed.&lt;br /&gt;
		ts.numberRegex = new RegExp(&amp;quot;^(&amp;quot; + &amp;quot;[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?&amp;quot; + // Fortran-style scientific&lt;br /&gt;
		&amp;quot;|&amp;quot; + &amp;quot;[-+\u2212]?&amp;quot; + digitClass + &amp;quot;+[\\s\\xa0]*%?&amp;quot; + // Generic localised&lt;br /&gt;
		&amp;quot;)$&amp;quot;, &amp;quot;i&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildDateTable() {&lt;br /&gt;
		var regex = [];&lt;br /&gt;
		ts.monthNames = [&lt;br /&gt;
			[],&lt;br /&gt;
			[]&lt;br /&gt;
		];&lt;br /&gt;
&lt;br /&gt;
		for ( var i = 1; i &amp;lt; 13; i++ ) {&lt;br /&gt;
			ts.monthNames[0][i] = mw.config.get( 'wgMonthNames' )[i].toLowerCase();&lt;br /&gt;
			ts.monthNames[1][i] = mw.config.get( 'wgMonthNamesShort' )[i].toLowerCase().replace( '.', '' );&lt;br /&gt;
			regex.push( $.escapeRE( ts.monthNames[0][i] ) );&lt;br /&gt;
			regex.push( $.escapeRE( ts.monthNames[1][i] ) );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Build piped string&lt;br /&gt;
		regex = regex.join( '|' );&lt;br /&gt;
&lt;br /&gt;
		// Build RegEx&lt;br /&gt;
		// Any date formated with . , ' - or /&lt;br /&gt;
		ts.dateRegex[0] = new RegExp( /^\s*\d{1,2}[\,\.\-\/'\s]{1,2}\d{1,2}[\,\.\-\/'\s]{1,2}\d{2,4}\s*?/i);&lt;br /&gt;
&lt;br /&gt;
		// Written Month name, dmy&lt;br /&gt;
		ts.dateRegex[1] = new RegExp( '^\\s*\\d{1,2}[\\,\\.\\-\\/\'\\s]*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*\\d{2,4}\\s*$', 'i' );&lt;br /&gt;
&lt;br /&gt;
		// Written Month name, mdy&lt;br /&gt;
		ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*\\d{1,2}[\\,\\.\\-\\/\'\\s]*\\d{2,4}\\s*$', 'i' );&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function explodeRowspans( $table ) {&lt;br /&gt;
		// Split multi row cells into multiple cells with the same content&lt;br /&gt;
		$table.find( '&amp;gt; tbody &amp;gt; tr &amp;gt; [rowspan]' ).each(function() {&lt;br /&gt;
			var rowSpan = this.rowSpan;&lt;br /&gt;
			this.rowSpan = 1;&lt;br /&gt;
			var cell = $( this );&lt;br /&gt;
			var next = cell.parent().nextAll();&lt;br /&gt;
			for ( var i = 0; i &amp;lt; rowSpan - 1; i++ ) {&lt;br /&gt;
				var td = next.eq( i ).children( 'td' );&lt;br /&gt;
				if ( !td.length ) {&lt;br /&gt;
					next.eq( i ).append( cell.clone() );&lt;br /&gt;
				} else if ( this.cellIndex === 0 ) {&lt;br /&gt;
					td.eq( this.cellIndex ).before( cell.clone() );&lt;br /&gt;
				} else {&lt;br /&gt;
					td.eq( this.cellIndex - 1 ).after( cell.clone() );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildCollationTable() {&lt;br /&gt;
		ts.collationTable = mw.config.get( 'tableSorterCollation' );&lt;br /&gt;
		ts.collationRegex = null;&lt;br /&gt;
		if ( ts.collationTable ) {&lt;br /&gt;
			var keys = [];&lt;br /&gt;
&lt;br /&gt;
			// Build array of key names&lt;br /&gt;
			for ( var key in ts.collationTable ) {&lt;br /&gt;
				if ( ts.collationTable.hasOwnProperty(key) ) { //to be safe&lt;br /&gt;
					keys.push(key);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			if (keys.length) {&lt;br /&gt;
				ts.collationRegex = new RegExp( '[' + keys.join( '' ) + ']', 'ig' );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function cacheRegexs() {&lt;br /&gt;
		if ( ts.rgx ) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		ts.rgx = {&lt;br /&gt;
			IPAddress: [&lt;br /&gt;
				new RegExp( /^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$/)&lt;br /&gt;
			],&lt;br /&gt;
			currency: [&lt;br /&gt;
				new RegExp( /^[Â£$â‚¬?.]/),&lt;br /&gt;
				new RegExp( /[Â£$â‚¬]/g)&lt;br /&gt;
			],&lt;br /&gt;
			url: [&lt;br /&gt;
				new RegExp( /^(https?|ftp|file):\/\/$/),&lt;br /&gt;
				new RegExp( /(https?|ftp|file):\/\//)&lt;br /&gt;
			],&lt;br /&gt;
			isoDate: [&lt;br /&gt;
				new RegExp( /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/)&lt;br /&gt;
			],&lt;br /&gt;
			usLongDate: [&lt;br /&gt;
				new RegExp( /^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)&lt;br /&gt;
			],&lt;br /&gt;
			time: [&lt;br /&gt;
				new RegExp( /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/)&lt;br /&gt;
			]&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Public scope */&lt;br /&gt;
&lt;br /&gt;
	$.tablesorter = {&lt;br /&gt;
&lt;br /&gt;
			defaultOptions: {&lt;br /&gt;
				cssHeader: 'headerSort',&lt;br /&gt;
				cssAsc: 'headerSortUp',&lt;br /&gt;
				cssDesc: 'headerSortDown',&lt;br /&gt;
				cssChildRow: 'expand-child',&lt;br /&gt;
				sortInitialOrder: 'asc',&lt;br /&gt;
				sortMultiSortKey: 'shiftKey',&lt;br /&gt;
				sortLocaleCompare: false,&lt;br /&gt;
				parsers: {},&lt;br /&gt;
				widgets: [],&lt;br /&gt;
				headers: {},&lt;br /&gt;
				cancelSelection: true,&lt;br /&gt;
				sortList: [],&lt;br /&gt;
				headerList: [],&lt;br /&gt;
				selectorHeaders: 'thead tr:eq(0) th',&lt;br /&gt;
				debug: false&lt;br /&gt;
			},&lt;br /&gt;
&lt;br /&gt;
			dateRegex: [],&lt;br /&gt;
			monthNames: [],&lt;br /&gt;
&lt;br /&gt;
			/**&lt;br /&gt;
			 * @param $tables {jQuery}&lt;br /&gt;
			 * @param settings {Object} (optional)&lt;br /&gt;
			 */&lt;br /&gt;
			construct: function( $tables, settings ) {&lt;br /&gt;
				return $tables.each( function( i, table ) {&lt;br /&gt;
					// Declare and cache.&lt;br /&gt;
					var	$document, $headers, cache, config, sortOrder,&lt;br /&gt;
						$table = $( table ),&lt;br /&gt;
						shiftDown = 0,&lt;br /&gt;
						firstTime = true;&lt;br /&gt;
&lt;br /&gt;
					// Quit if no tbody&lt;br /&gt;
					if ( !table.tBodies ) {&lt;br /&gt;
						return;&lt;br /&gt;
					}&lt;br /&gt;
					if ( !table.tHead ) {&lt;br /&gt;
						// No thead found. Look for rows with &amp;lt;th&amp;gt;s and&lt;br /&gt;
						// move them into a &amp;lt;thead&amp;gt; tag or a &amp;lt;tfoot&amp;gt; tag&lt;br /&gt;
						emulateTHeadAndFoot( $table );&lt;br /&gt;
						&lt;br /&gt;
						// Still no thead? Then quit&lt;br /&gt;
						if ( !table.tHead ) {&lt;br /&gt;
							return;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					$table.addClass( &amp;quot;jquery-tablesorter&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
					// New config object.&lt;br /&gt;
					table.config = {};&lt;br /&gt;
&lt;br /&gt;
					// Merge and extend.&lt;br /&gt;
					config = $.extend( table.config, $.tablesorter.defaultOptions, settings );&lt;br /&gt;
&lt;br /&gt;
					// Save the settings where they read&lt;br /&gt;
					$.data( table, 'tablesorter', config );&lt;br /&gt;
&lt;br /&gt;
					// Get the CSS class names, could be done else where.&lt;br /&gt;
					var sortCSS = [ config.cssDesc, config.cssAsc ];&lt;br /&gt;
					var sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];&lt;br /&gt;
&lt;br /&gt;
					// Build headers&lt;br /&gt;
					$headers = buildHeaders( table, sortMsg );&lt;br /&gt;
&lt;br /&gt;
					// Grab and process locale settings&lt;br /&gt;
					buildTransformTable();&lt;br /&gt;
					buildDateTable();&lt;br /&gt;
					buildCollationTable();&lt;br /&gt;
&lt;br /&gt;
					// Precaching regexps can bring 10 fold&lt;br /&gt;
					// performance improvements in some browsers.&lt;br /&gt;
					cacheRegexs();&lt;br /&gt;
&lt;br /&gt;
					// Apply event handling to headers&lt;br /&gt;
					// this is too big, perhaps break it out?&lt;br /&gt;
					$headers.click( function( e ) {&lt;br /&gt;
						if ( e.target.nodeName.toLowerCase() == 'a' ) {&lt;br /&gt;
							// The user clicked on a link inside a table header&lt;br /&gt;
							// Do nothing and let the default link click action continue&lt;br /&gt;
							return true;&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
						if ( firstTime ) {&lt;br /&gt;
							firstTime = false;&lt;br /&gt;
							&lt;br /&gt;
							// Legacy fix of .sortbottoms&lt;br /&gt;
							// Wrap them inside inside a tfoot (because that's what they actually want to be) &amp;amp;&lt;br /&gt;
							// and put the &amp;lt;tfoot&amp;gt; at the end of the &amp;lt;table&amp;gt;&lt;br /&gt;
							var $sortbottoms = $table.find( '&amp;gt; tbody &amp;gt; tr.sortbottom' );&lt;br /&gt;
							if ( $sortbottoms.length ) {&lt;br /&gt;
								var $tfoot = $table.children( 'tfoot' );&lt;br /&gt;
								if ( $tfoot.length ) {&lt;br /&gt;
									$tfoot.eq(0).prepend( $sortbottoms );&lt;br /&gt;
								} else {&lt;br /&gt;
									$table.append( $( '&amp;lt;tfoot&amp;gt;' ).append( $sortbottoms ) )&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
							&lt;br /&gt;
							explodeRowspans( $table );&lt;br /&gt;
							// try to auto detect column type, and store in tables config&lt;br /&gt;
							table.config.parsers = buildParserCache( table, $headers );&lt;br /&gt;
							// build the cache for the tbody cells&lt;br /&gt;
							cache = buildCache( table );&lt;br /&gt;
						}&lt;br /&gt;
						var totalRows = ( $table[0].tBodies[0] &amp;amp;&amp;amp; $table[0].tBodies[0].rows.length ) || 0;&lt;br /&gt;
						if ( !table.sortDisabled &amp;amp;&amp;amp; totalRows &amp;gt; 0 ) {&lt;br /&gt;
&lt;br /&gt;
							// Cache jQuery object&lt;br /&gt;
							var $cell = $( this );&lt;br /&gt;
&lt;br /&gt;
							// Get current column index&lt;br /&gt;
							var i = this.column;&lt;br /&gt;
&lt;br /&gt;
							// Get current column sort order&lt;br /&gt;
							this.order = this.count % 2;&lt;br /&gt;
							this.count++;&lt;br /&gt;
&lt;br /&gt;
							// User only wants to sort on one column&lt;br /&gt;
							if ( !e[config.sortMultiSortKey] ) {&lt;br /&gt;
								// Flush the sort list&lt;br /&gt;
								config.sortList = [];&lt;br /&gt;
								// Add column to sort list&lt;br /&gt;
								config.sortList.push( [i, this.order] );&lt;br /&gt;
&lt;br /&gt;
							// Multi column sorting&lt;br /&gt;
							} else {&lt;br /&gt;
								// The user has clicked on an already sorted column.&lt;br /&gt;
								if ( isValueInArray( i, config.sortList ) ) {&lt;br /&gt;
									// Reverse the sorting direction for all tables.&lt;br /&gt;
									for ( var j = 0; j &amp;lt; config.sortList.length; j++ ) {&lt;br /&gt;
										var s = config.sortList[j],&lt;br /&gt;
											o = config.headerList[s[0]];&lt;br /&gt;
										if ( s[0] == i ) {&lt;br /&gt;
											o.count = s[1];&lt;br /&gt;
											o.count++;&lt;br /&gt;
											s[1] = o.count % 2;&lt;br /&gt;
										}&lt;br /&gt;
									}&lt;br /&gt;
								} else {&lt;br /&gt;
									// Add column to sort list array&lt;br /&gt;
									config.sortList.push( [i, this.order] );&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
&lt;br /&gt;
							// Set CSS for headers&lt;br /&gt;
							setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg );&lt;br /&gt;
							appendToTable(&lt;br /&gt;
								$table[0], multisort( $table[0], config.sortList, cache )&lt;br /&gt;
							);&lt;br /&gt;
&lt;br /&gt;
							// Stop normal event by returning false&lt;br /&gt;
							return false;&lt;br /&gt;
						}&lt;br /&gt;
&lt;br /&gt;
					// Cancel selection&lt;br /&gt;
					} ).mousedown( function() {&lt;br /&gt;
						if ( config.cancelSelection ) {&lt;br /&gt;
							this.onselectstart = function() {&lt;br /&gt;
								return false;&lt;br /&gt;
							};&lt;br /&gt;
							return false;&lt;br /&gt;
						}&lt;br /&gt;
					} );&lt;br /&gt;
				} );&lt;br /&gt;
			},&lt;br /&gt;
&lt;br /&gt;
			addParser: function( parser ) {&lt;br /&gt;
				var	l = parsers.length,&lt;br /&gt;
					a = true;&lt;br /&gt;
				for ( var i = 0; i &amp;lt; l; i++ ) {&lt;br /&gt;
					if ( parsers[i].id.toLowerCase() == parser.id.toLowerCase() ) {&lt;br /&gt;
						a = false;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if ( a ) {&lt;br /&gt;
					parsers.push( parser );&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
&lt;br /&gt;
			formatDigit: function( s ) {&lt;br /&gt;
				if ( ts.transformTable !== false ) {&lt;br /&gt;
					var	out = '',&lt;br /&gt;
						c;&lt;br /&gt;
					for ( var p = 0; p &amp;lt; s.length; p++ ) {&lt;br /&gt;
						c = s.charAt(p);&lt;br /&gt;
						if ( c in ts.transformTable ) {&lt;br /&gt;
							out += ts.transformTable[c];&lt;br /&gt;
						} else {&lt;br /&gt;
							out += c;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					s = out;&lt;br /&gt;
				}&lt;br /&gt;
				var i = parseFloat( s.replace( /[, ]/g, '' ).replace( &amp;quot;\u2212&amp;quot;, '-' ) );&lt;br /&gt;
				return ( isNaN(i)) ? 0 : i;&lt;br /&gt;
			},&lt;br /&gt;
&lt;br /&gt;
			formatFloat: function( s ) {&lt;br /&gt;
				var i = parseFloat(s);&lt;br /&gt;
				return ( isNaN(i)) ? 0 : i;&lt;br /&gt;
			},&lt;br /&gt;
&lt;br /&gt;
			formatInt: function( s ) {&lt;br /&gt;
				var i = parseInt( s, 10 );&lt;br /&gt;
				return ( isNaN(i)) ? 0 : i;&lt;br /&gt;
			},&lt;br /&gt;
&lt;br /&gt;
			clearTableBody: function( table ) {&lt;br /&gt;
				if ( $.browser.msie ) {&lt;br /&gt;
					var empty = function( el ) {&lt;br /&gt;
						while ( el.firstChild ) {&lt;br /&gt;
							el.removeChild( el.firstChild );&lt;br /&gt;
						}&lt;br /&gt;
					};&lt;br /&gt;
					empty( table.tBodies[0] );&lt;br /&gt;
				} else {&lt;br /&gt;
					table.tBodies[0].innerHTML = '';&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
	// Shortcut&lt;br /&gt;
	ts = $.tablesorter;&lt;br /&gt;
&lt;br /&gt;
	// Register as jQuery prototype method&lt;br /&gt;
	$.fn.tablesorter = function( settings ) {&lt;br /&gt;
		return ts.construct( this, settings );&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// Add default parsers&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'text',&lt;br /&gt;
		is: function( s ) {&lt;br /&gt;
			return true;&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s ) {&lt;br /&gt;
			s = $.trim( s.toLowerCase() );&lt;br /&gt;
			if ( ts.collationRegex ) {&lt;br /&gt;
				var tsc = ts.collationTable;&lt;br /&gt;
				s = s.replace( ts.collationRegex, function( match ) {&lt;br /&gt;
					var r = tsc[match] ? tsc[match] : tsc[match.toUpperCase()];&lt;br /&gt;
					return r.toLowerCase();&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
			return s;&lt;br /&gt;
		},&lt;br /&gt;
		type: 'text'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'IPAddress',&lt;br /&gt;
		is: function( s ) {&lt;br /&gt;
			return ts.rgx.IPAddress[0].test(s);&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s ) {&lt;br /&gt;
			var	a = s.split( '.' ),&lt;br /&gt;
				r = '',&lt;br /&gt;
				l = a.length;&lt;br /&gt;
			for ( var i = 0; i &amp;lt; l; i++ ) {&lt;br /&gt;
				var item = a[i];&lt;br /&gt;
				if ( item.length == 1 ) {&lt;br /&gt;
					r += '00' + item;&lt;br /&gt;
				} else if ( item.length == 2 ) {&lt;br /&gt;
					r += '0' + item;&lt;br /&gt;
				} else {&lt;br /&gt;
					r += item;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			return $.tablesorter.formatFloat(r);&lt;br /&gt;
		},&lt;br /&gt;
		type: 'numeric'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'currency',&lt;br /&gt;
		is: function( s ) {&lt;br /&gt;
			return ts.rgx.currency[0].test(s);&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s ) {&lt;br /&gt;
			return $.tablesorter.formatDigit( s.replace( ts.rgx.currency[1], '' ) );&lt;br /&gt;
		},&lt;br /&gt;
		type: 'numeric'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'url',&lt;br /&gt;
		is: function( s ) {&lt;br /&gt;
			return ts.rgx.url[0].test(s);&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s ) {&lt;br /&gt;
			return $.trim( s.replace( ts.rgx.url[1], '' ) );&lt;br /&gt;
		},&lt;br /&gt;
		type: 'text'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'isoDate',&lt;br /&gt;
		is: function( s ) {&lt;br /&gt;
			return ts.rgx.isoDate[0].test(s);&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s ) {&lt;br /&gt;
			return $.tablesorter.formatFloat((s !== '') ? new Date(s.replace(&lt;br /&gt;
			new RegExp( /-/g), '/')).getTime() : '0' );&lt;br /&gt;
		},&lt;br /&gt;
		type: 'numeric'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'usLongDate',&lt;br /&gt;
		is: function( s ) {&lt;br /&gt;
			return ts.rgx.usLongDate[0].test(s);&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s ) {&lt;br /&gt;
			return $.tablesorter.formatFloat( new Date(s).getTime() );&lt;br /&gt;
		},&lt;br /&gt;
		type: 'numeric'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'date',&lt;br /&gt;
		is: function( s ) {&lt;br /&gt;
			return ( ts.dateRegex[0].test(s) || ts.dateRegex[1].test(s) || ts.dateRegex[2].test(s ));&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s, table ) {&lt;br /&gt;
			s = $.trim( s.toLowerCase() );&lt;br /&gt;
&lt;br /&gt;
			for ( var i = 1, j = 0; i &amp;lt; 13 &amp;amp;&amp;amp; j &amp;lt; 2; i++ ) {&lt;br /&gt;
				s = s.replace( ts.monthNames[j][i], i );&lt;br /&gt;
				if ( i == 12 ) {&lt;br /&gt;
					j++;&lt;br /&gt;
					i = 0;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			s = s.replace( /[\-\.\,' ]/g, '/' );&lt;br /&gt;
&lt;br /&gt;
			// Replace double slashes&lt;br /&gt;
			s = s.replace( /\/\//g, '/' );&lt;br /&gt;
			s = s.replace( /\/\//g, '/' );&lt;br /&gt;
			s = s.split( '/' );&lt;br /&gt;
&lt;br /&gt;
			// Pad Month and Day&lt;br /&gt;
			if ( s[0] &amp;amp;&amp;amp; s[0].length == 1 ) {&lt;br /&gt;
				s[0] = '0' + s[0];&lt;br /&gt;
			}&lt;br /&gt;
			if ( s[1] &amp;amp;&amp;amp; s[1].length == 1 ) {&lt;br /&gt;
				s[1] = '0' + s[1];&lt;br /&gt;
			}&lt;br /&gt;
			var y;&lt;br /&gt;
&lt;br /&gt;
			if ( !s[2] ) {&lt;br /&gt;
				// Fix yearless dates&lt;br /&gt;
				s[2] = 2000;&lt;br /&gt;
			} else if ( ( y = parseInt( s[2], 10) ) &amp;lt; 100 ) {&lt;br /&gt;
				// Guestimate years without centuries&lt;br /&gt;
				if ( y &amp;lt; 30 ) {&lt;br /&gt;
					s[2] = 2000 + y;&lt;br /&gt;
				} else {&lt;br /&gt;
					s[2] = 1900 + y;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			// Resort array depending on preferences&lt;br /&gt;
			if ( mw.config.get( 'wgDefaultDateFormat' ) == 'mdy' || mw.config.get( 'wgContentLanguage' ) == 'en' ) {&lt;br /&gt;
				s.push( s.shift() );&lt;br /&gt;
				s.push( s.shift() );&lt;br /&gt;
			} else if ( mw.config.get( 'wgDefaultDateFormat' ) == 'dmy' ) {&lt;br /&gt;
				var d = s.shift();&lt;br /&gt;
				s.push( s.shift() );&lt;br /&gt;
				s.push(d);&lt;br /&gt;
			}&lt;br /&gt;
			return parseInt( s.join( '' ), 10 );&lt;br /&gt;
		},&lt;br /&gt;
		type: 'numeric'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'time',&lt;br /&gt;
		is: function( s ) {&lt;br /&gt;
			return ts.rgx.time[0].test(s);&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s ) {&lt;br /&gt;
			return $.tablesorter.formatFloat( new Date( '2000/01/01 ' + s ).getTime() );&lt;br /&gt;
		},&lt;br /&gt;
		type: 'numeric'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
	ts.addParser( {&lt;br /&gt;
		id: 'number',&lt;br /&gt;
		is: function( s, table ) {&lt;br /&gt;
			return $.tablesorter.numberRegex.test( $.trim( s ));&lt;br /&gt;
		},&lt;br /&gt;
		format: function( s ) {&lt;br /&gt;
			return $.tablesorter.formatDigit(s);&lt;br /&gt;
		},&lt;br /&gt;
		type: 'numeric'&lt;br /&gt;
	} );&lt;br /&gt;
&lt;br /&gt;
} )( jQuery );&lt;/div&gt;</summary>
		<author><name>Infobroker</name></author>
		
	</entry>
</feed>