<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://informatiestandaarden.test-nictiz.nl/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-WmfProjectStatusHelper.js</id>
	<title>MediaWiki:Gadget-WmfProjectStatusHelper.js - Bewerkingsoverzicht</title>
	<link rel="self" type="application/atom+xml" href="https://informatiestandaarden.test-nictiz.nl/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-WmfProjectStatusHelper.js"/>
	<link rel="alternate" type="text/html" href="https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-WmfProjectStatusHelper.js&amp;action=history"/>
	<updated>2026-04-23T20:19:58Z</updated>
	<subtitle>Bewerkingsoverzicht voor deze pagina op de wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-WmfProjectStatusHelper.js&amp;diff=3240&amp;oldid=prev</id>
		<title>Ahenket: Nieuwe pagina aangemaakt met &#039;/*     Project Status Helper 	rmoen@wikimedia.org 	psh.js v1.0  TODO: Conflict handling: 	Edit, Replace, Cleanup */  var testTxt = &#039;&#039;; ( function( mw, $ ) {  	/* Pr...&#039;</title>
		<link rel="alternate" type="text/html" href="https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-WmfProjectStatusHelper.js&amp;diff=3240&amp;oldid=prev"/>
		<updated>2013-07-19T18:14:56Z</updated>

		<summary type="html">&lt;p&gt;Nieuwe pagina aangemaakt met &amp;#039;&lt;span class=&quot;autocomment&quot;&gt;Project Status Helper 	rmoen@wikimedia.org 	psh.js v1.0  TODO: Conflict handling: 	Edit, Replace, Cleanup: &lt;/span&gt;  var testTxt = &amp;#039;&amp;#039;; ( function( mw, $ ) {  	/* Pr...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nieuwe pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/*&lt;br /&gt;
    Project Status Helper&lt;br /&gt;
	rmoen@wikimedia.org&lt;br /&gt;
	psh.js v1.0&lt;br /&gt;
&lt;br /&gt;
TODO: Conflict handling:&lt;br /&gt;
	Edit, Replace, Cleanup&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
var testTxt = &amp;#039;&amp;#039;;&lt;br /&gt;
( function( mw, $ ) {&lt;br /&gt;
&lt;br /&gt;
	/* Project status helper class */&lt;br /&gt;
	Psh = function( project ) {&lt;br /&gt;
		this.project = {&lt;br /&gt;
			date: &amp;#039;&amp;#039;,&lt;br /&gt;
			name: &amp;#039;&amp;#039;,&lt;br /&gt;
			desc: &amp;#039;&amp;#039;&lt;br /&gt;
		};&lt;br /&gt;
		if( project !== undefined &amp;amp;&amp;amp; project.date !== undefined ) {&lt;br /&gt;
			this.project.date = project.date;&lt;br /&gt;
		} else {&lt;br /&gt;
			this.project.date = ( new Date() ).toJSON().substring( 0, 10 );&lt;br /&gt;
		}&lt;br /&gt;
		if( project !== undefined &amp;amp;&amp;amp; project.name !== undefined ) {&lt;br /&gt;
			this.project.name = project.name;&lt;br /&gt;
		} else {&lt;br /&gt;
			this.project.name = mw.config.get( &amp;#039;wgTitle&amp;#039; ).replace( &amp;#039;/status&amp;#039;, &amp;#039;&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var	_this = this,&lt;br /&gt;
			todayFormatted = this.project.date.replace( &amp;#039;monthly&amp;#039;, &amp;#039;28&amp;#039; ),&lt;br /&gt;
			isMonthly = ( this.project.date.search( &amp;#039;monthly&amp;#039; ) &amp;gt; -1 ),&lt;br /&gt;
			$modalElements =&lt;br /&gt;
			$( &amp;#039;&amp;lt;form&amp;gt;&amp;#039; )&lt;br /&gt;
				.attr( &amp;#039;id&amp;#039;, &amp;#039;projectStatusHelperForm&amp;#039; )&lt;br /&gt;
				.append(&lt;br /&gt;
					$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
						.attr( &amp;#039;class&amp;#039;, &amp;#039;mw-ajax-loader&amp;#039; )&lt;br /&gt;
						.css({&lt;br /&gt;
							position: &amp;#039;absolute&amp;#039;,&lt;br /&gt;
							width: &amp;#039;100%&amp;#039;,&lt;br /&gt;
							height: &amp;#039;100%&amp;#039;,&lt;br /&gt;
							top: &amp;#039;0px&amp;#039;,&lt;br /&gt;
							left: &amp;#039;0px&amp;#039;&lt;br /&gt;
						})&lt;br /&gt;
						.hide()&lt;br /&gt;
				).append(&lt;br /&gt;
					$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).attr( &amp;#039;id&amp;#039;, &amp;#039;projectStatusHelperInput&amp;#039; )&lt;br /&gt;
						.append(&lt;br /&gt;
							$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
								.append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;label&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr( &amp;#039;for&amp;#039;, &amp;#039;projectStatusName&amp;#039; )&lt;br /&gt;
										.text( &amp;#039;Project Name:&amp;#039; )&lt;br /&gt;
								).append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; ).css( &amp;#039;clear&amp;#039;, &amp;#039;both&amp;#039; )&lt;br /&gt;
								).append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;select&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr({&lt;br /&gt;
											name: &amp;#039;projectStatusName&amp;#039;,&lt;br /&gt;
											id: &amp;#039;projectStatusName&amp;#039;&lt;br /&gt;
										})&lt;br /&gt;
										.bind( &amp;#039;change&amp;#039;, function() {&lt;br /&gt;
											_this.updateStatusLink();&lt;br /&gt;
										}).append(&lt;br /&gt;
											$( &amp;#039;&amp;lt;option&amp;gt;&amp;#039; )&lt;br /&gt;
												.attr( &amp;#039;value&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
												.text( &amp;#039;- Please Select Project -&amp;#039; )&lt;br /&gt;
										)&lt;br /&gt;
								)&lt;br /&gt;
						).append(&lt;br /&gt;
							$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
								.append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;span&amp;gt;&amp;#039; )&lt;br /&gt;
										.text( &amp;#039;Project Link: &amp;#039; )&lt;br /&gt;
								).append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;a&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr({&lt;br /&gt;
											id: &amp;#039;projectLink&amp;#039;,&lt;br /&gt;
											target: &amp;#039;_blank&amp;#039;&lt;br /&gt;
										}).css( &amp;#039;text-decoration&amp;#039;, &amp;#039;underline&amp;#039; )&lt;br /&gt;
								)&lt;br /&gt;
						).append(&lt;br /&gt;
							$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
								.append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;label&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr( &amp;#039;for&amp;#039;, &amp;#039;projectStatusDate&amp;#039; )&lt;br /&gt;
										.text( &amp;#039;Status Date:&amp;#039; )&lt;br /&gt;
								).append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;br&amp;gt;&amp;#039; ).css({&amp;#039;clear&amp;#039;: &amp;#039;both&amp;#039;})&lt;br /&gt;
								).append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;input&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr({&lt;br /&gt;
											type: &amp;#039;text&amp;#039;,&lt;br /&gt;
											name: &amp;#039;projectStatusDate&amp;#039;,&lt;br /&gt;
											id: &amp;#039;projectStatusDate&amp;#039;&lt;br /&gt;
										})&lt;br /&gt;
										.val( todayFormatted )&lt;br /&gt;
										.bind( &amp;#039;change&amp;#039;, function() {&lt;br /&gt;
											_this.fillDescriptionField();&lt;br /&gt;
										})&lt;br /&gt;
								).append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;small&amp;gt;&amp;#039; ).text( &amp;#039;eg. YYYY-MM-DD&amp;#039; )&lt;br /&gt;
								)&lt;br /&gt;
						).append(&lt;br /&gt;
							$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
								.append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;label&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr( &amp;#039;for&amp;#039;, &amp;#039;projectStatusMonthlyFlag&amp;#039; )&lt;br /&gt;
										.text( &amp;#039;Include in Monthly report?&amp;#039; )&lt;br /&gt;
								).append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;input&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr({&lt;br /&gt;
											type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
											name: &amp;#039;projectStatusMonthlyFlag&amp;#039;,&lt;br /&gt;
											id: &amp;#039;projectStatusMonthlyFlag&amp;#039;&lt;br /&gt;
										})&lt;br /&gt;
										.prop( &amp;#039;checked&amp;#039;, isMonthly )&lt;br /&gt;
										.bind( &amp;#039;change&amp;#039;, function() {&lt;br /&gt;
											_this.fillDescriptionField();&lt;br /&gt;
										})&lt;br /&gt;
								)&lt;br /&gt;
						).append(&lt;br /&gt;
							$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
								.append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;label&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr( &amp;#039;for&amp;#039;, &amp;#039;projectStatusUpdateDescription&amp;#039; )&lt;br /&gt;
										.text( &amp;#039;Description:&amp;#039; )&lt;br /&gt;
								).append(&lt;br /&gt;
									$( &amp;#039;&amp;lt;textarea&amp;gt;&amp;#039; )&lt;br /&gt;
										.attr({&lt;br /&gt;
											name: &amp;#039;projectStatusUpdateDescription&amp;#039;,&lt;br /&gt;
											id: &amp;#039;projectStatusUpdateDescription&amp;#039;,&lt;br /&gt;
											style: &amp;#039;width:98.5% !important&amp;#039;&lt;br /&gt;
										}).css({&lt;br /&gt;
											padding: &amp;#039;5px&amp;#039;,&lt;br /&gt;
											fontSize: &amp;#039;12px&amp;#039;,&lt;br /&gt;
											height: &amp;#039;130px&amp;#039;&lt;br /&gt;
										// TODO: remove this after testing&lt;br /&gt;
										}).html( testTxt )&lt;br /&gt;
								)&lt;br /&gt;
						)&lt;br /&gt;
				).append(&lt;br /&gt;
					$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; )&lt;br /&gt;
						.attr( &amp;#039;id&amp;#039;, &amp;#039;projectStatusPreview&amp;#039; )&lt;br /&gt;
						.css({&lt;br /&gt;
							backgroundColor: &amp;#039;#FDFFE7&amp;#039;,&lt;br /&gt;
							border: &amp;#039;1px solid #FCEB92&amp;#039;,&lt;br /&gt;
							padding: &amp;#039;5px&amp;#039;,&lt;br /&gt;
							height: &amp;#039;310px&amp;#039;,&lt;br /&gt;
							overflowY: &amp;#039;scroll&amp;#039;,&lt;br /&gt;
							marginBottom: &amp;#039;5px&amp;#039;&lt;br /&gt;
						}).hide()&lt;br /&gt;
				)/*&lt;br /&gt;
				.append(&lt;br /&gt;
					$(&amp;#039;&amp;lt;button&amp;gt;&amp;#039;)&lt;br /&gt;
						.attr({&amp;#039;id&amp;#039;: &amp;#039;projectStatusBackBtn&amp;#039;})&lt;br /&gt;
						.text( &amp;#039;Back&amp;#039; )&lt;br /&gt;
						.click( function( e ) {&lt;br /&gt;
							e.preventDefault();&lt;br /&gt;
							_this.back();&lt;br /&gt;
						}).hide()&lt;br /&gt;
				).append(&lt;br /&gt;
					$( &amp;#039;&amp;lt;button&amp;gt;&amp;#039; )&lt;br /&gt;
						.attr({&amp;#039;id&amp;#039;: &amp;#039;projectStatusPreviewBtn&amp;#039;})&lt;br /&gt;
						.text( &amp;#039;Preview&amp;#039; )&lt;br /&gt;
						.click( function( e ) {&lt;br /&gt;
							e.preventDefault();&lt;br /&gt;
							_this.preview();&lt;br /&gt;
						})&lt;br /&gt;
				).append(&lt;br /&gt;
					$( &amp;#039;&amp;lt;button&amp;gt;&amp;#039; )&lt;br /&gt;
						.attr({&amp;#039;id&amp;#039;: &amp;#039;&amp;#039;})&lt;br /&gt;
						.text( &amp;#039;Publish&amp;#039; )&lt;br /&gt;
						.click( function( e ) {&lt;br /&gt;
							e.preventDefault();&lt;br /&gt;
							_this.publish();&lt;br /&gt;
						})&lt;br /&gt;
				)*/;&lt;br /&gt;
&lt;br /&gt;
		this.uneditedDescription = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		var projectPages = [&lt;br /&gt;
			&amp;#039;Wikimedia_Features_engineering&amp;#039;,&lt;br /&gt;
			&amp;#039;Wikimedia_Platform_Engineering&amp;#039;,&lt;br /&gt;
			&amp;#039;Wikimedia_Mobile_engineering&amp;#039;,&lt;br /&gt;
			&amp;#039;Wikimedia_Language_engineering&amp;#039;&lt;br /&gt;
		];&lt;br /&gt;
		//{{Wikimedia project index line|TimedMediaHandler}}&lt;br /&gt;
		var lookFor = &amp;#039;{{Wikimedia project index line|&amp;#039;;&lt;br /&gt;
		// Testing getPages&lt;br /&gt;
		this.getPages( projectPages, function( pages ) {&lt;br /&gt;
			for ( var page in pages ) {&lt;br /&gt;
				_this.scrubPage(&lt;br /&gt;
					pages[page],&lt;br /&gt;
					lookFor,&lt;br /&gt;
					buildProjectsObject&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
			_this.updateStatusLink();&lt;br /&gt;
			_this.fillDescriptionField();&lt;br /&gt;
		} );&lt;br /&gt;
&lt;br /&gt;
		function buildProjectsObject( title, names ) {&lt;br /&gt;
			var $projectSel = $modalElements.find( &amp;#039;#projectStatusName&amp;#039; );&lt;br /&gt;
			var $projectGroup = $( &amp;#039;&amp;lt;optgroup&amp;gt;&amp;#039; ).attr( &amp;#039;label&amp;#039;, title );&lt;br /&gt;
			var name;&lt;br /&gt;
&lt;br /&gt;
			for ( var i = 0; i &amp;lt; names.length; i++ ) {&lt;br /&gt;
				name = names[i]&lt;br /&gt;
					.replace( lookFor, &amp;#039;&amp;#039; )&lt;br /&gt;
					.replace( &amp;#039;}}&amp;#039;, &amp;#039;&amp;#039; );&lt;br /&gt;
				$projectGroup&lt;br /&gt;
					.append(&lt;br /&gt;
						$(&amp;#039;&amp;lt;option&amp;gt;&amp;#039;)&lt;br /&gt;
							.attr( &amp;#039;value&amp;#039;, name )&lt;br /&gt;
							.prop( &amp;#039;selected&amp;#039;, name === _this.project.name )&lt;br /&gt;
							.text( name )&lt;br /&gt;
				);&lt;br /&gt;
			}&lt;br /&gt;
			$projectSel.append( $projectGroup );&lt;br /&gt;
		}&lt;br /&gt;
		$( &amp;#039;#psh-dialog&amp;#039; ).remove();&lt;br /&gt;
		// add to the DOM&lt;br /&gt;
		$( &amp;#039;body&amp;#039; ).append(&lt;br /&gt;
			$( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).attr({&lt;br /&gt;
				id: &amp;#039;psh-dialog&amp;#039;,&lt;br /&gt;
				title: &amp;#039;Project Status Helper&amp;#039;&lt;br /&gt;
			})&lt;br /&gt;
			.append(&lt;br /&gt;
				$modalElements&lt;br /&gt;
			)&lt;br /&gt;
			.hide()&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
		mw.loader.using( [&amp;#039;jquery.ui.dialog&amp;#039;, &amp;#039;jquery.ui.datepicker&amp;#039;], function() {&lt;br /&gt;
			$( &amp;#039;#psh-dialog&amp;#039; ).dialog({&lt;br /&gt;
				height: &amp;#039;auto&amp;#039;,&lt;br /&gt;
				width: 800,&lt;br /&gt;
				modal: true,&lt;br /&gt;
				buttons: [&lt;br /&gt;
					{&lt;br /&gt;
						id: &amp;#039;projectStatusBackBtn&amp;#039;,&lt;br /&gt;
						text: &amp;#039;Back&amp;#039;,&lt;br /&gt;
						click: function() {&lt;br /&gt;
							_this.back();&lt;br /&gt;
						}&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						id: &amp;#039;projectStatusPreviewBtn&amp;#039;,&lt;br /&gt;
						text: &amp;#039;Preview&amp;#039;,&lt;br /&gt;
						click: function() {&lt;br /&gt;
							_this.preview();&lt;br /&gt;
						}&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						id: &amp;#039;projectStatusPublishBtn&amp;#039;,&lt;br /&gt;
						text: &amp;#039;Publish&amp;#039;,&lt;br /&gt;
						click: function() {&lt;br /&gt;
							_this.publish();&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				]&lt;br /&gt;
			});&lt;br /&gt;
			// hide preview back button&lt;br /&gt;
			$( &amp;#039;#projectStatusBackBtn&amp;#039; ).hide();&lt;br /&gt;
			// datepicker that&lt;br /&gt;
			$( &amp;#039;#projectStatusDate&amp;#039; )&lt;br /&gt;
				.datepicker({&amp;#039;dateFormat&amp;#039;: &amp;#039;yy-mm-dd&amp;#039;});&lt;br /&gt;
		});&lt;br /&gt;
		this.$modal = $( &amp;#039;#psh-dialog&amp;#039; );&lt;br /&gt;
		return this;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.scrubPage = function( page, lookFor, callback ) {&lt;br /&gt;
		var lines, i;&lt;br /&gt;
		var found = [];&lt;br /&gt;
		var content = page.revisions[0][&amp;#039;*&amp;#039;];&lt;br /&gt;
		var title = page.title;&lt;br /&gt;
&lt;br /&gt;
		if ( content.length &amp;gt; 0 ) {&lt;br /&gt;
			lines = content.split( /\n/ );&lt;br /&gt;
&lt;br /&gt;
			// Loop through lines&lt;br /&gt;
			for ( i = 0; i &amp;lt; lines.length; i++ ) {&lt;br /&gt;
				if ( lines[i].indexOf( lookFor ) !== -1 ) {&lt;br /&gt;
					found.push(&lt;br /&gt;
						lines[i]&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			callback( title, found );&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.addStatus = function() {&lt;br /&gt;
		var _this = this,&lt;br /&gt;
			summary = &amp;#039;new status update&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// Send the wikitext to the parser for rendering&lt;br /&gt;
		$.ajax({&lt;br /&gt;
			url: mw.util.wikiScript( &amp;#039;api&amp;#039; ),&lt;br /&gt;
			data: {&lt;br /&gt;
				action: &amp;#039;edit&amp;#039;,&lt;br /&gt;
				// Project page name...&lt;br /&gt;
				title: this.pageName,&lt;br /&gt;
				//appendtext: this.wikitext,&lt;br /&gt;
				text: this.wikitext,&lt;br /&gt;
				token: mw.user.tokens.get( &amp;#039;editToken&amp;#039; ),&lt;br /&gt;
				format: &amp;#039;json&amp;#039;,&lt;br /&gt;
				summary: summary,&lt;br /&gt;
				notminor: true&lt;br /&gt;
			},&lt;br /&gt;
			dataType: &amp;#039;json&amp;#039;,&lt;br /&gt;
			type: &amp;#039;POST&amp;#039;,&lt;br /&gt;
			success: function( data ) {&lt;br /&gt;
				if ( data &amp;amp;&amp;amp; data.edit &amp;amp;&amp;amp; data.edit.result === &amp;#039;Success&amp;#039; ) {&lt;br /&gt;
					_this.hideSpinner();&lt;br /&gt;
					window.location.reload( true );&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			error: function() {}&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.getPages = function( titles, callback ) {&lt;br /&gt;
		var pagesQuery = $.isArray( titles ) ? titles.join( &amp;#039;|&amp;#039; ) : titles;&lt;br /&gt;
		$.ajax({&lt;br /&gt;
			url: mw.util.wikiScript( &amp;#039;api&amp;#039; ),&lt;br /&gt;
			data: {&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				format: &amp;#039;json&amp;#039;,&lt;br /&gt;
				titles: pagesQuery,&lt;br /&gt;
				prop: &amp;#039;revisions&amp;#039;,&lt;br /&gt;
				rvprop: &amp;#039;content&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			dataType: &amp;#039;json&amp;#039;,&lt;br /&gt;
			type: &amp;#039;GET&amp;#039;,&lt;br /&gt;
			cache: &amp;#039;false&amp;#039;,&lt;br /&gt;
			success: function( data ) {&lt;br /&gt;
				if ( data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.pages ) {&lt;br /&gt;
					// return pages to callback&lt;br /&gt;
					if( typeof callback === &amp;#039;function&amp;#039; ) {&lt;br /&gt;
						callback( data.query.pages );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			error: function() {&lt;br /&gt;
				if( typeof callback === &amp;#039;function&amp;#039; ) {&lt;br /&gt;
					callback( {} );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	/* quick and dirty validation form */&lt;br /&gt;
	Psh.prototype.validate = function() {&lt;br /&gt;
		for ( var prop in this.project ) {&lt;br /&gt;
			if ( this.project[prop] === &amp;#039;&amp;#039; ) {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return true;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.fillDescriptionField = function() {&lt;br /&gt;
		var _this = this;&lt;br /&gt;
		var $descField = _this.$modal.find( &amp;#039;#projectStatusUpdateDescription&amp;#039; );&lt;br /&gt;
		var currentdesc = $descField.val();&lt;br /&gt;
		if ( this.uneditedDescription != currentdesc &amp;amp;&amp;amp; currentdesc != &amp;#039;&amp;#039; ) {&lt;br /&gt;
			if ( !confirm( &amp;#039;Replace existing entry with content from date (if available)?&amp;#039; ) ) {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		this.setupProject();&lt;br /&gt;
		if ( this.project.name == &amp;#039;&amp;#039; ) {&lt;br /&gt;
			_this.pageContent = &amp;#039;&amp;#039;;&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
		this.getPages( this.pageName, function( pages ) {&lt;br /&gt;
			_this.fillStatusPageContent( pages );&lt;br /&gt;
			var splitEntry = _this.getStatusPageSplitAtDate( _this.project.date );&lt;br /&gt;
			var desc = _this.stripEntry( splitEntry[&amp;#039;middle&amp;#039;] );&lt;br /&gt;
			$descField.val( desc );&lt;br /&gt;
			_this.uneditedDescription = desc;&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.stripEntry = function( content ) {&lt;br /&gt;
		// strip the title&lt;br /&gt;
		content = content.replace( /^== *([^= ]*) *==\n\n?/m, &amp;#039;&amp;#039; );&lt;br /&gt;
		// ...and the begin and end tags&lt;br /&gt;
		content = content.replace( /^\s*&amp;lt;section[\s]+begin[^&amp;gt;]*\/&amp;gt;\s*\n?/mg, &amp;#039;&amp;#039; );&lt;br /&gt;
		content = content.replace( /&amp;lt;section[\s]+end[^&amp;gt;]*\/&amp;gt;\s*\n?$/mg, &amp;#039;&amp;#039; );&lt;br /&gt;
		return content;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.fillStatusPageContent = function( pages ) {&lt;br /&gt;
		// use only first page in pages object.&lt;br /&gt;
		for ( var page in pages ) {&lt;br /&gt;
			// if page exists the title will be in the returned object&lt;br /&gt;
			if ( pages[page].hasOwnProperty( &amp;#039;revisions&amp;#039; ) ) {&lt;br /&gt;
				// save wikitext, if page empty pageContent will be &amp;#039;&amp;#039;&lt;br /&gt;
				this.pageContent = pages[page].revisions[0][&amp;#039;*&amp;#039;];&lt;br /&gt;
			} else {&lt;br /&gt;
				// page does not exist&lt;br /&gt;
				this.pageContent = &amp;#039;&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	/* query for page */&lt;br /&gt;
	Psh.prototype.publish = function() {&lt;br /&gt;
		var _this = this;&lt;br /&gt;
&lt;br /&gt;
		this.showSpinner();&lt;br /&gt;
		this.setupProject();&lt;br /&gt;
		//console.log( this.project );&lt;br /&gt;
		if ( this.validate() === false ) {&lt;br /&gt;
			alert( &amp;#039;Project name, date, and description are required.&amp;#039; );&lt;br /&gt;
			this.hideSpinner();&lt;br /&gt;
			return ;&lt;br /&gt;
		}&lt;br /&gt;
		this.getPages( this.pageName, function( pages ) {&lt;br /&gt;
			_this.fillStatusPageContent( pages );&lt;br /&gt;
			_this.prepareContentAndUpdate();&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.setupProject = function() {&lt;br /&gt;
		var $helperForm = this.$modal.find( &amp;#039;#projectStatusHelperForm&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
		this.project = {&lt;br /&gt;
			date: $helperForm.find( &amp;#039;#projectStatusDate&amp;#039; ).val(),&lt;br /&gt;
			name: $helperForm.find( &amp;#039;#projectStatusName&amp;#039; ).val(),&lt;br /&gt;
			monthly: $helperForm.find( &amp;#039;#projectStatusMonthlyFlag&amp;#039; ).prop( &amp;#039;checked&amp;#039; ),&lt;br /&gt;
			desc: $helperForm.find( &amp;#039;#projectStatusUpdateDescription&amp;#039; ).val()&lt;br /&gt;
		};&lt;br /&gt;
		// if monthly status update&lt;br /&gt;
		if ( this.project.monthly ) {&lt;br /&gt;
			this.project.date = this.project.date.substring( 0, 8 ) + &amp;#039;monthly&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		this.project.latestUpdate = &amp;#039;Last update on: &amp;lt;section begin=&amp;quot;latest&amp;quot;/&amp;gt;&amp;#039; +&lt;br /&gt;
			this.project.date + &amp;#039;&amp;lt;section end=&amp;quot;latest&amp;quot;/&amp;gt;&amp;#039;;&lt;br /&gt;
		this.wikitext = &amp;#039;&amp;#039;;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.getStatusPageSplitAtDate = function( splitDate ) {&lt;br /&gt;
		var statusLines = [],&lt;br /&gt;
			lookFor = &amp;#039;&amp;#039;;&lt;br /&gt;
		// for replacement, gather text before and after entry&lt;br /&gt;
		var splitEntry = {&lt;br /&gt;
			&amp;#039;firstline&amp;#039;: &amp;#039;&amp;#039;,&lt;br /&gt;
			&amp;#039;before&amp;#039;: &amp;#039;&amp;#039;,&lt;br /&gt;
			&amp;#039;middle&amp;#039;: &amp;#039;&amp;#039;,&lt;br /&gt;
			&amp;#039;after&amp;#039;: &amp;#039;&amp;#039;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		if ( this.pageContent.length &amp;gt; 0 ) {&lt;br /&gt;
			statusLines = this.pageContent.split( /\n/ );&lt;br /&gt;
			splitEntry[&amp;#039;firstline&amp;#039;] = statusLines[0] + &amp;#039;\n&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			var datematch = null;&lt;br /&gt;
			var splitState = &amp;#039;before&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			// skip the first line, populate &amp;#039;before&amp;#039;, &amp;#039;middle&amp;#039;, and &amp;#039;after&amp;#039;&lt;br /&gt;
			for ( var i = 1; i &amp;lt; statusLines.length; i++ ) {&lt;br /&gt;
				datematch = statusLines[i].match( /^== *([^= ]*) *==$/ );&lt;br /&gt;
				if ( datematch != null ) {&lt;br /&gt;
					if ( datematch[1] == splitDate ) {&lt;br /&gt;
						splitState = &amp;#039;middle&amp;#039;;&lt;br /&gt;
					} else if ( splitState == &amp;#039;middle&amp;#039; ) {&lt;br /&gt;
						// we must be starting a new section&lt;br /&gt;
						splitState = &amp;#039;after&amp;#039;;&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
				}&lt;br /&gt;
				splitEntry[splitState] += statusLines[i] + &amp;#039;\n&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		return splitEntry;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * replace this.wikitext with new version containing latest update,&lt;br /&gt;
	 * then push it to the wiki.&lt;br /&gt;
	 */&lt;br /&gt;
	Psh.prototype.prepareContentAndUpdate = function() {&lt;br /&gt;
		var splitEntry = this.getStatusPageSplitAtDate( this.project.date );&lt;br /&gt;
		if( splitEntry[&amp;#039;middle&amp;#039;] != &amp;#039;&amp;#039; ) {&lt;br /&gt;
			if ( confirm( &amp;#039;Replace existing entry?&amp;#039; ) ) {&lt;br /&gt;
				splitstate = &amp;#039;middle&amp;#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				//console.log( &amp;#039;abort&amp;#039; );&lt;br /&gt;
				this.hideSpinner();&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		this.wikitext = this.project.latestUpdate + &amp;#039;\n&amp;#039;;&lt;br /&gt;
		this.wikitext += splitEntry[&amp;#039;before&amp;#039;];&lt;br /&gt;
		if( splitEntry[&amp;#039;middle&amp;#039;] == &amp;#039;&amp;#039; ) {&lt;br /&gt;
			this.wikitext = this.wikitext.replace( /\n*$/m, &amp;#039;\n\n&amp;#039; );&lt;br /&gt;
		}&lt;br /&gt;
		this.wikitext += this.buildWikitext();&lt;br /&gt;
		this.wikitext += splitEntry[&amp;#039;after&amp;#039;];&lt;br /&gt;
		this.addStatus();&lt;br /&gt;
		return true;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.buildWikitext = function() {&lt;br /&gt;
		var retval = &amp;#039;&amp;#039;;&lt;br /&gt;
		retval = &amp;#039;== &amp;#039; + this.project.date + &amp;#039; ==\n\n&amp;#039;;&lt;br /&gt;
		retval += &amp;#039;&amp;lt;section begin=&amp;quot;&amp;#039;+ this.project.date + &amp;#039;&amp;quot;/&amp;gt;&amp;#039; +&lt;br /&gt;
			this.project.desc + &amp;#039;&amp;lt;section end=&amp;quot;&amp;#039; + this.project.date + &amp;#039;&amp;quot;/&amp;gt;&amp;#039;;&lt;br /&gt;
		retval += &amp;#039;\n\n&amp;#039;;&lt;br /&gt;
		return retval;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.preview = function() {&lt;br /&gt;
		var _this = this;&lt;br /&gt;
&lt;br /&gt;
		$( &amp;#039;#projectStatusPreviewBtn&amp;#039; ).hide();&lt;br /&gt;
		$( &amp;#039;#projectStatusBackBtn&amp;#039; ).show();&lt;br /&gt;
&lt;br /&gt;
		this.showSpinner();&lt;br /&gt;
		this.setupProject();&lt;br /&gt;
		wikitext = this.buildWikitext();&lt;br /&gt;
&lt;br /&gt;
		// Send the wikitext to the parser for rendering&lt;br /&gt;
		$.ajax({&lt;br /&gt;
			url: mw.util.wikiScript( &amp;#039;api&amp;#039; ),&lt;br /&gt;
			data: {&lt;br /&gt;
				&amp;#039;action&amp;#039;: &amp;#039;parse&amp;#039;,&lt;br /&gt;
				&amp;#039;title&amp;#039;: this.pageName,&lt;br /&gt;
				&amp;#039;format&amp;#039;: &amp;#039;json&amp;#039;,&lt;br /&gt;
				&amp;#039;text&amp;#039;: wikitext,&lt;br /&gt;
				&amp;#039;prop&amp;#039;: &amp;#039;text&amp;#039;,&lt;br /&gt;
				&amp;#039;pst&amp;#039;: true&lt;br /&gt;
			},&lt;br /&gt;
			dataType: &amp;#039;json&amp;#039;,&lt;br /&gt;
			type: &amp;#039;POST&amp;#039;,&lt;br /&gt;
			success: function ( data ) {&lt;br /&gt;
				_this.$modal.find( &amp;#039;#projectStatusPreview&amp;#039; )&lt;br /&gt;
					.html( data.parse.text[&amp;#039;*&amp;#039;] )&lt;br /&gt;
					.show()&lt;br /&gt;
					.prev()&lt;br /&gt;
					.hide();&lt;br /&gt;
				_this.$modal.find( &amp;#039;.editsection&amp;#039; ).remove();&lt;br /&gt;
				_this.hideSpinner();&lt;br /&gt;
			},&lt;br /&gt;
			error: function() {}&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.back = function() {&lt;br /&gt;
		$( &amp;#039;#projectStatusHelperInput, #projectStatusPreviewBtn&amp;#039; ).show();&lt;br /&gt;
		$( &amp;#039;#projectStatusPreview, #projectStatusBackBtn&amp;#039; ).hide();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.showSpinner = function() {&lt;br /&gt;
		this.$modal&lt;br /&gt;
			.find( &amp;#039;.mw-ajax-loader&amp;#039; )&lt;br /&gt;
			.show();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.hideSpinner = function() {&lt;br /&gt;
		this.$modal&lt;br /&gt;
			.find( &amp;#039;.mw-ajax-loader&amp;#039; )&lt;br /&gt;
			.hide();&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	Psh.prototype.updateStatusLink = function() {&lt;br /&gt;
		var path = mw.config.get( &amp;#039;wgServer&amp;#039; ) + mw.config.get( &amp;#039;wgArticlePath&amp;#039; ),&lt;br /&gt;
		$inputElement =&lt;br /&gt;
			this.$modal&lt;br /&gt;
			.find( &amp;#039;#projectStatusName&amp;#039; );&lt;br /&gt;
		var selectedProject = $inputElement.val();&lt;br /&gt;
&lt;br /&gt;
		if( selectedProject != &amp;#039;&amp;#039; ) {&lt;br /&gt;
			this.pageName = $inputElement.val() + &amp;#039;/status&amp;#039;;&lt;br /&gt;
			this.pageURL = path.replace( &amp;#039;$1&amp;#039;, this.pageName );&lt;br /&gt;
&lt;br /&gt;
			$( &amp;#039;#projectLink&amp;#039; )&lt;br /&gt;
				.attr( &amp;#039;href&amp;#039;, this.pageURL )&lt;br /&gt;
				.text( this.pageName );&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	$( document ).ready( function() {&lt;br /&gt;
		// Add a link to the toolbox&lt;br /&gt;
		var link = mw.util.addPortletLink(&lt;br /&gt;
			&amp;#039;p-tb&amp;#039;,&lt;br /&gt;
			&amp;#039;#&amp;#039;,&lt;br /&gt;
			&amp;#039;Project Status&amp;#039;,&lt;br /&gt;
			&amp;#039;t-prettylinkwidget&amp;#039;,&lt;br /&gt;
			&amp;#039;Dialog to help you submit your project updates&amp;#039;,&lt;br /&gt;
			null,&lt;br /&gt;
			&amp;#039;#t-projectstatushelper&amp;#039;&lt;br /&gt;
		);&lt;br /&gt;
		// Setup link click event&lt;br /&gt;
		$( link ).click( function( e ) {&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
			var psh = new Psh();&lt;br /&gt;
			$( &amp;#039;#projectStatusHelperInput div&amp;#039; ).css({&lt;br /&gt;
				&amp;#039;margin-top&amp;#039;: &amp;#039;10px&amp;#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// override edit links on project pages&lt;br /&gt;
		$( &amp;#039;.mw-statushelper-editlink &amp;gt; a&amp;#039; ).each( function( i ) {&lt;br /&gt;
			$( this ).click( function( event ) {&lt;br /&gt;
				event.preventDefault();&lt;br /&gt;
				var projectObj = {};&lt;br /&gt;
				projectObj.name = $( &amp;#039;.mw-statushelper-editlink&amp;#039; )[i].getAttribute( &amp;#039;data-statuspage&amp;#039; ).replace( &amp;#039;/status&amp;#039;, &amp;#039;&amp;#039; );&lt;br /&gt;
				projectObj.date = $( &amp;#039;.mw-statushelper-editlink&amp;#039; )[i].getAttribute( &amp;#039;data-entrydate&amp;#039; );&lt;br /&gt;
				var psh = new Psh( projectObj );&lt;br /&gt;
				$( &amp;#039;#projectStatusHelperInput div&amp;#039; ).css({&lt;br /&gt;
					&amp;#039;margin-top&amp;#039;: &amp;#039;10px&amp;#039;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// override add links on project pages&lt;br /&gt;
		$( &amp;#039;.mw-statushelper-addlink &amp;gt; a&amp;#039; ).each( function( i ) {&lt;br /&gt;
			$( this ).click( function( event ) {&lt;br /&gt;
				event.preventDefault();&lt;br /&gt;
				var projectObj = {};&lt;br /&gt;
				projectObj.name = $( &amp;#039;.mw-statushelper-addlink&amp;#039; )[i].getAttribute( &amp;#039;data-statuspage&amp;#039; ).replace( &amp;#039;/status&amp;#039;, &amp;#039;&amp;#039; );&lt;br /&gt;
				var psh = new Psh( projectObj );&lt;br /&gt;
				$( &amp;#039;#projectStatusHelperInput div&amp;#039; ).css({&lt;br /&gt;
					&amp;#039;margin-top&amp;#039;: &amp;#039;10px&amp;#039;&lt;br /&gt;
				});&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
})( mediaWiki, jQuery );&lt;/div&gt;</summary>
		<author><name>Ahenket</name></author>
	</entry>
</feed>