MediaWiki:Gadget/Friendly/friendlywelcome.js

// // If FriendlyConfig aint exist. if( typeof( FriendlyConfig ) == 'undefined' ) { FriendlyConfig = {}; }

/** FriendlyConfig.summaryAd ( string ) If ad should be added or not to summary, default Friendly */ if( typeof( FriendlyConfig.summaryAd ) == 'undefined' ) { FriendlyConfig.summaryAd = " using 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; }

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' ) ) { var oXPath = '//div[@id="mw-diff-otitle2"]/span[@class="mw-usertoollinks"]/a[1][@class="new"]'; var nXPath = '//div[@id="mw-diff-ntitle2"]/span[@class="mw-usertoollinks"]/a[1][@class="new"]'; 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 ); if( oList.snapshotLength > 0 || nList.snapshotLength > 0 ) { 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);

if( oList.snapshotLength > 0 ) { var oTalkNode = oList.snapshotItem(0); var oHref = document.evaluate( '@href', oTalkNode, null, XPathResult.STRING_TYPE, null ).stringValue; var oWelcomeNode = welcomeNode.cloneNode( true ); oWelcomeNode.firstChild.setAttribute( 'href', oHref + '&' + QueryString.create( { 'friendlywelcome': 'norm' } ) + '&' + QueryString.create( { 'vanarticle': wgPageName.replace(/_/g, ' ') } ) ); oTalkNode.parentNode.parentNode.appendChild( document.createTextNode( ' ' ) ); oTalkNode.parentNode.parentNode.appendChild( oWelcomeNode ); }               if( nList.snapshotLength > 0 ) { var nTalkNode = nList.snapshotItem(0); var nHref = document.evaluate( '@href', nTalkNode, null, XPathResult.STRING_TYPE, null ).stringValue; var nWelcomeNode = welcomeNode.cloneNode( true ); nWelcomeNode.firstChild.setAttribute( 'href', nHref + '&' + QueryString.create( { 'friendlywelcome': 'norm' } ) + '&' + QueryString.create( { 'vanarticle': wgPageName.replace(/_/g, ' ') } ) ); nTalkNode.parentNode.parentNode.appendChild( document.createTextNode( ' ' ) ); nTalkNode.parentNode.parentNode.appendChild( nWelcomeNode ); }           }        }        if( wgNamespaceNumber == 3 ) { var username = wgTitle.split( '/' )[0].replace( /\"/, "\\\""); // only first part before any slashes

addPortletLink( 'p-cactions', "javascript:friendlywelcome.callback(\"" + username + "\")", "Wel", "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 ) { 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 } );

if( typeof( FriendlyConfig.customWelcomeList ) == 'object' ) { form.append( { type:'header', label:'Custom templates' } ); form.append( { type: 'radio', name: 'custom', list: FriendlyConfig.customWelcomeList } ); }

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: ': standard welcome*', value: 'Welcome' }, {        label: ': short welcome', value: 'Welcomeshort', tooltip: 'Includes section heading.' }, {        label: ': simple welcome', value: 'WelcomeSimple', tooltip: 'Won\'t overwhelm new users. Includes section heading.' }, {       label: ': very short and simple welcome', value: 'Welcom', tooltip: 'Shortest welcome template available. Includes section heading and signature.' }, {       label: ': 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: ': welcome with menu of links', value: 'WelcomeMenu', tooltip: 'Contains a welcome message and many useful links broken up into different sections. Includes signature.' }, {        label: ': similar to ', value: 'Welcomeg', tooltip: 'Contains a welcome message and many useful links broken up into different sections. Includes signature.' }, {        label: ': same as  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: ': similar to, but automatically identifies anonymous and registered users*', value: 'Wel', tooltip: 'This template checks whether the username contains any letters. If there are any, will be shown. If there are none, will be shown.' }, {        label: ': standard template, similar to  with additional options', value: 'W-basic', tooltip: 'This template is similar to but supports many different options. Includes a signature.' }, {        label: ': extroverted message with bold advice', value: 'W-shout', tooltip: 'This template is similar to but spports many different options. Includes a signature.' }, {        label: ': concise; won\'t overwhelm', value: 'W-short', tooltip: 'This template is similar to but supports many different options. Includes a signature.' }, {        label: ': shortest greeting, links to Welcoming committee\'s greetings page', value: 'W-link', tooltip: 'This template is similar to but supports many different options. Includes a signature.' }, {        label: ': graphical menu format to ease transition from the graphic-heavy web', value: 'W-graphical', tooltip: 'This template is similar to but has fewer links. Supports many different options. Includes a signature.' }, {        label: ': 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: ': welcome with information about copyrights, npov, the sandbox, and vandalism', value: 'Welcomelaws' }, {        label: ': for someone whose first article did not meet page creation guidelines*', value: 'Firstarticle' }, {        label: ': for someone whose initial efforts appear to be vandalism*', value: 'Welcomevandal', tooltip: 'Includes a section heading.' }, {        label: ': for someone whose initial efforts do not adhere to the neutral point of view policy*', value: 'Welcomenpov' }, {        label: ': welcome with additional discussion of anti-spamming polices*', value: 'Welcomespam' }, {        label: ': for someone whose initial efforts are uncited*', value: 'Welcomeunsourced' }, {        label: ': for someone who created an autobiographical article*', value: 'Welcomeauto' }, {        label: ': for someone who created an article about a subject with which they have a conflict of interest*', value: 'Welcome-COI' } ]

friendlywelcome.anonymousList = [ {       label: ': for anonymous users; encourages getting a username*', value: 'Welcome-anon' }, {       label: ': similar to  but with hints and tips*', value: 'Welcomeanon2', tooltip: 'Includes section heading.' }, {       label: ': similar to  but with a border and section heading', value: 'Welc-anon', tooltip: 'Includes section heading.' }, {       label: ': for anonymous users who have vandalized a page*', value: 'Welcome-anon-vandal', tooltip: 'Includes a section heading and signature.' }, {       label: ': for anonymous users who fight vandalism, urging them to create an account*', value: 'Welcome-anon-vandalism-fighter' }, ]

// Set to true if template does not already have heading friendlywelcome.headingHash = { 'Welcome': true, 'Welcomeshort': false, 'WelcomeSimple': false, 'Welcom': false, 'Welcome-personal': false, 'WelcomeMenu': true, 'Welcomeg': true, 'Welcomeh': false, 'Wel': false, 'W-basic': true, 'W-shout': true, 'W-short': true, 'W-link': true, 'W-graphical': true, 'W-screen': true, 'Welcomelaws': true, 'Firstarticle': true, 'Welcomevandal': false, 'Welcomenpov': true, 'Welcomespam': true, 'Welcomeunsourced': true, 'Welcomeauto': false, 'Welcome-COI': true, 'Welcome-anon': true, 'Welcomeanon2': false, 'Welc-anon': false, 'Welcome-anon-vandalism-fighter': false, 'Welcome-anon-vandal': false }

// 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, 'Firstarticle': true, 'Welcomevandal': true, 'Welcomenpov': false, 'Welcomespam': false, 'Welcomeunsourced': false, 'Welcomeunsourced': false, 'Welcome-COI': false, 'Welcome-anon': false, 'Welcomeanon2': false, 'Welc-anon': false, 'Welcome-anon-vandalism-fighter': 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, 'Firstarticle': false, 'Welcomevandal': false, 'Welcomenpov': false, 'Welcomespam': false, 'Welcomeunsourced': false, 'Welcomeauto': true, 'Welcome-COI': false, 'Welcome-anon': true, 'Welcomeanon2': true, 'Welc-anon': false, 'Welcome-anon-vandalism-fighter': true, 'Welcome-anon-vandal': false }

/* Set to true if template supports article * name from vanarticle template 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, 'Firstarticle': true, 'Welcomevandal': true, 'Welcomenpov': true, 'Welcomespam': true, 'Welcomeunsourced': true, 'Welcomeauto': false, 'Welcome-COI': false, 'Welcome-anon': false, 'Welcomeanon2': false, 'Welc-anon': false, 'Welcome-anon-vandalism-fighter': 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'; }       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  welcome template' ); text += '\{\{subst:' + self.params.value; if( friendlywelcome.artHash[ self.params.value ] ) { if( FriendlyConfig.insertUsername && self.params.value.substring(2,0) != 'W-' ) { 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' : ( '\{\{' + 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; }

addOnloadHook( function {       if( QueryString.exists( 'friendlywelcome' ) ) {            if( QueryString.get( 'friendlywelcome' == 'auto' ) ) {                friendlywelcome.auto;            } else {                friendlywelcome.semiauto;            }        } else {            friendlywelcome.normal;        }    } ); //