text: ( function ( $, mw ) {
  	'use strict';
  
  	mw.thanks = {
  		// Keep track of which revisions and comments the user has already thanked for
  		thanked: {
  			maxHistory: 100,
  			cookieName: 'thanks-thanked',
  			attrName: 'data-revision-id',
  
  			load: function () {
  				var cookie = $.cookie( this.cookieName );
  				if ( cookie === null ) {
  					return [];
  				}
  				return unescape( cookie ).split( ',' );
  			},
  
  			push: function ( $thankLink ) {
  				var saved = this.load();
  				saved.push( $thankLink.attr( this.attrName ) );
  				if ( saved.length > this.maxHistory ) { // prevent forever growing
  					saved = saved.slice( saved.length - this.maxHistory );
  				}
  				$.cookie( this.cookieName, escape( saved.join( ',' ) ) );
  			},
  
  			contains: function ( $thankLink ) {
  				// $.inArray returns the index position or -1 if non-existant
  				if ( $.inArray( $thankLink.attr( this.attrName ), this.load() ) !== -1 ) {
  					return true;
  				} else {
  					return false;
  				}
  			}
  		},
  
  		/**
  		 * Retrieve user gender
  		 *
  		 * @param {string} username Requested username
  		 * @return {jQuery.Promise} A promise that resolves with the gender string, 'female', 'male', or 'unknown'
  		 */
  		getUserGender: function ( username ) {
  			return new mw.Api().get( {
  				action: 'query',
  				list: 'users',
  				ususers: username,
  				usprop: 'gender'
  			} )
  				.then(
  					function ( result ) {
  						return (
  							result.query.users[ 0 ] &&
  							result.query.users[ 0 ].gender
  						) || 'unknown';
  					},
  					function () {
  						return 'unknown';
  					}
  				);
  		}
  	};
  
  }( jQuery, mediaWiki ) );
  