மீடியாவிக்கி:Friendlywelcome.js
// &lt;nowiki&gt;
 // 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 = &quot; using [[WP:FRIENDLY|Friendly]]&quot;;
 }
 
 /**
  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 = &quot;== Welcome ==&quot;;
 }
 
 /**
  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 = &quot;auto&quot;;
 }
 
 /**
  FriendlyConfig.quickWelcomeTemplate ( String )
  */
 if( typeof( FriendlyConfig.quickWelcomeTemplate ) == 'undefined' ) {
     FriendlyConfig.quickWelcomeTemplate = &quot;Welcome&quot;;
 }
 
 /**
  FriendlyConfig.maskTemplateInSummary ( boolean )
  */
 if( typeof( FriendlyConfig.maskTemplateInSummary ) == 'undefined' ) {
     FriendlyConfig.maskTemplateInSummary = true;
 }
 
 $.when( $.ready, mw.loader.using( 'mediawiki.util' ) ).then( 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( mw.config.get('wgTitle').split( '/' )[0].replace( /\&quot;/, &quot;\\\&quot;&quot;) );
     },
     normal: function() {
         if( QueryString.exists( 'diff' ) ) {
             // all nodes with &quot;New user account&quot;
             var oSet1 = '//div[@id=&quot;mw-diff-otitle2&quot;]';
             var nSet1 = '//div[@id=&quot;mw-diff-ntitle2&quot;]';
             // all nodes with empty talk page
             var oSet2 = '//div[@id=&quot;mw-diff-otitle2&quot;][contains(a[2][@class=&quot;new&quot;], &quot;Talk&quot;)]';
             var nSet2 = '//div[@id=&quot;mw-diff-ntitle2&quot;][contains(a[2][@class=&quot;new&quot;], &quot;Talk&quot;)]';
             // 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 &lt; 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 + '&amp;' + QueryString.create( { 'friendlywelcome': 'norm' } )
                         + '&amp;' + QueryString.create( { 'vanarticle': mw.config.get('wgPageName').replace(/_/g, ' ') } ) );
                 current.appendChild( document.createTextNode( ' ' ) );
                 current.appendChild( tmpNode );
             }
             
             for(var i = 0; i &lt; 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 + '&amp;' + QueryString.create( { 'friendlywelcome': 'norm' } )
                         + '&amp;' + QueryString.create( { 'vanarticle': mw.config.get('wgPageName').replace(/_/g, ' ') } ) );
                 current.appendChild( document.createTextNode( ' ' ) );
                 current.appendChild( tmpNode );
             }
         }
         if( mw.config.get('wgNamespaceNumber') == 3 ) {
             var username = mw.config.get('wgTitle').split( '/' )[0].replace( /\&quot;/, &quot;\\\&quot;&quot;); // only first part before any slashes
 
             mw.util.addPortletLink( 'p-cactions', &quot;javascript:friendlywelcome.callback(\&quot;&quot; + username + &quot;\&quot;)&quot;, &quot;welcome&quot;, &quot;friendly-welcome&quot;, &quot;Welcome user&quot;, &quot;&quot;);
         }
     }
 }
 
 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': mw.config.get('wgPageName'), 
         'action': 'submit'
     };
     Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
     Wikipedia.actionCompleted.notice = &quot;Welcoming complete, reloading talk page in some seconds&quot;;
     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 == mw.config.get('wgUserName') ){
         alert( 'You don\'t need to welcome yourself, do you?' );
         return;
     }
 
     var Window = new SimpleWindow( 600, 400 );
     Window.setTitle( &quot;Choose a welcome template&quot; ); 
     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' &amp;&amp; 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 ] &amp;&amp; FriendlyConfig.insertHeadings ) {
             Status.info( 'Info', 'Will create a new heading for the welcome' );
             text += FriendlyConfig.welcomeHeading + &quot;\n&quot;;
         }
         
         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 += '|' + mw.config.get('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 += '|' + mw.config.get('wgUserName');
             }
         } else if( FriendlyConfig.insertUsername ) {
             Status.info( 'Info', 'Will add your username to the template' );
             text += '|' + mw.config.get('wgUserName');
         } 
         
         text += '\}\}';
         
         if( !friendlywelcome.signatureHash[ self.params.value ] &amp;&amp; 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': mw.config.get('wgPageName'), 
         'action': 'submit'
     };
     Wikipedia.actionCompleted.redirect = mw.config.get('wgPageName');
     Wikipedia.actionCompleted.notice = &quot;Welcoming complete, reloading talk page in some seconds&quot;;
     var wikipedia_wiki = new Wikipedia.wiki( 'User talk page modification', query, friendlywelcome.callbacks.main );
     wikipedia_wiki.params = params;
     wikipedia_wiki.get();
 }