User:Ioeth/friendlywelcome.js

From Wikipedia, the free encyclopedia

Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.

// <nowiki>
// If FriendlyConfig aint exist.
if( typeof( FriendlyConfig ) == 'undefined' ) {
	FriendlyConfig = {};
}
 
/**
 FriendlyConfig.summaryAd ( string )
 If ad should be added or not to summary, default [[WP:FRIENDLY|Friendly]]
 */
if( typeof( FriendlyConfig.summaryAd ) == 'undefined' ) {
	FriendlyConfig.summaryAd = " using [[WP:FRIENDLY|Friendly]]";
}
 
/**
 FriendlyConfig.topWelcomes ( boolean )
 */
if( typeof( FriendlyConfig.topWelcomes ) == 'undefined' ) {
	FriendlyConfig.topWelcomes = false;
}
 
/**
 FriendlyConfig.watchWelcomes ( boolean )
 */
if( typeof( FriendlyConfig.watchWelcomes ) == 'undefined' ) {
	FriendlyConfig.watchWelcomes = true;
}
 
/**
 FriendlyConfig.insertHeadings ( boolean )
 */
if( typeof( FriendlyConfig.insertHeadings ) == 'undefined' ) {
	FriendlyConfig.insertHeadings = true;
}
 
/**
 FriendlyConfig.welcomeHeading ( string )
 */
if( typeof( FriendlyConfig.welcomeHeading ) == 'undefined' ) {
	FriendlyConfig.welcomeHeading = "== Welcome ==";
}
 
/**
 FriendlyConfig.insertUsername ( boolean )
 */
if( typeof( FriendlyConfig.insertUsername ) == 'undefined' ) {
	FriendlyConfig.insertUsername = true;
}
 
/**
 FriendlyConfig.insertSignature ( boolean )
 */
if( typeof( FriendlyConfig.insertSignature ) == 'undefined' ) {
	FriendlyConfig.insertSignature = true;
}
 
/**
 FriendlyConfig.markWelcomesAsMinor ( boolean )
 */
if( typeof( FriendlyConfig.markWelcomesAsMinor ) == 'undefined' ) {
	FriendlyConfig.markWelcomesAsMinor = true;
}
 
/**
 FriendlyConfig.quickWelcomeMode ( String )
 */
if( typeof( FriendlyConfig.quickWelcomeMode ) == 'undefined' ) {
	FriendlyConfig.quickWelcomeMode = "auto";
}
 
/**
 FriendlyConfig.quickWelcomeTemplate ( String )
 */
if( typeof( FriendlyConfig.quickWelcomeTemplate ) == 'undefined' ) {
	FriendlyConfig.quickWelcomeTemplate = "Welcome";
}
 
/**
 FriendlyConfig.maskTemplateInSummary ( boolean )
 */
if( typeof( FriendlyConfig.maskTemplateInSummary ) == 'undefined' ) {
	FriendlyConfig.maskTemplateInSummary = true;
}
 
addOnloadHook( function() {
		if( QueryString.exists( 'friendlywelcome' ) ) {
			if( QueryString.get( 'friendlywelcome' == 'auto' ) ) {
				friendlywelcome.auto();
			} else {
				friendlywelcome.semiauto();
			}
		} else {
			friendlywelcome.normal();
		}
	}
);
 
friendlywelcome = {
	auto: function() {
		if( QueryString.get( 'action' ) != 'edit' ) {
			// userpage not empty, aborting auto-welcome
			return;
		}
 
		return friendlywelcome.welcome();
	},
	semiauto: function()  {
		friendlywelcome.callback( wgTitle.split( '/' )[0].replace( /\"/, "\\\"") );
	},
	normal: function() {
		if( QueryString.exists( 'diff' ) ) {
			// all nodes with "New user account"
			var oSet1 = '//div[@id="mw-diff-otitle2"]';
			var nSet1 = '//div[@id="mw-diff-ntitle2"]';
			// all nodes with empty talk page
			var oSet2 = '//div[@id="mw-diff-otitle2"][contains(a[2][@class="new"], "Talk")]';
			var nSet2 = '//div[@id="mw-diff-ntitle2"][contains(a[2][@class="new"], "Talk")]';
			// intersection of set1 and set2 is new user accounts with empty talk pages
			var oXPath = '(' + oSet1 + ')[count(.|' + oSet2 + ')=count(' + oSet2 + ')]';
			var nXPath = '(' + nSet1 + ')[count(.|' + nSet2 + ')=count(' + nSet2 + ')]';
			var oList = document.evaluate( oXPath, document, null,  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
			var nList = document.evaluate( nXPath, document, null,  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
 
			var spanTag = function( color, content ) {
				var span = document.createElement( 'span' );
				span.style.color = color;
				span.appendChild( document.createTextNode( content ) );
				return span;
			}
 
			var welcomeNode = document.createElement('strong');
			var welcomeLink = document.createElement('a');
			welcomeLink.appendChild( spanTag( 'Black', '[' ) );
			welcomeLink.appendChild( spanTag( 'Goldenrod', 'welcome' ) );
			welcomeLink.appendChild( spanTag( 'Black', ']' ) );
			welcomeNode.appendChild(welcomeLink);
 
			for(var i = 0; i < oList.snapshotLength; ++i ) {
				var current = oList.snapshotItem(i);
 
				var href = document.evaluate( 'a[2]/@href', current, null, XPathResult.STRING_TYPE, null ).stringValue;
 
				var tmpNode = welcomeNode.cloneNode( true );
				tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'friendlywelcome': 'norm' } )
						+ '&' + QueryString.create( { 'vanarticle': wgPageName.replace(/_/g, ' ') } ) );
				current.appendChild( document.createTextNode( ' ' ) );
				current.appendChild( tmpNode );
			}
 
			for(var i = 0; i < nList.snapshotLength; ++i ) {
				var current = nList.snapshotItem(i);
 
				var href = document.evaluate( 'a[2]/@href', current, null, XPathResult.STRING_TYPE, null ).stringValue;
 
				var tmpNode = welcomeNode.cloneNode( true );
				tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'friendlywelcome': 'norm' } )
						+ '&' + QueryString.create( { 'vanarticle': wgPageName.replace(/_/g, ' ') } ) );
				current.appendChild( document.createTextNode( ' ' ) );
				current.appendChild( tmpNode );
			}
		}
		if( wgNamespaceNumber == 3 ) {
			var username = wgTitle.split( '/' )[0].replace( /\"/, "\\\""); // only first part before any slashes
 
			addPortletLink( 'p-cactions', "javascript:friendlywelcome.callback(\"" + username + "\")", "welcome", "friendly-welcome", "Welcome user", "");
		}
	}
}
 
friendlywelcome.welcome = function welcomeUser() {
	Status.init( document.getElementById('bodyContent') );
 
	var params = {
		value: FriendlyConfig.quickWelcomeTemplate,
		article: QueryString.exists( 'vanarticle' ) ? QueryString.get( 'vanarticle' ) : '',
		mode: 'auto'
	};
 
	var query = { 
		'title': wgPageName, 
		'action': 'submit'
	};
	Wikipedia.actionCompleted.redirect = wgPageName;
	Wikipedia.actionCompleted.notice = "Welcoming complete, reloading talk page in some seconds";
	var wikipedia_wiki = new Wikipedia.wiki( 'User talk page modification', query, friendlywelcome.callbacks.main );
	wikipedia_wiki.params = params;
	wikipedia_wiki.get();
}
 
friendlywelcome.callback = function friendlywelcomeCallback( uid ) {
	if( uid == wgUserName ){
		alert( 'You don\'t need to welcome yourself, do you?' );
		return;
	}
 
	var Window = new SimpleWindow( 600, 400 );
	Window.setTitle( "Choose a welcome template" ); 
	var form = new QuickForm( friendlywelcome.callback.evaluate, 'change' );
 
	form.append( {
			type: 'input',
			name: 'article',
			label: 'Linked article (if supported by template)',
			value:( QueryString.exists( 'vanarticle' ) ? QueryString.get( 'vanarticle' ) : '' ),
			tooltip: 'An article might be linked to the welcome if the template supports it. Leave empty for no artice to be linked.  Templates that support a linked article are marked with an asterisk.  Ignored for templates that do not support a linked article.',
			event: function( event ) {
				event.stopPropagation();
			}
		}
	);
 
	form.append( { type:'header', label:'Simple templates' } );
	form.append( { type: 'radio', name: 'simple', list: friendlywelcome.standardList } );
 
	form.append( { type:'header', label:'Welcoming committee templates' } );
	form.append( { type: 'radio', name: 'welcomingCommittee', list: friendlywelcome.welcomingCommitteeList } );
 
	form.append( { type:'header', label:'Potential problem user templates' } );
	form.append( { type: 'radio', name: 'problem', list: friendlywelcome.problemList } );
 
	form.append( { type:'header', label:'Anonymous user templates' } );
	form.append( { type: 'radio', name: 'anonymous', list: friendlywelcome.anonymousList } );
 
	var result = form.render();
	Window.setContent( result );
	Window.display();
}
 
friendlywelcome.standardList = [
	{
		label: '{{Welcome}}: standard welcome*',
		value: 'Welcome' },
	{ 
		label: '{{Welcomeshort}}: short welcome',
		value: 'Welcomeshort',
		tooltip: 'Includes section heading.' },
	{ 
		label: '{{WelcomeSimple}}: simple welcome',
		value: 'WelcomeSimple',
		tooltip: 'Won\'t overwhelm new users.  Includes section heading.' },
	{
		label: '{{Welcom}}: very short and simple welcome',
		value: 'Welcom',
		tooltip: 'Shortest welcome template available.  Includes section heading and signature.' },
	{
		label: '{{Welcome-personal}}: includes a plate of cookies',
		value: 'Welcome-personal',
		tooltip: 'A personal welcome with an introduction from you and a plate of cookies.  Includes section heading and signature.' },
	{ 
		label: '{{WelcomeMenu}}: welcome with menu of links',
		value: 'WelcomeMenu',
		tooltip: 'Contains a welcome message and many useful links broken up into different sections.  Includes signature.' },
	{ 
		label: '{{Welcomeg}}: similar to {{WelcomeMenu}}',
		value: 'Welcomeg',
		tooltip: 'Contains a welcome message and many useful links broken up into different sections.  Includes signature.' },
	{ 
		label: '{{Welcomeh}}: same as {{Welcomeg}} but with a section heading',
		value: 'Welcomeh',
		tooltip: 'Contains a section heading, a welcome message and many useful links broken up into different sections.  Includes section heading and signature.' }
]
 
friendlywelcome.welcomingCommitteeList = [
	{ 
		label: '{{Wel}}: similar to {{Welcome}}, but automatically identifies anonymous and registered users*',
		value: 'Wel',
		tooltip: 'This template checks whether the username contains any letters. If there are any, {{Welcome-reg}} will be shown. If there are none, {{Welcome-anon}} will be shown.' },
	{ 
		label: '{{W-basic}}: standard template, similar to {{Welcome}} with additional options',
		value: 'W-basic',
		tooltip: 'This template is similar to {{Welcome}} but supports many different options.  Includes a signature.' },
	{ 
		label: '{{W-shout}}: extroverted message with bold advice',
		value: 'W-shout',
		tooltip: 'This template is similar to {{WelcomeShout}} but spports many different options.  Includes a signature.' },
	{ 
		label: '{{W-short}}: concise; won\'t overwhelm',
		value: 'W-short',
		tooltip: 'This template is similar to {{Welcomeshort}} but supports many different options.  Includes a signature.' },
	{ 
		label: '{{W-link}}: shortest greeting, links to Welcoming committee\'s greetings page',
		value: 'W-link',
		tooltip: 'This template is similar to {{Welcom}} but supports many different options.  Includes a signature.' },
	{ 
		label: '{{W-graphical}}: graphical menu format to ease transition from the graphic-heavy web',
		value: 'W-graphical',
		tooltip: 'This template is similar to {{Welcomeg}} but has fewer links.  Supports many different options.  Includes a signature.' },
	{ 
		label: '{{W-screen}}: graphical; designed to fit the size of the user\'s screen',
		value: 'W-screen',
		tooltip: 'This template is a nice graphical welcome with many different options.  Includes a signature.' }
]
 
friendlywelcome.problemList = [
	{ 
		label: '{{Welcomelaws}}: welcome with information about copyrights, npov, the sandbox, and vandalism',
		value: 'Welcomelaws' },
	{ 
		label: '{{Welcomevandal}}: for someone whose initial efforts appear to be vandalism*',
		value: 'Welcomevandal',
		tooltip: 'Includes a section heading.' },
	{ 
		label: '{{Welcomenpov}}: for someone whose initial efforts do not adhere to the neutral point of view policy*',
		value: 'Welcomenpov' },
	{ 
		label: '{{Welcomespam}}: welcome with additional discussion of anti-spamming polices*',
		value: 'Welcomespam' },
	{ 
		label: '{{Welcomeunsourced}}: for someone whose initial efforts are uncited*',
		value: 'Welcomeunsourced' }
]
 
friendlywelcome.anonymousList = [
	{
		label: '{{Welcome-anon}}: for anonymous users; encourages getting a username*',
		value: 'Welcome-anon' },
	{
		label: '{{Welcomeanon2}}: similar to {{Welcome-anon}} but with hints and tips*',
		value: 'Welcomeanon2',
		tooltip: 'Includes section heading.' },
	{
		label: '{{Welc-anon}}: similar to {{Welcome-anon}} but with a border and section heading',
		value: 'Welc-anon',
		tooltip: 'Includes section heading.' },
	{
		label: '{{Welcomeunclesam}}: for anonymous users to urge them to create an account',
		value: 'welcomeunclesam' },
	{
		label: '{{Welcome-anon-vandal}}: for anonymous users who have vandalized a page*',
		value: 'Welcome-anon-vandal',
		tooltip: 'Includes a section heading and signature.' }
]
 
// Set to true if template already has heading
friendlywelcome.headingHash = {
	'Welcome': false,
	'Welcomeshort': true,
	'WelcomeSimple': true,
	'Welcom': true,
	'Welcome-personal': true,
	'WelcomeMenu': false,
	'Welcomeg': false,
	'Welcomeh': true,
	'Wel': true,
	'W-basic': false,
	'W-shout': false,
	'W-short': false,
	'W-link': false,
	'W-graphical': false,
	'W-screen': false,
	'Welcomelaws': false,
	'Welcomevandal': true,
	'Welcomenpov': false,
	'Welcomespam': false,
	'Welcomeunsourced': false,
	'Welcome-anon': false,
	'Welcomeanon2': true,
	'Welc-anon': true,
	'Welcomeunclesam': false,
	'Welcome-anon-vandal': true
}
 
// Set to true if template already has signature
friendlywelcome.signatureHash = {
	'Welcome': false,
	'Welcomeshort': false,
	'WelcomeSimple': false,
	'Welcom': true,
	'Welcome-personal': false,
	'WelcomeMenu': true,
	'Welcomeg': true,
	'Welcomeh': true,
	'Wel': false,
	'W-basic': true,
	'W-shout': true,
	'W-short': true,
	'W-link': true,
	'W-graphical': true,
	'W-screen': true,
	'Welcomelaws': false,
	'Welcomevandal': true,
	'Welcomenpov': false,
	'Welcomespam': false,
	'Welcomeunsourced': false,
	'Welcome-anon': false,
	'Welcomeanon2': false,
	'Welc-anon': false,
	'Welcomeunclesam': false,
	'Welcome-anon-vandal': true
}
 
/* Set to true if template supports article
 * name from art template parameter 
 */
friendlywelcome.artHash = {
	'Welcome': true,
	'Welcomeshort': false,
	'WelcomeSimple': false,
	'Welcom': false,
	'Welcome-personal': false,
	'WelcomeMenu': false,
	'Welcomeg': false,
	'Welcomeh': false,
	'Wel': true,
	'W-basic': false,
	'W-shout': false,
	'W-short': false,
	'W-link': false,
	'W-graphical': false,
	'W-screen': false,
	'Welcomelaws': false,
	'Welcomevandal': false,
	'Welcomenpov': false,
	'Welcomespam': false,
	'Welcomeunsourced': false,
	'Welcome-anon': true,
	'Welcomeanon2': true,
	'Welc-anon': false,
	'Welcomeunclesam': false,
	'Welcome-anon-vandal': false
}
 
/* Set to true if template supports article
 * name from vanarticle url parameter 
 */
friendlywelcome.vandalHash = {
	'Welcome': false,
	'Welcomeshort': false,
	'WelcomeSimple': false,
	'Welcom': false,
	'Welcome-personal': false,
	'WelcomeMenu': false,
	'Welcomeg': false,
	'Welcomeh': false,
	'Wel': false,
	'W-basic': false,
	'W-shout': false,
	'W-short': false,
	'W-link': false,
	'W-graphical': false,
	'W-screen': false,
	'Welcomelaws': false,
	'Welcomevandal': true,
	'Welcomenpov': true,
	'Welcomespam': true,
	'Welcomeunsourced': true,
	'Welcome-anon': false,
	'Welcomeanon2': false,
	'Welc-anon': false,
	'Welcomeunclesam': false,
	'Welcome-anon-vandal': true
}
 
friendlywelcome.callbacks = {
	main: function( self ) {
		var form = self.responseXML.getElementById( 'editform' );
 
		// abort if mode is auto and form is not empty
		if( form.wpTextbox1.value != '\n' && self.params.mode == 'auto' ) {
			Status.info( 'Warning', 'User talk page not empty; aborting automatic welcome' );
			Wikipedia.actionCompleted.event();
			return;
		}
 
		var text = '';
		Status.info( 'Info', 'Will add the welcome template to the '
				+ ( FriendlyConfig.topWelcomes ? 'top' : 'bottom' )
				+ ' of the user\'s talk page.' );
		if( !FriendlyConfig.topWelcomes ) {
			text += form.wpTextbox1.value + '\n\n';
		}
 
		if( !friendlywelcome.headingHash[ self.params.value ] && FriendlyConfig.insertHeadings ) {
			Status.info( 'Info', 'Will create a new heading for the welcome' );
			text += FriendlyConfig.welcomeHeading + "\n";
		}
 
		Status.info( 'Info', 'Will substitute the {{' + self.params.value + '}} welcome template' );
		text += '\{\{subst:' + self.params.value;
 
		if( friendlywelcome.artHash[ self.params.value ] ) {
			if( FriendlyConfig.insertUsername ) {
				Status.info( 'Info', 'Will add your username to the template' );
				text += '|' + wgUserName;
			}
 
			if( self.params.article != '' ) {
				Status.info( 'Info', 'Will add article link to the template' );
				text += '|art=' + self.params.article;
			}
		} else if( friendlywelcome.vandalHash[ self.params.value ] ) {
			if( self.params.article != '' ) {
				Status.info( 'Info', 'Will add vandalized article link to the template' );
			}
			text += '|' + self.params.article;
 
			if( FriendlyConfig.insertUsername ) {
				Status.info( 'Info', 'Will add your username to the template' );
				text += '|' + wgUserName;
			}
		} else if( FriendlyConfig.insertUsername ) {
			Status.info( 'Info', 'Will add your username to the template' );
			text += '|' + wgUserName;
		} 
 
		text += '\}\}';
 
		if( !friendlywelcome.signatureHash[ self.params.value ] && FriendlyConfig.insertSignature ) {
			Status.info( 'Info', 'Will add your signature after the welcome' );
			text += ' \n\~\~\~\~';
		}
 
		if( FriendlyConfig.topWelcomes ) {
			text += '\n\n' + form.wpTextbox1.value;
		}
 
		var postData = {
			'wpMinoredit': FriendlyConfig.markWelcomesAsMinor ? 1 : undefined,
			'wpWatchthis': form.wpWatchthis.checked ? 1 : (FriendlyConfig.watchWelcomes ? 1 : undefined),
			'wpStarttime': form.wpStarttime.value,
			'wpEdittime': form.wpEdittime.value,
			'wpAutoSummary': form.wpAutoSummary.value,
			'wpEditToken': form.wpEditToken.value,
			'wpSummary': 'Added ' + ( FriendlyConfig.maskTemplateInSummary ? 'welcome' : ( '\{\{[[Template:' + self.params.value + '|' + self.params.value + ']]\}\}' ) )
					+ ' template to user talk page.' + FriendlyConfig.summaryAd,
			'wpTextbox1': text
		};
 
		self.post( postData );
	}
}
 
friendlywelcome.callback.evaluate = function friendlywelcomeCallbackEvaluate(e) {
	// Ignore if a change to the text field triggered this event
	if( e.target.name == 'article' ) {
		return;
	}
 
	var params = {
		value: e.target.value,
		article: e.target.form.article.value,
		mode: 'manual'
	};
 
	Status.init( e.target.form );
 
	var query = { 
		'title': wgPageName, 
		'action': 'submit'
	};
	Wikipedia.actionCompleted.redirect = wgPageName;
	Wikipedia.actionCompleted.notice = "Welcoming complete, reloading talk page in some seconds";
	var wikipedia_wiki = new Wikipedia.wiki( 'User talk page modification', query, friendlywelcome.callbacks.main );
	wikipedia_wiki.params = params;
	wikipedia_wiki.get();
}
// </nowiki>