<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://eurovision.jobogamer.xyz/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-addMe.js</id>
	<title>MediaWiki:Gadget-addMe.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://eurovision.jobogamer.xyz/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-addMe.js"/>
	<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-addMe.js&amp;action=history"/>
	<updated>2026-05-23T08:13:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-addMe.js&amp;diff=291&amp;oldid=prev</id>
		<title>Alfie: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-addMe.js&amp;diff=291&amp;oldid=prev"/>
		<updated>2026-03-19T09:58:34Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:58, 19 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Alfie</name></author>
	</entry>
	<entry>
		<id>https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-addMe.js&amp;diff=290&amp;oldid=prev</id>
		<title>en&gt;Krinkle: Maintenance: mw:RL/MGU - Updated deprecated module name</title>
		<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-addMe.js&amp;diff=290&amp;oldid=prev"/>
		<updated>2019-10-25T16:38:17Z</updated>

		<summary type="html">&lt;p&gt;Maintenance: &lt;a href=&quot;https://www.mediawiki.org/wiki/RL/MGU&quot; class=&quot;extiw&quot; title=&quot;mw:RL/MGU&quot;&gt;mw:RL/MGU&lt;/a&gt; - Updated deprecated module name&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*  ______________________________________________________________________________________&lt;br /&gt;
 * |                                                                                     |&lt;br /&gt;
 * |                    === WARNING: GADGET FILE ===                                     |&lt;br /&gt;
 * |                  Changes to this page affect many users.                            |&lt;br /&gt;
 * | Please discuss changes on the talk page or on [[MediaWiki_talk:Gadgets-definition]] |&lt;br /&gt;
 * |	 before editing.                                                                 |&lt;br /&gt;
 * |_____________________________________________________________________________________|&lt;br /&gt;
 *&lt;br /&gt;
 * &amp;quot;Endorse &amp;amp; Join&amp;quot; feature, to be used by the Wikimedia Foundation&amp;#039;s Grants Programme&lt;br /&gt;
 */&lt;br /&gt;
//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//The stylesheet with all the styles for the endorse &amp;amp; the join gadget&lt;br /&gt;
mw.loader.load( &amp;#039;//meta.wikimedia.org/w/index.php?title=MediaWiki:Gadget-addMe.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;#039;, &amp;#039;text/css&amp;#039; );&lt;br /&gt;
/*&lt;br /&gt;
 * Common utilities for both the endorse &amp;amp; the join gadget&lt;br /&gt;
 */&lt;br /&gt;
var gadgetUtilities = function (){&lt;br /&gt;
	//A reference to the object&lt;br /&gt;
	var that = this;&lt;br /&gt;
	//The mw wrapper to access the API&lt;br /&gt;
	var api = new mw.Api();&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 * The interface messages or strings are maintained in interfaceMessagesPath &amp;amp; config values eg, &lt;br /&gt;
	 * section-header, the section where the comments are added etc are maintained in configPath&lt;br /&gt;
	 */&lt;br /&gt;
	this.interfaceMessagesPath = &amp;#039;MediaWiki:Gadget-addMe/InterfaceText&amp;#039;;&lt;br /&gt;
	this.configPath = &amp;#039;MediaWiki:Gadget-addMe/Config&amp;#039;;&lt;br /&gt;
	&lt;br /&gt;
	//The time taken for the page to scroll to the feedback speech bubble (milliseconds)&lt;br /&gt;
	this.feedbackScrollTime = 2000;&lt;br /&gt;
	&lt;br /&gt;
	//The time taken for the feedback speech bubble to disappear (milliseconds)&lt;br /&gt;
	this.feedbackDisappearDelay = 10000;&lt;br /&gt;
	/*&lt;br /&gt;
	 * This function is used to set a cookie to show the speech bubble&lt;br /&gt;
	 * on page reload&lt;br /&gt;
	 */&lt;br /&gt;
	this.setFeedbackCookie = function(value){&lt;br /&gt;
		$.cookie(value,true);&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * This function is used to check if a has been set by the above function &lt;br /&gt;
	 * to show the speech bubble on page reload&lt;br /&gt;
	 */&lt;br /&gt;
	this.checkFeedbackCookie = function(value){&lt;br /&gt;
		if($.cookie(value)){&lt;br /&gt;
			$.cookie(value,null);&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * To display an error message when an error occurs&lt;br /&gt;
	 * in the gadget &lt;br /&gt;
	 */&lt;br /&gt;
	this.showErrorMessage =  function(gadget,type){&lt;br /&gt;
		var errorAttr = &amp;#039;[localize=error-&amp;#039;+type+&amp;#039;]&amp;#039;;&lt;br /&gt;
		var gadgetID = &amp;#039;.&amp;#039;+gadget;&lt;br /&gt;
		$(gadgetID + &amp;#039; &amp;#039; + errorAttr).show();&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * To remove the error message displayed by the above function &lt;br /&gt;
	 */&lt;br /&gt;
	this.removeErrorMessage = function(gadget){&lt;br /&gt;
		var gadgetID = &amp;#039;.&amp;#039;+gadget;&lt;br /&gt;
		$(gadgetID + &amp;#039; [localize^=&amp;quot;error-&amp;quot;]&amp;#039;).hide();&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * To detect the type of grant. IEG,PEG etc&lt;br /&gt;
	 */&lt;br /&gt;
	this.grantType = function(config){&lt;br /&gt;
		var grant = mw.config.get(&amp;#039;wgTitle&amp;#039;).split(&amp;#039;/&amp;#039;)[0].replace(/ /g,&amp;#039;_&amp;#039;);&lt;br /&gt;
		if (grant in config){&lt;br /&gt;
			return config[grant];&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			return config[&amp;#039;default&amp;#039;];&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * To detect the users default language&lt;br /&gt;
	 */&lt;br /&gt;
	this.userLanguage = function(){&lt;br /&gt;
		return mw.config.get(&amp;#039;wgUserLanguage&amp;#039;);&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * To detect the language of the page&lt;br /&gt;
	 */&lt;br /&gt;
	this.contentLanguage = function(){&lt;br /&gt;
		return mw.config.get(&amp;#039;wgContentLanguage&amp;#039;);&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * To remove extra spaces &amp;amp; cleanup the comment string&lt;br /&gt;
	 */&lt;br /&gt;
	this.cleanupText = function(text){&lt;br /&gt;
			text = $.trim(text)+&amp;#039; &amp;#039;;&lt;br /&gt;
			var indexOf = text.indexOf(&amp;#039;~~~~&amp;#039;);&lt;br /&gt;
			if ( indexOf == -1 ){&lt;br /&gt;
				return text;&lt;br /&gt;
			}&lt;br /&gt;
			else{&lt;br /&gt;
				return text.slice(0,indexOf)+text.slice(indexOf+4);&lt;br /&gt;
			}	&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * The config files which can be translated with the help of the &lt;br /&gt;
	 * translation tool generates the dict with the values having a &lt;br /&gt;
	 * lot of space in the key value pairs. This function strips the &lt;br /&gt;
	 * whitespace.&lt;br /&gt;
	 */&lt;br /&gt;
	this.stripWhiteSpace = function(dict){&lt;br /&gt;
		for (key in dict){&lt;br /&gt;
			//Temp fix for section header&lt;br /&gt;
			if(key == &amp;#039;section-header&amp;#039;){&lt;br /&gt;
				dict[&amp;#039;section-header-read&amp;#039;] = dict[key].replace(/ /g,&amp;#039;_&amp;#039;);&lt;br /&gt;
				dict[&amp;#039;section-header-write&amp;#039;] = dict[key];&lt;br /&gt;
			}&lt;br /&gt;
			dict[key] = typeof(dict[key]) == &amp;#039;object&amp;#039; ? that.stripWhiteSpace(dict[key]) : $.trim(dict[key]);&lt;br /&gt;
		}&lt;br /&gt;
		return dict;&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * The function creates the markup for the link to a &lt;br /&gt;
	 * user&amp;#039;s user page&lt;br /&gt;
	 */&lt;br /&gt;
	this.addToInfobox = function(username){&lt;br /&gt;
		return username;&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * To localize the gadget&amp;#039;s interface messages based on the user&amp;#039;s language setting&lt;br /&gt;
	 */&lt;br /&gt;
	this.localizeGadget = function (gadgetClass,localizeDict){&lt;br /&gt;
		$(gadgetClass+&amp;#039; [localize]&amp;#039;).each(function(){&lt;br /&gt;
			var localizeValue = localizeDict[$(this).attr(&amp;#039;localize&amp;#039;)];&lt;br /&gt;
			if($(this).attr(&amp;#039;value&amp;#039;)){&lt;br /&gt;
				$(this).attr(&amp;#039;value&amp;#039;,localizeValue);&lt;br /&gt;
			}&lt;br /&gt;
			else if($(this).attr(&amp;#039;placeholder&amp;#039;)){&lt;br /&gt;
				$(this).attr(&amp;#039;placeholder&amp;#039;,localizeValue);&lt;br /&gt;
			}&lt;br /&gt;
			else if($(this).attr(&amp;#039;data-placeholder&amp;#039;)){&lt;br /&gt;
				$(this).attr(&amp;#039;data-placeholder&amp;#039;,localizeValue);&lt;br /&gt;
			}&lt;br /&gt;
			else{&lt;br /&gt;
				$(this).html(localizeValue);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * This function show the feedback speech bubble after an &lt;br /&gt;
	 * endorsement has been made or after joining a project&lt;br /&gt;
	 */&lt;br /&gt;
	this.showFeedback = function(config,InterfaceMessages){&lt;br /&gt;
		var li = $(&amp;#039;#&amp;#039;+config[&amp;#039;section-header-read&amp;#039;]).parent().next().find(&amp;#039;li&amp;#039;).eq(-1);&lt;br /&gt;
		speechBubble = li.append($(&amp;#039;&amp;lt;div class=&amp;quot;grantsSpeechBubbleContainer&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;).html(&amp;#039;&amp;lt;div class=&amp;quot;grantsSpeechBubble&amp;quot;&amp;gt;\&lt;br /&gt;
		&amp;lt;span localize=&amp;quot;message-feedback&amp;quot;&amp;gt;Thank You&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;grantsSpeechBubbleArrowDown&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;)).find(&amp;#039;.grantsSpeechBubbleContainer&amp;#039;);&lt;br /&gt;
		var width = li.css(&amp;#039;display&amp;#039;,&amp;#039;inline-block&amp;#039;).width();&lt;br /&gt;
		li.css(&amp;#039;display&amp;#039;,&amp;#039;&amp;#039;);&lt;br /&gt;
		li.css(&amp;#039;position&amp;#039;,&amp;#039;relative&amp;#039;);&lt;br /&gt;
		speechBubble.css(&amp;#039;left&amp;#039;,width/2+&amp;#039;px&amp;#039;);&lt;br /&gt;
		$(&amp;#039;[localize=message-feedback]&amp;#039;).html(InterfaceMessages[&amp;#039;message-feedback&amp;#039;]);&lt;br /&gt;
		$(&amp;quot;body, html&amp;quot;).animate({ scrollTop : li[0].offsetTop}, that.feedbackScrollTime);&lt;br /&gt;
		setTimeout(function(){ speechBubble.hide();},that.feedbackDisappearDelay);&lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
/*&lt;br /&gt;
 * The Endorse Gadget&lt;br /&gt;
 */&lt;br /&gt;
var endorseGadget = function(){&lt;br /&gt;
	/* Variables */&lt;br /&gt;
	var util = new gadgetUtilities();&lt;br /&gt;
	var dialog = null;&lt;br /&gt;
	&lt;br /&gt;
	var api = new mw.Api();	&lt;br /&gt;
	var that = this;&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	 * This function creates the dialog box for the gadget.&lt;br /&gt;
	 * It is also where all the dialog related interactions are defined.&lt;br /&gt;
	 */ &lt;br /&gt;
	var createDialog = function(){&lt;br /&gt;
		dialog = $( &amp;quot;&amp;lt;div id=&amp;#039;devEndorseDialog&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot; )&lt;br /&gt;
				.html(&lt;br /&gt;
					&amp;#039;&amp;lt;div class=&amp;quot;mw-ui-vform&amp;quot;&amp;gt;\&lt;br /&gt;
					 	&amp;lt;div class=&amp;quot;error grantsHide&amp;quot; localize=&amp;quot;error-save&amp;quot;&amp;gt;An error occured&amp;lt;/div&amp;gt;\&lt;br /&gt;
					 	&amp;lt;div class=&amp;quot;error grantsHide&amp;quot; localize=&amp;quot;error-login&amp;quot;&amp;gt;An error occured&amp;lt;/div&amp;gt;\&lt;br /&gt;
					 &amp;lt;/div&amp;gt;\&lt;br /&gt;
					 &amp;lt;div localize=&amp;quot;message-description&amp;quot; class=&amp;quot;messageDescription&amp;quot;&amp;gt;Explaining your endorsement improves process&amp;lt;/div&amp;gt;&amp;#039; + &amp;#039;\&lt;br /&gt;
					 &amp;lt;textarea rows=&amp;quot;5&amp;quot; cols=&amp;quot;10&amp;quot; placeholder=&amp;quot;Add your comment&amp;quot; id=&amp;quot;devEndorseComment&amp;quot; class=&amp;quot;&amp;quot; localize=&amp;quot;placeholder-comment&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;\&lt;br /&gt;
					 &amp;lt;span localize=&amp;quot;message-signature&amp;quot; class=&amp;quot;messageSignature&amp;quot;&amp;gt;Your signature will be added automatically&amp;lt;/span&amp;gt;\&lt;br /&gt;
					 &amp;lt;div class=&amp;quot;gadgetControls&amp;quot;&amp;gt;\&lt;br /&gt;
						&amp;lt;a href=&amp;quot;#&amp;quot; localize=&amp;quot;button-cancel&amp;quot; class=&amp;quot;mw-ui-button cancel mw-ui-quiet&amp;quot;&amp;gt;Cancel&amp;lt;/a&amp;gt;\&lt;br /&gt;
						&amp;lt;input type=&amp;quot;submit&amp;quot; localize=&amp;quot;button-submit&amp;quot; class=&amp;quot;mw-ui-button mw-ui-constructive add-endorse&amp;quot; disabled localize=&amp;quot;button&amp;quot; value=&amp;quot;Ok&amp;quot;&amp;gt;&amp;lt;/input&amp;gt;\&lt;br /&gt;
					 &amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		).dialog({&lt;br /&gt;
				dialogClass: &amp;#039;grantsGadget endorseGadget&amp;#039;,&lt;br /&gt;
				autoOpen: false,&lt;br /&gt;
				title: &amp;#039;Endorse Comment&amp;#039;,&lt;br /&gt;
				width: &amp;#039;495px&amp;#039;,&lt;br /&gt;
				modal: true,&lt;br /&gt;
				closeOnEscape: true,&lt;br /&gt;
				resizable: false,&lt;br /&gt;
				draggable: false,&lt;br /&gt;
				close: function( event, ui ) {&lt;br /&gt;
					$(&amp;#039;#devEndorseComment&amp;#039;).val(&amp;#039;&amp;#039;);&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			$(&amp;#039;.add-endorse&amp;#039;).click(function(){&lt;br /&gt;
				that.addEndorsement(util.cleanupText($(&amp;#039;#devEndorseComment&amp;#039;).val()));&lt;br /&gt;
			});&lt;br /&gt;
			&lt;br /&gt;
			$(&amp;#039;#devEndorseComment&amp;#039;).on(&amp;#039;change keyup paste&amp;#039;,function(){&lt;br /&gt;
					util.removeErrorMessage(&amp;#039;endorseGadget&amp;#039;);&lt;br /&gt;
					if($(this).val()){&lt;br /&gt;
						$(&amp;#039;.add-endorse&amp;#039;).attr(&amp;#039;disabled&amp;#039;,false);&lt;br /&gt;
						$(&amp;#039;.messageSignature&amp;#039;).css(&amp;#039;visibility&amp;#039;,&amp;#039;visible&amp;#039;);&lt;br /&gt;
					}&lt;br /&gt;
					else{&lt;br /&gt;
						$(&amp;#039;.add-endorse&amp;#039;).attr(&amp;#039;disabled&amp;#039;,true);&lt;br /&gt;
						$(&amp;#039;.messageSignature&amp;#039;).css(&amp;#039;visibility&amp;#039;,&amp;#039;hidden&amp;#039;);&lt;br /&gt;
					}&lt;br /&gt;
			});&lt;br /&gt;
			$(&amp;#039;.endorseGadget .ui-dialog-title&amp;#039;).attr(&amp;#039;localize&amp;#039;,&amp;#039;title&amp;#039;);&lt;br /&gt;
			&lt;br /&gt;
			$(&amp;#039;.endorseGadget .cancel&amp;#039;).click(function(){&lt;br /&gt;
				dialog.dialog(&amp;#039;close&amp;#039;);&lt;br /&gt;
			});&lt;br /&gt;
			&lt;br /&gt;
			util.localizeGadget(&amp;#039;.endorseGadget&amp;#039;,that.interfaceMessages);&lt;br /&gt;
			&lt;br /&gt;
			$(&amp;#039;.messageSignature&amp;#039;).css(&amp;#039;visibility&amp;#039;,&amp;#039;hidden&amp;#039;);&lt;br /&gt;
	};&lt;br /&gt;
	this.Dialog = function () {&lt;br /&gt;
		if (dialog === null){&lt;br /&gt;
			createDialog();&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			dialog.dialog(&amp;#039;open&amp;#039;);&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * The main function to add the feedback/endorsement to the page. It first checks if the page has an endorsement section.&lt;br /&gt;
	 * If it dosent it creates a new section called Endorsements and appends the feedback/endorsement comment to that section, &lt;br /&gt;
	 * else it appends the feedback/endorsement comment to existing Endorsements section.&lt;br /&gt;
	 * The name of the endorsement section is defined in the config. &lt;br /&gt;
	 */&lt;br /&gt;
	this.addEndorsement = function( text ) {&lt;br /&gt;
		var endorseComment = &amp;#039;\n*&amp;#039; + text + &amp;#039;~~~~&amp;#039; + &amp;#039;\n&amp;#039;;&lt;br /&gt;
		api.get({&lt;br /&gt;
					&amp;#039;format&amp;#039;:&amp;#039;json&amp;#039;,&lt;br /&gt;
					&amp;#039;action&amp;#039;:&amp;#039;parse&amp;#039;,&lt;br /&gt;
					&amp;#039;prop&amp;#039;:&amp;#039;sections&amp;#039;,&lt;br /&gt;
					&amp;#039;page&amp;#039;:mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
				}).then(function(result){&lt;br /&gt;
					var sections = result.parse.sections;&lt;br /&gt;
					var sectionCount = 1;&lt;br /&gt;
					var sectionFound = false;&lt;br /&gt;
					for (var section in sections ){&lt;br /&gt;
						if ($.trim(sections[section][&amp;#039;anchor&amp;#039;]) == that.config[&amp;#039;section-header-read&amp;#039;] ){&lt;br /&gt;
							sectionFound = true;&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
						sectionCount++;&lt;br /&gt;
					}&lt;br /&gt;
					if (sectionFound){&lt;br /&gt;
						api.get({&lt;br /&gt;
						&amp;#039;format&amp;#039;:&amp;#039;json&amp;#039;,&lt;br /&gt;
						&amp;#039;action&amp;#039;:&amp;#039;parse&amp;#039;,&lt;br /&gt;
						&amp;#039;prop&amp;#039;:&amp;#039;wikitext&amp;#039;,&lt;br /&gt;
						&amp;#039;page&amp;#039;: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
						&amp;#039;section&amp;#039;: sectionCount,&lt;br /&gt;
						}).then(function(result){&lt;br /&gt;
							var wikitext = result.parse.wikitext[&amp;#039;*&amp;#039;];&lt;br /&gt;
							var endorsementSection = wikitext + endorseComment;&lt;br /&gt;
							api.post({&lt;br /&gt;
										&amp;#039;action&amp;#039; : &amp;#039;edit&amp;#039;,&lt;br /&gt;
										&amp;#039;title&amp;#039; : mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
										&amp;#039;text&amp;#039; : endorsementSection,&lt;br /&gt;
										&amp;#039;summary&amp;#039; : &amp;#039;Endorsed by &amp;#039; + mw.user.getName(),&lt;br /&gt;
										&amp;#039;section&amp;#039;: sectionCount,&lt;br /&gt;
										&amp;#039;watchlist&amp;#039;:&amp;#039;watch&amp;#039;,&lt;br /&gt;
										&amp;#039;token&amp;#039; : mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;)&lt;br /&gt;
									}).then(function(){&lt;br /&gt;
											console.log(&amp;#039;Successfully added endorsement&amp;#039;);&lt;br /&gt;
											window.location.reload(true);&lt;br /&gt;
											util.setFeedbackCookie(&amp;#039;endorseFeedback&amp;#039;);	&lt;br /&gt;
									},function(){&lt;br /&gt;
										util.showErrorMessage(&amp;#039;endorseGadget&amp;#039;,&amp;#039;save&amp;#039;);&lt;br /&gt;
										});&lt;br /&gt;
							});&lt;br /&gt;
					}&lt;br /&gt;
					else{&lt;br /&gt;
						var sectionHeader = that.config[&amp;#039;section-header-write&amp;#039;];&lt;br /&gt;
						api.post({&lt;br /&gt;
							&amp;#039;action&amp;#039;: &amp;#039;edit&amp;#039;,&lt;br /&gt;
							&amp;#039;title&amp;#039;: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
							&amp;#039;section&amp;#039;: &amp;#039;new&amp;#039;,&lt;br /&gt;
							&amp;#039;summary&amp;#039;: sectionHeader + &amp;#039; Endorsed by &amp;#039; + mw.user.getName(),&lt;br /&gt;
							&amp;#039;sectiontitle&amp;#039;: sectionHeader,&lt;br /&gt;
							&amp;#039;text&amp;#039;: $.trim(endorseComment),&lt;br /&gt;
							&amp;#039;watchlist&amp;#039;:&amp;#039;watch&amp;#039;,&lt;br /&gt;
							token: mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;)&lt;br /&gt;
						}).then(function () {&lt;br /&gt;
								console.log(&amp;#039;Successfully added endorsement&amp;#039;);&lt;br /&gt;
								location.reload();&lt;br /&gt;
								util.setFeedbackCookie(&amp;#039;endorseFeedback&amp;#039;);&lt;br /&gt;
							}, function(){&lt;br /&gt;
								util.showErrorMessage(&amp;#039;endorseGadget&amp;#039;,&amp;#039;save&amp;#039;);&lt;br /&gt;
								});&lt;br /&gt;
					}			&lt;br /&gt;
			}, function(){&lt;br /&gt;
				util.showErrorMessage(&amp;#039;endorseGadget&amp;#039;,&amp;#039;save&amp;#039;);&lt;br /&gt;
				});&lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
/*&lt;br /&gt;
 * The function the create the join gadget and provides &lt;br /&gt;
 * all the needed functionality.&lt;br /&gt;
 */&lt;br /&gt;
var joinGadget = function(){&lt;br /&gt;
	/* Variables */&lt;br /&gt;
	var util = new gadgetUtilities();&lt;br /&gt;
	var dialog = null;&lt;br /&gt;
	&lt;br /&gt;
	this.config = null ;&lt;br /&gt;
	this.interfaceMessages = null;&lt;br /&gt;
	&lt;br /&gt;
	var infobox = &amp;#039;&amp;#039;;&lt;br /&gt;
	var roleDict = {};&lt;br /&gt;
	var api = new mw.Api();	&lt;br /&gt;
	var that = this;&lt;br /&gt;
	/*&lt;br /&gt;
	 * A count is maintained of the open &amp;#039;{{&amp;#039; braces&lt;br /&gt;
	 * when a &amp;#039;}}&amp;#039; is encountered the counter is decremented.&lt;br /&gt;
	 * If the counter reaches 0 the end of the infobox has been found.&lt;br /&gt;
	 * Else the syntax is broken or the end of the infobox is not in &lt;br /&gt;
	 * the first section of the page.&lt;br /&gt;
	 */&lt;br /&gt;
	var extractInfobox = function(markup){&lt;br /&gt;
		var startIndex = markup.indexOf(&amp;#039;{{Probox&amp;#039;);&lt;br /&gt;
		var counter = 0;&lt;br /&gt;
		var endIndex = 0;&lt;br /&gt;
		for (i=startIndex;i&amp;lt;markup.length;i++){ &lt;br /&gt;
			if(markup[i] == &amp;#039;}&amp;#039; &amp;amp;&amp;amp; markup[i+1] == &amp;#039;}&amp;#039;){ &lt;br /&gt;
					counter++;&lt;br /&gt;
			} &lt;br /&gt;
			if(markup[i] == &amp;#039;{&amp;#039; &amp;amp;&amp;amp; markup[i+1] == &amp;#039;{&amp;#039;){&lt;br /&gt;
				counter--;&lt;br /&gt;
			} &lt;br /&gt;
			if(counter == 0){&lt;br /&gt;
				var endIndex = i+2; &lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (counter != 0){&lt;br /&gt;
			return &amp;#039;&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		var infobox = { &lt;br /&gt;
			&amp;#039;infobox&amp;#039; : markup.slice(startIndex,endIndex),&lt;br /&gt;
		    &amp;#039;before&amp;#039; : markup.slice(0,startIndex),&lt;br /&gt;
			&amp;#039;after&amp;#039; : markup.slice(endIndex),&lt;br /&gt;
		};&lt;br /&gt;
		//return markup.slice(startIndex,endIndex);&lt;br /&gt;
		return infobox;&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * This function creates the dialog &amp;amp; defines&lt;br /&gt;
	 *  needed interactions in the dialog.&lt;br /&gt;
	 */ &lt;br /&gt;
	var createDialog = function(){&lt;br /&gt;
		dialog = $( &amp;quot;&amp;lt;div id=&amp;#039;devJoinDialog&amp;#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot; )&lt;br /&gt;
				.html(&lt;br /&gt;
					&amp;#039;&amp;lt;div class=&amp;quot;mw-ui-vform&amp;quot;&amp;gt;\&lt;br /&gt;
					 	&amp;lt;div class=&amp;quot;error grantsHide&amp;quot; localize=&amp;quot;error-save&amp;quot;&amp;gt;An error occured&amp;lt;/div&amp;gt;\&lt;br /&gt;
					 	&amp;lt;div class=&amp;quot;error grantsHide&amp;quot; localize=&amp;quot;error-login&amp;quot;&amp;gt;An error occured&amp;lt;/div&amp;gt;\&lt;br /&gt;
					 &amp;lt;/div&amp;gt;\&lt;br /&gt;
					&amp;lt;select class=&amp;quot;roleSelect&amp;quot; localize=&amp;quot;placeholder-role&amp;quot; data-placeholder=&amp;quot;Select a role&amp;quot;&amp;gt;\&lt;br /&gt;
						&amp;lt;option&amp;gt;&amp;lt;/option&amp;gt;\&lt;br /&gt;
					&amp;lt;/select&amp;gt;\&lt;br /&gt;
					&amp;lt;div localize=&amp;quot;message-description&amp;quot; class=&amp;quot;messageDescription&amp;quot;&amp;gt;Tell us how you would like to help&amp;lt;/div&amp;gt;\&lt;br /&gt;
					&amp;lt;textarea rows=&amp;quot;5&amp;quot; cols=&amp;quot;10&amp;quot; placeholder=&amp;quot;Add your comment&amp;quot; id=&amp;quot;devJoinComment&amp;quot; class=&amp;quot;&amp;quot; localize=&amp;quot;placeholder-comment&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;\&lt;br /&gt;
					&amp;lt;span localize=&amp;quot;message-signature&amp;quot; class=&amp;quot;messageSignature&amp;quot;&amp;gt;Your signature will be added automatically&amp;lt;/span&amp;gt;\&lt;br /&gt;
					&amp;lt;div class=&amp;quot;gadgetControls&amp;quot;&amp;gt;\&lt;br /&gt;
						&amp;lt;a href=&amp;quot;#&amp;quot; localize=&amp;quot;button-cancel&amp;quot; class=&amp;quot;mw-ui-button cancel mw-ui-quiet&amp;quot;&amp;gt;Cancel&amp;lt;/a&amp;gt;\&lt;br /&gt;
						&amp;lt;input type=&amp;quot;submit&amp;quot; localize=&amp;quot;button-join&amp;quot; class=&amp;quot;mw-ui-button mw-ui-constructive add-join&amp;quot; disabled localize=&amp;quot;button&amp;quot; value=&amp;quot;Join&amp;quot;&amp;gt;&amp;lt;/input&amp;gt;\&lt;br /&gt;
					 &amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		).dialog({&lt;br /&gt;
				dialogClass: &amp;#039;grantsGadget joinGadget&amp;#039;,&lt;br /&gt;
				autoOpen: false,&lt;br /&gt;
				title: &amp;#039;join Comment&amp;#039;,&lt;br /&gt;
				width: &amp;#039;495px&amp;#039;,&lt;br /&gt;
				modal: true,&lt;br /&gt;
				closeOnEscape: true,&lt;br /&gt;
				resizable: false,&lt;br /&gt;
				draggable: false,&lt;br /&gt;
				close: function( event, ui ) {&lt;br /&gt;
					$(&amp;#039;#devJoinComment&amp;#039;).val(&amp;#039;&amp;#039;);&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			$(&amp;#039;.add-join&amp;#039;).click(function(){&lt;br /&gt;
				/*&lt;br /&gt;
				 * Creating the comment to add to the participants section. The comment is of the form&lt;br /&gt;
				 * &amp;quot;Role&amp;quot; User comment. Eg, Volunteer I can help out in many ways.&lt;br /&gt;
				 */&lt;br /&gt;
				 &lt;br /&gt;
				var joinRole = $(&amp;#039;.roleSelect&amp;#039;).val().replace(/_/,&amp;#039; &amp;#039;);&lt;br /&gt;
				joinRole=joinRole[0].toUpperCase()+joinRole.slice(1);&lt;br /&gt;
				joinRole = &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;+ joinRole + &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; + &amp;quot; &amp;quot;;&lt;br /&gt;
				that.addjoinment(joinRole+util.cleanupText($(&amp;#039;#devJoinComment&amp;#039;).val()));&lt;br /&gt;
			});&lt;br /&gt;
			&lt;br /&gt;
			$(&amp;#039;#devJoinComment&amp;#039;).on(&amp;#039;change keyup paste&amp;#039;,function(){&lt;br /&gt;
				util.removeErrorMessage(&amp;#039;joinGadget&amp;#039;);&lt;br /&gt;
					if($(this).val()){&lt;br /&gt;
						$(&amp;#039;.messageSignature&amp;#039;).css(&amp;#039;visibility&amp;#039;,&amp;#039;visible&amp;#039;);&lt;br /&gt;
						if($(&amp;#039;.roleSelect&amp;#039;).val()){&lt;br /&gt;
							$(&amp;#039;.add-join&amp;#039;).attr(&amp;#039;disabled&amp;#039;,false);&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					else{&lt;br /&gt;
						$(&amp;#039;.add-join&amp;#039;).attr(&amp;#039;disabled&amp;#039;,true);&lt;br /&gt;
						$(&amp;#039;.messageSignature&amp;#039;).css(&amp;#039;visibility&amp;#039;,&amp;#039;hidden&amp;#039;);&lt;br /&gt;
					}&lt;br /&gt;
			});&lt;br /&gt;
			$(&amp;#039;.joinGadget .ui-dialog-title&amp;#039;).attr(&amp;#039;localize&amp;#039;,&amp;#039;title&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
			$(&amp;#039;.joinGadget .cancel&amp;#039;).click(function(){&lt;br /&gt;
				dialog.dialog(&amp;#039;close&amp;#039;);&lt;br /&gt;
			});&lt;br /&gt;
			util.localizeGadget(&amp;#039;.joinGadget&amp;#039;,that.interfaceMessages);&lt;br /&gt;
			$(&amp;#039;.messageSignature&amp;#039;).css(&amp;#039;visibility&amp;#039;,&amp;#039;hidden&amp;#039;);&lt;br /&gt;
 &lt;br /&gt;
			/*&lt;br /&gt;
			 * The code below gets the infobox, check for open roles, &lt;br /&gt;
			 * makes sure that these roles are available for other to &lt;br /&gt;
			 * join by looking up roles in the config and creates a drop down &lt;br /&gt;
			 * from which a user can select a role.&lt;br /&gt;
			 */&lt;br /&gt;
 &lt;br /&gt;
			api.get({&lt;br /&gt;
						&amp;#039;format&amp;#039;:&amp;#039;json&amp;#039;,&lt;br /&gt;
						&amp;#039;action&amp;#039;:&amp;#039;parse&amp;#039;,&lt;br /&gt;
						&amp;#039;prop&amp;#039;:&amp;#039;wikitext&amp;#039;,&lt;br /&gt;
						&amp;#039;page&amp;#039;: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
						&amp;#039;section&amp;#039;: 0&lt;br /&gt;
					}).then(function(result){&lt;br /&gt;
							var roles = that.interfaceMessages[&amp;#039;roles&amp;#039;];&lt;br /&gt;
							var wikitext = result.parse.wikitext[&amp;#039;*&amp;#039;];&lt;br /&gt;
							&lt;br /&gt;
							var content = extractInfobox(wikitext);&lt;br /&gt;
							var infobox = that.infobox = content[&amp;#039;infobox&amp;#039;];&lt;br /&gt;
							that.before = content[&amp;#039;before&amp;#039;];&lt;br /&gt;
							that.after = content[&amp;#039;after&amp;#039;];&lt;br /&gt;
							units = infobox.split(&amp;#039;\n&amp;#039;);&lt;br /&gt;
							for (unit in units){&lt;br /&gt;
								var line = units[unit];&lt;br /&gt;
								var role = line.match(/[a-zA-z]+/g);&lt;br /&gt;
								if (role){&lt;br /&gt;
									role = role.join(&amp;#039;&amp;#039;);&lt;br /&gt;
									var elements = line.split(&amp;#039;=&amp;#039;);&lt;br /&gt;
									var count = elements[0].match(/[0-9]+/)?elements[0].match(/[0-9]+/)[0]:1;&lt;br /&gt;
									if (role.indexOf(&amp;#039;volunteer&amp;#039;) != -1){&lt;br /&gt;
										roleDict[&amp;#039;volunteer&amp;#039;]=count;&lt;br /&gt;
									}&lt;br /&gt;
									if(role in roles &amp;amp;&amp;amp; line.indexOf(&amp;#039;=&amp;#039;) != -1){&lt;br /&gt;
										roleDict[role]=count;&lt;br /&gt;
										if(!$(&amp;#039;.roleSelect option[value=&amp;quot;&amp;#039;+role+&amp;#039;&amp;quot;]&amp;#039;).length){											&lt;br /&gt;
											$(&amp;#039;.roleSelect&amp;#039;).append(&amp;#039;&amp;lt;option value=&amp;#039;+role+&amp;#039;&amp;gt;&amp;#039;+roles[role]+&amp;#039;&amp;lt;/option&amp;gt;&amp;#039;);&lt;br /&gt;
										}&lt;br /&gt;
									}&lt;br /&gt;
								}&lt;br /&gt;
							}&lt;br /&gt;
							if(!$(&amp;#039;.roleSelect option[value=&amp;quot;volunteer&amp;quot;]&amp;#039;).length){&lt;br /&gt;
								$(&amp;#039;.roleSelect&amp;#039;).append(&amp;#039;&amp;lt;option value=&amp;quot;volunteer&amp;quot;&amp;gt;&amp;#039;+roles[&amp;#039;volunteer&amp;#039;]+&amp;#039;&amp;lt;/option&amp;gt;&amp;#039;);&lt;br /&gt;
							}&lt;br /&gt;
							$(&amp;#039;.roleSelect&amp;#039;).chosen({&lt;br /&gt;
								disable_search: true,&lt;br /&gt;
								placeholder_text_single: &amp;#039;Select a role&amp;#039;,&lt;br /&gt;
								width: &amp;#039;50%&amp;#039;,&lt;br /&gt;
							});&lt;br /&gt;
							/* Fix this */&lt;br /&gt;
							/*&lt;br /&gt;
							$(&amp;#039;.roleSelect&amp;#039;).on(&amp;#039;chosen:showing_dropdown&amp;#039;,function(){&lt;br /&gt;
								util.removeErrorMessage(&amp;#039;endorseGadget&amp;#039;);&lt;br /&gt;
							});&lt;br /&gt;
							*/&lt;br /&gt;
							$(&amp;#039;.roleSelect&amp;#039;).on(&amp;#039;change&amp;#039;,function(){&lt;br /&gt;
								util.removeErrorMessage(&amp;#039;joinGadget&amp;#039;);&lt;br /&gt;
								if($(this).val() &amp;amp;&amp;amp; $(&amp;#039;#devJoinComment&amp;#039;).val()){&lt;br /&gt;
									$(&amp;#039;.add-join&amp;#039;).attr(&amp;#039;disabled&amp;#039;,false);&lt;br /&gt;
								}&lt;br /&gt;
								else{&lt;br /&gt;
									$(&amp;#039;.add-join&amp;#039;).attr(&amp;#039;disabled&amp;#039;,true);&lt;br /&gt;
								}&lt;br /&gt;
							});&lt;br /&gt;
						});		 &lt;br /&gt;
	};&lt;br /&gt;
	this.Dialog = function () {&lt;br /&gt;
		if (dialog === null){&lt;br /&gt;
			createDialog();&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			dialog.dialog(&amp;#039;open&amp;#039;);&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	/*&lt;br /&gt;
	 * The main function to add the feedback/join comment to the page. It first checks if the page has an Participants section.&lt;br /&gt;
	 * If it dosent it creates a new section called Participants and appends the fedback/comment to that section, &lt;br /&gt;
	 * else it appends the feedback/comment to existing Participants section. &lt;br /&gt;
	 */&lt;br /&gt;
	this.addjoinment = function( text ) {&lt;br /&gt;
		var joinComment = &amp;#039;\n*&amp;#039; + text + &amp;#039;~~~~&amp;#039; + &amp;#039;\n&amp;#039;;&lt;br /&gt;
		//var joinComment = &amp;#039;*&amp;#039; + text + &amp;#039;~~~~&amp;#039; + &amp;#039;\n&amp;#039;;&lt;br /&gt;
		//Editing the infobox&lt;br /&gt;
		var userName = mw.config.get(&amp;#039;wgUserName&amp;#039;)?mw.config.get(&amp;#039;wgUserName&amp;#039;):&amp;#039;{{subst:REVISIONUSER}}&amp;#039;; &lt;br /&gt;
		var roleSelected = $(&amp;#039;.roleSelect&amp;#039;).val();&lt;br /&gt;
		var units = that.infobox.split(&amp;#039;\n&amp;#039;);&lt;br /&gt;
		var emptyRoleAdded = false;&lt;br /&gt;
		for (unit in units){&lt;br /&gt;
			if ($.trim(units[unit].split(&amp;#039;=&amp;#039;)[1]) == &amp;#039;&amp;#039;){			&lt;br /&gt;
				var role = units[unit].match(/[a-zA-z]+/);&lt;br /&gt;
				if (role){&lt;br /&gt;
					role = role[0];&lt;br /&gt;
					if(role == roleSelected){&lt;br /&gt;
						units[unit] = $.trim(units[unit]) + util.addToInfobox(userName);&lt;br /&gt;
						emptyRoleAdded = true;&lt;br /&gt;
						break;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		var modifiedInfoBox = units.join(&amp;quot;\n&amp;quot;);&lt;br /&gt;
		if(!emptyRoleAdded){&lt;br /&gt;
			var paramCount = roleDict[&amp;quot;volunteer&amp;quot;] ? parseInt(roleDict[&amp;quot;volunteer&amp;quot;]) + 1 : 1;&lt;br /&gt;
			var endIndex = modifiedInfoBox.lastIndexOf(&amp;#039;}}&amp;#039;);&lt;br /&gt;
			modifiedInfoBox = modifiedInfoBox.slice(0,endIndex)+&amp;#039;|volunteer&amp;#039;+paramCount+&amp;#039;=&amp;#039;+util.addToInfobox(userName)+&amp;#039;\n}}&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		api.post({&lt;br /&gt;
			&amp;#039;action&amp;#039; : &amp;#039;edit&amp;#039;,&lt;br /&gt;
			&amp;#039;title&amp;#039; : mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
			&amp;#039;text&amp;#039; : that.before + modifiedInfoBox + that.after,&lt;br /&gt;
			&amp;#039;summary&amp;#039; : &amp;#039;Joined as &amp;#039; + roleSelected,&lt;br /&gt;
			&amp;#039;section&amp;#039;: 0,&lt;br /&gt;
			&amp;#039;watchlist&amp;#039;:&amp;#039;watch&amp;#039;,&lt;br /&gt;
			&amp;#039;token&amp;#039; : mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;)&lt;br /&gt;
		}).then(function(){&lt;br /&gt;
			api.get({&lt;br /&gt;
					&amp;#039;format&amp;#039;:&amp;#039;json&amp;#039;,&lt;br /&gt;
					&amp;#039;action&amp;#039;:&amp;#039;parse&amp;#039;,&lt;br /&gt;
					&amp;#039;prop&amp;#039;:&amp;#039;sections&amp;#039;,&lt;br /&gt;
					&amp;#039;page&amp;#039;:mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
				}).then(function(result){&lt;br /&gt;
					var sections = result.parse.sections;&lt;br /&gt;
					var sectionCount = 1;&lt;br /&gt;
					var sectionFound = false;&lt;br /&gt;
					for (var section in sections ){&lt;br /&gt;
						if ($.trim(sections[section][&amp;#039;anchor&amp;#039;]) == that.config[&amp;#039;section-header-read&amp;#039;] ){&lt;br /&gt;
							sectionFound = true;&lt;br /&gt;
							break;&lt;br /&gt;
						}&lt;br /&gt;
						sectionCount++;&lt;br /&gt;
					}&lt;br /&gt;
					if (sectionFound){&lt;br /&gt;
						api.get({&lt;br /&gt;
							&amp;#039;format&amp;#039;:&amp;#039;json&amp;#039;,&lt;br /&gt;
							&amp;#039;action&amp;#039;:&amp;#039;parse&amp;#039;,&lt;br /&gt;
							&amp;#039;prop&amp;#039;:&amp;#039;wikitext&amp;#039;,&lt;br /&gt;
							&amp;#039;page&amp;#039;: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
							&amp;#039;section&amp;#039;: sectionCount&lt;br /&gt;
						}).then(function(result){&lt;br /&gt;
							var wikitext = result.parse.wikitext[&amp;#039;*&amp;#039;];&lt;br /&gt;
							var joinmentSection = wikitext + joinComment;&lt;br /&gt;
							api.post({&lt;br /&gt;
										&amp;#039;action&amp;#039; : &amp;#039;edit&amp;#039;,&lt;br /&gt;
										&amp;#039;title&amp;#039; : mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
										&amp;#039;text&amp;#039; : joinmentSection,&lt;br /&gt;
										&amp;#039;summary&amp;#039; : &amp;#039;Adding my name to the participants section&amp;#039;,&lt;br /&gt;
										&amp;#039;section&amp;#039;: sectionCount,&lt;br /&gt;
										&amp;#039;watchlist&amp;#039;:&amp;#039;watch&amp;#039;,&lt;br /&gt;
										&amp;#039;token&amp;#039; : mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;)&lt;br /&gt;
									}).then(function(){&lt;br /&gt;
										console.log(&amp;#039;Successfully added to participants&amp;#039;);&lt;br /&gt;
										location.reload();&lt;br /&gt;
										util.setFeedbackCookie(&amp;#039;joinFeedback&amp;#039;);&lt;br /&gt;
									}, function(){&lt;br /&gt;
										util.showErrorMessage(&amp;#039;joinGadget&amp;#039;,&amp;#039;save&amp;#039;);&lt;br /&gt;
										});&lt;br /&gt;
							});&lt;br /&gt;
					}&lt;br /&gt;
					else{&lt;br /&gt;
						var sectionHeader = that.config[&amp;#039;section-header-write&amp;#039;];&lt;br /&gt;
						api.post({&lt;br /&gt;
							&amp;#039;action&amp;#039;: &amp;#039;edit&amp;#039;,&lt;br /&gt;
							&amp;#039;title&amp;#039;: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
							&amp;#039;section&amp;#039;: &amp;#039;new&amp;#039;,&lt;br /&gt;
							&amp;#039;summary&amp;#039;: sectionHeader,&lt;br /&gt;
							&amp;#039;text&amp;#039;: $.trim(joinComment),&lt;br /&gt;
							&amp;#039;watchlist&amp;#039;:&amp;#039;watch&amp;#039;,&lt;br /&gt;
							&amp;#039;token&amp;#039;: mw.user.tokens.get(&amp;#039;csrfToken&amp;#039;)&lt;br /&gt;
						}).then(function () {&lt;br /&gt;
								console.log(&amp;#039;Successfully added to participants&amp;#039;);&lt;br /&gt;
								location.reload();&lt;br /&gt;
								util.setFeedbackCookie(&amp;#039;joinFeedback&amp;#039;);&lt;br /&gt;
							}, function(){&lt;br /&gt;
								util.showErrorMessage(&amp;#039;joinGadget&amp;#039;,&amp;#039;save&amp;#039;);&lt;br /&gt;
								});&lt;br /&gt;
					}			&lt;br /&gt;
			}, function(){&lt;br /&gt;
				util.showErrorMessage(&amp;#039;joinGadget&amp;#039;,&amp;#039;save&amp;#039;);&lt;br /&gt;
				});&lt;br /&gt;
		}, function(){&lt;br /&gt;
			util.showErrorMessage(&amp;#039;joinGadget&amp;#039;,&amp;#039;save&amp;#039;);&lt;br /&gt;
			}); &lt;br /&gt;
 &lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/* End of functions */&lt;br /&gt;
mw.loader.using( [&amp;#039;jquery.ui&amp;#039;, &amp;#039;mediawiki.api&amp;#039;, &amp;#039;mediawiki.ui&amp;#039;,&amp;#039;jquery.chosen&amp;#039;], function() {	&lt;br /&gt;
	$(function() {&lt;br /&gt;
		(function(){&lt;br /&gt;
			var namespace = mw.config.get(&amp;#039;wgCanonicalNamespace&amp;#039;);&lt;br /&gt;
			/*&lt;br /&gt;
			 * Fix mw.config.get(&amp;#039;wgPageContentLanguage&amp;#039;) == &amp;#039;en&amp;#039;) checking with a better solution, &lt;br /&gt;
			 * either when pages can be tagged with arbitary language or when we set langauge markers later on. &lt;br /&gt;
			 * &lt;br /&gt;
			 */&lt;br /&gt;
			if (  $(&amp;#039;.wp-join-button,.wp-endorse-button&amp;#039;).length) {&lt;br /&gt;
				if(mw.config.get(&amp;#039;wgPageContentLanguage&amp;#039;) == &amp;#039;en&amp;#039;){&lt;br /&gt;
					&lt;br /&gt;
					var endorse = new endorseGadget();		&lt;br /&gt;
					var join = new joinGadget();		&lt;br /&gt;
					var util = new gadgetUtilities();&lt;br /&gt;
					var api = new mw.Api();&lt;br /&gt;
					var interfaceMessagesFullPath = util.interfaceMessagesPath+&amp;#039;/&amp;#039;+util.userLanguage();&lt;br /&gt;
					var configFullPath = util.configPath+&amp;#039;/&amp;#039;+util.contentLanguage();&lt;br /&gt;
					&lt;br /&gt;
					/*&lt;br /&gt;
					 * To detect if we have the gadget translations and config in the desired languages.&lt;br /&gt;
					 * Currently page language is English always. So the config returned is in en. The InterfaceMessages is&lt;br /&gt;
					 * in the user&amp;#039;s language&lt;br /&gt;
					 */&lt;br /&gt;
					api.get({&amp;#039;action&amp;#039;:&amp;#039;query&amp;#039;,&amp;#039;titles&amp;#039;:interfaceMessagesFullPath+&amp;#039;|&amp;#039;+configFullPath,&amp;#039;format&amp;#039;:&amp;#039;json&amp;#039;}).then(function(data){	&lt;br /&gt;
 &lt;br /&gt;
						for(id in data.query.pages){&lt;br /&gt;
							if (data.query.pages[id].title == util.interfaceMessagesPath+&amp;#039;/&amp;#039;+util.userLanguage() &amp;amp;&amp;amp;id == -1){&lt;br /&gt;
								interfaceMessagesFullPath = util.interfaceMessagesPath+&amp;#039;/en&amp;#039;;&lt;br /&gt;
							}&lt;br /&gt;
							if (data.query.pages[id].title == util.configPath+&amp;#039;/&amp;#039;+util.contentLanguage() &amp;amp;&amp;amp; id == -1){&lt;br /&gt;
								configFullPath = util.configPath+&amp;#039;/en&amp;#039;;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
 &lt;br /&gt;
						var interfaceMessagesUrl = mw.config.get(&amp;#039;wgScript&amp;#039;)+&amp;#039;?title=&amp;#039;+interfaceMessagesFullPath+&amp;#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&amp;#039;;&lt;br /&gt;
						var configUrl = mw.config.get(&amp;#039;wgScript&amp;#039;)+&amp;#039;?title=&amp;#039;+configFullPath+&amp;#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&amp;#039;;&lt;br /&gt;
						//Get the config for the detected language&lt;br /&gt;
						$.when(jQuery.getScript(interfaceMessagesUrl),jQuery.getScript(configUrl)).then(function(){&lt;br /&gt;
 							//Stripping Whitespace&lt;br /&gt;
 							join.config = util.stripWhiteSpace(util.grantType(joinConfig));&lt;br /&gt;
 							join.interfaceMessages = util.stripWhiteSpace(util.grantType(joinInterfaceMessages));&lt;br /&gt;
							&lt;br /&gt;
							endorse.config = util.stripWhiteSpace(util.grantType(endorseConfig));&lt;br /&gt;
							endorse.interfaceMessages = util.stripWhiteSpace(util.grantType(endorseInterfaceMessages));&lt;br /&gt;
							&lt;br /&gt;
							join.Dialog();&lt;br /&gt;
							$(&amp;#039;.wp-join-button&amp;#039;).off();&lt;br /&gt;
							$(&amp;#039;.wp-join-button&amp;#039;).click(function(e){&lt;br /&gt;
													e.preventDefault();&lt;br /&gt;
													join.Dialog();&lt;br /&gt;
												});&lt;br /&gt;
							if(util.checkFeedbackCookie(&amp;#039;joinFeedback&amp;#039;)){&lt;br /&gt;
								util.showFeedback(join.config, join.interfaceMessages);&lt;br /&gt;
							}&lt;br /&gt;
							endorse.Dialog();&lt;br /&gt;
							$(&amp;#039;.wp-endorse-button&amp;#039;).off();&lt;br /&gt;
							$(&amp;#039;.wp-endorse-button&amp;#039;).click(function(e){&lt;br /&gt;
													e.preventDefault();&lt;br /&gt;
													endorse.Dialog();&lt;br /&gt;
												});	&lt;br /&gt;
							&lt;br /&gt;
							//Checking if the user is logged in&lt;br /&gt;
							if(!mw.config.get(&amp;#039;wgUserName&amp;#039;)){&lt;br /&gt;
								util.showErrorMessage(&amp;#039;endorseGadget&amp;#039;,&amp;#039;login&amp;#039;);&lt;br /&gt;
								util.showErrorMessage(&amp;#039;joinGadget&amp;#039;,&amp;#039;login&amp;#039;);	&lt;br /&gt;
							}&lt;br /&gt;
							&lt;br /&gt;
							if(util.checkFeedbackCookie(&amp;#039;endorseFeedback&amp;#039;)){&lt;br /&gt;
								util.showFeedback(endorse.config, endorse.interfaceMessages);&lt;br /&gt;
							}	&lt;br /&gt;
						});&lt;br /&gt;
					});&lt;br /&gt;
				}&lt;br /&gt;
				else{&lt;br /&gt;
					$(&amp;#039;.wp-join-button&amp;#039;).hide();&lt;br /&gt;
					$(&amp;#039;.wp-endorse-button&amp;#039;).hide();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		})();&lt;br /&gt;
	}); &lt;br /&gt;
});&lt;br /&gt;
 &lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>en&gt;Krinkle</name></author>
	</entry>
</feed>