மீடியாவிக்கி:Common.js
/**
  * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally
  * loaded for all users on every wiki page. If possible create a gadget that is
  * enabled by default instead of adding it here (since gadgets are fully
  * optimized ResourceLoader modules with possibility to add dependencies etc.)
  *
  * Since Common.js isn't a gadget, there is no place to declare its
  * dependencies, so we have to lazy load them with mw.loader.using on demand and
  * then execute the rest in the callback. In most cases these dependencies will
  * be loaded (or loading) already and the callback will not be delayed. In case a
  * dependency hasn't arrived yet it'll make sure those are loaded before this.
  */
 
 /* global mw, $ */
 /* jshint strict:false, browser:true */
 
 mw.loader.using( ['mediawiki.user', 'mediawiki.util', 'jquery.client'] ).done( function () {
 /* Begin of mw.loader.using callback */
 
 /**
  * Main Page layout fixes
  *
  * Description: Adds an additional link to the complete list of languages available.
  * Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]]
  */
 if ( mw.config.get( 'wgIsMainPage' ) || mw.config.get( 'wgPageName' ) === 'பேச்சு:முதற்_பக்கம்' ) {
     $( function () {
         mw.util.addPortletLink( 'p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias',
             'முழு பட்டியல்', 'interwiki-completelist', 'பிற விக்கிப்பீடியாக்களின் முழு பட்டியல்' );
     } );
 }
 
 /**
  * Redirect User:Name/skin.js and skin.css to the current skin's pages
  * (unless the 'skin' page really exists)
  * @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js
  * @rev: 2
  */
 if ( mw.config.get( 'wgArticleId' ) === 0 &amp;&amp; mw.config.get( 'wgNamespaceNumber' ) === 2 ) {
     var titleParts = mw.config.get( 'wgPageName' ).split( '/' );
     /* Make sure there was a part before and after the slash
        and that the latter is 'skin.js' or 'skin.css' */
     if ( titleParts.length == 2 ) {
         var userSkinPage = titleParts.shift() + '/' + mw.config.get( 'skin' );
         if ( titleParts.slice( -1 ) == 'skin.js' ) {
             window.location.href = mw.util.getUrl( userSkinPage + '.js' );
         } else if ( titleParts.slice( -1 ) == 'skin.css' ) {
             window.location.href = mw.util.getUrl( userSkinPage + '.css' );
         }
     }
 }
 
 /**
  * Map addPortletLink to mw.util
  * @deprecated: Use mw.util.addPortletLink instead.
  */
 mw.log.deprecate( window, 'addPortletLink', mw.util.addPortletLink, 'Use mw.util.addPortletLink instead' );
 
 /**
  * Extract a URL parameter from the current URL
  * @deprecated: Use mw.util.getParamValue with proper escaping
  */
 mw.log.deprecate( window, 'getURLParamValue', mw.util.getParamValue, 'Use mw.util.getParamValue instead' );
 
 /**
  * Test if an element has a certain class
  * @deprecated:  Use $(element).hasClass() instead.
  */
 mw.log.deprecate( window, 'hasClass', function ( element, className ) {
     return $( element ).hasClass( className );
 }, 'Use jQuery.hasClass() instead' );
 
 /**
  * @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
  * @rev 6
  */
 var extraCSS = mw.util.getParamValue( 'withCSS' ),
     extraJS = mw.util.getParamValue( 'withJS' );
 
 if ( extraCSS ) {
     if ( extraCSS.match( /^MediaWiki:[^&amp;&lt;&gt;=%#]*\.css$/ ) ) {
         mw.loader.load( '/w/index.php?title=' + extraCSS + '&amp;action=raw&amp;ctype=text/css', 'text/css' );
     } else {
         mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withCSS value' } );
     }
 }
 
 if ( extraJS ) {
     if ( extraJS.match( /^MediaWiki:[^&amp;&lt;&gt;=%#]*\.js$/ ) ) {
         mw.loader.load( '/w/index.php?title=' + extraJS + '&amp;action=raw&amp;ctype=text/javascript' );
     } else {
         mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );
     }
 }
 
 /**
  * WikiMiniAtlas
  *
  * Description: WikiMiniAtlas is a popup click and drag world map.
  *              This script causes all of our coordinate links to display the WikiMiniAtlas popup button.
  *              The script itself is located on meta because it is used by many projects.
  *              See [[Meta:WikiMiniAtlas]] for more information.
  * Maintainers: [[User:Dschwen]]
  */
 ( function () {
     var require_wikiminiatlas = false;
     var coord_filter = /geohack/;
     $( function () {
         $( 'a.external.text' ).each( function( key, link ) {
             if ( link.href &amp;&amp; coord_filter.exec( link.href ) ) {
                 require_wikiminiatlas = true;
                 // break from loop
                 return false;
             }
         } );
         if ( $( 'div.kmldata' ).length ) {
             require_wikiminiatlas = true;
         }
         if ( require_wikiminiatlas ) {
             mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&amp;action=raw&amp;ctype=text/javascript' );
         }
     } );
 } )();
 
 /**
  * Collapsible tables
  *
  * Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]].
  *
  * @version 2.0.3 (2014-03-14)
  * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
  * @author [[User:R. Koot]]
  * @author [[User:Krinkle]]
  * @deprecated Since MediaWiki 1.20: Use class=&quot;mw-collapsible&quot; instead which
  * is supported in MediaWiki core.
  */
 
 var autoCollapse = 2;
 var collapseCaption = 'மறை';
 var expandCaption = 'காட்டு';
 var tableIndex = 0;
 
 function collapseTable( tableIndex ) {
     var Button = document.getElementById( 'collapseButton' + tableIndex );
     var Table = document.getElementById( 'collapsibleTable' + tableIndex );
 
     if ( !Table || !Button ) {
         return false;
     }
 
     var Rows = Table.rows;
     var i;
     var $row0 = $(Rows[0]);
 
     if ( Button.firstChild.data === collapseCaption ) {
         for ( i = 1; i &lt; Rows.length; i++ ) {
             Rows[i].style.display = 'none';
         }
         Button.firstChild.data = expandCaption;
     } else {
         for ( i = 1; i &lt; Rows.length; i++ ) {
             Rows[i].style.display = $row0.css( 'display' );
         }
         Button.firstChild.data = collapseCaption;
     }
 }
 
 function createClickHandler( tableIndex ) {
     return function ( e ) {
         e.preventDefault();
         collapseTable( tableIndex );
     };
 }
 
 function createCollapseButtons( $content ) {
     var NavigationBoxes = {};
     var $Tables = $content.find( 'table' );
     var i;
 
     $Tables.each( function( i, table ) {
         if ( $(table).hasClass( 'collapsible' ) ) {
 
             /* only add button and increment count if there is a header row to work with */
             var HeaderRow = table.getElementsByTagName( 'tr' )[0];
             if ( !HeaderRow ) {
                 return;
             }
             var Header = table.getElementsByTagName( 'th' )[0];
             if ( !Header ) {
                 return;
             }
 
             NavigationBoxes[ tableIndex ] = table;
             table.setAttribute( 'id', 'collapsibleTable' + tableIndex );
 
             var Button     = document.createElement( 'span' );
             var ButtonLink = document.createElement( 'a' );
             var ButtonText = document.createTextNode( collapseCaption );
             // Styles are declared in [[MediaWiki:Common.css]]
             Button.className = 'collapseButton';
 
             ButtonLink.style.color = Header.style.color;
             ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
             ButtonLink.setAttribute( 'href', '#' );
             $( ButtonLink ).on( 'click', createClickHandler( tableIndex ) );
             ButtonLink.appendChild( ButtonText );
 
             Button.appendChild( document.createTextNode( '[' ) );
             Button.appendChild( ButtonLink );
             Button.appendChild( document.createTextNode( ']' ) );
 
             Header.insertBefore( Button, Header.firstChild );
             tableIndex++;
         }
     } );
 
     for ( i = 0;  i &lt; tableIndex; i++ ) {
         if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) ||
             ( tableIndex &gt;= autoCollapse &amp;&amp; $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) )
         ) {
             collapseTable( i );
         }
         else if ( $( NavigationBoxes[i] ).hasClass ( 'innercollapse' ) ) {
             var element = NavigationBoxes[i];
             while ((element = element.parentNode)) {
                 if ( $( element ).hasClass( 'outercollapse' ) ) {
                     collapseTable ( i );
                     break;
                 }
             }
         }
     }
 }
 
 mw.hook( 'wikipage.content' ).add( createCollapseButtons );
 
 /**
  * Add support to mw-collapsible for autocollapse, innercollapse and outercollapse
  *
  * Maintainers: TheDJ
  */
 function mwCollapsibleSetup( $collapsibleContent ) {
 	var $element,
 		autoCollapseThreshold = 2;
 	$.each( $collapsibleContent, function (index, element) {
 		$element = $( element );
 		if ( index &gt; autoCollapseThreshold &amp;&amp; $element.hasClass( 'autocollapse' ) ) {
 			$element.data( 'mw-collapsible' ).collapse();
 		} else if ( $element.hasClass( 'innercollapse' ) ) {
 			if ( $element.parents( '.outercollapse' ).length &gt; 0 ) {
 				$element.data( 'mw-collapsible' ).collapse();
 			}
 		}
 	} );
 }
 
 mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup );
 
 /**
  * Dynamic Navigation Bars (experimental)
  *
  * Description: See [[Wikipedia:NavFrame]].
  * Maintainers: UNMAINTAINED
  */
 
 /* set up the words in your language */
 var NavigationBarHide = '[' + collapseCaption + ']';
 var NavigationBarShow = '[' + expandCaption + ']';
 var indexNavigationBar = 0;
 
 /**
  * Shows and hides content and picture (if available) of navigation bars
  * Parameters:
  *     indexNavigationBar: the index of navigation bar to be toggled
  **/
 window.toggleNavigationBar = function ( indexNavigationBar, event ) {
     var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar );
     var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar );
     var NavChild;
 
     if ( !NavFrame || !NavToggle ) {
         return false;
     }
 
     /* if shown now */
     if ( NavToggle.firstChild.data === NavigationBarHide ) {
         for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
             if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {
                 NavChild.style.display = 'none';
             }
         }
     NavToggle.firstChild.data = NavigationBarShow;
 
     /* if hidden now */
     } else if ( NavToggle.firstChild.data === NavigationBarShow ) {
         for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
             if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {
                 NavChild.style.display = 'block';
             }
         }
         NavToggle.firstChild.data = NavigationBarHide;
     }
 
     event.preventDefault();
 };
 
 /* adds show/hide-button to navigation bars */
 function createNavigationBarToggleButton( $content ) {
     var NavChild;
     /* iterate over all &lt; div &gt;-elements */
     var $divs = $content.find( 'div' );
     $divs.each( function ( i, NavFrame ) {
         /* if found a navigation bar */
         if ( $( NavFrame ).hasClass( 'NavFrame' ) ) {
 
             indexNavigationBar++;
             var NavToggle = document.createElement( 'a' );
             NavToggle.className = 'NavToggle';
             NavToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
             NavToggle.setAttribute( 'href', '#' );
             $( NavToggle ).on( 'click', $.proxy( window.toggleNavigationBar, window, indexNavigationBar ) );
 
             var isCollapsed = $( NavFrame ).hasClass( 'collapsed' );
             /**
              * Check if any children are already hidden.  This loop is here for backwards compatibility:
              * the old way of making NavFrames start out collapsed was to manually add style=&quot;display:none&quot;
              * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
              * the content visible without JavaScript support), the new recommended way is to add the class
              * &quot;collapsed&quot; to the NavFrame itself, just like with collapsible tables.
              */
             for ( NavChild = NavFrame.firstChild; NavChild != null &amp;&amp; !isCollapsed; NavChild = NavChild.nextSibling ) {
                 if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
                     if ( NavChild.style.display === 'none' ) {
                         isCollapsed = true;
                     }
                 }
             }
             if ( isCollapsed ) {
                 for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
                     if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {
                         NavChild.style.display = 'none';
                     }
                 }
             }
             var NavToggleText = document.createTextNode( isCollapsed ? NavigationBarShow : NavigationBarHide );
             NavToggle.appendChild( NavToggleText );
 
             /* Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) */
             for( var j = 0; j &lt; NavFrame.childNodes.length; j++ ) {
                 if ( $( NavFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {
                     NavToggle.style.color = NavFrame.childNodes[j].style.color;
                     NavFrame.childNodes[j].appendChild( NavToggle );
                 }
             }
             NavFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );
         }
     } );
 }
 
 mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );
 
 /**
  * Uploadwizard_newusers
  * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]
  *
  * Maintainers: [[User:Krimpet]]
  */
 function uploadwizard_newusers() {
     if ( mw.config.get( 'wgNamespaceNumber' ) === 4 &amp;&amp; mw.config.get( 'wgTitle' ) === 'Upload' &amp;&amp; mw.config.get( 'wgAction' ) === 'view' ) {
         var oldDiv = document.getElementById( 'autoconfirmedusers' ),
             newDiv = document.getElementById( 'newusers' );
         if ( oldDiv &amp;&amp; newDiv ) {
             var userGroups = mw.config.get( 'wgUserGroups' );
             if ( userGroups ) {
                 for ( var i = 0; i &lt; userGroups.length; i++ ) {
                     if ( userGroups[i] === 'autoconfirmed' ) {
                         oldDiv.style.display = 'block';
                         newDiv.style.display = 'none';
                         return;
                     }
                 }
             }
             oldDiv.style.display = 'none';
             newDiv.style.display = 'block';
             return;
         }
     }
 }
 
 $(uploadwizard_newusers);
 
 /**
  * Magic editintros ****************************************************
  *
  * Description: Adds editintros on disambiguation pages and BLP pages.
  * Maintainers: [[User:RockMFR]]
  */
 function addEditIntro( name ) {
     $( '.mw-editsection, #ca-edit' ).find( 'a' ).each( function ( i, el ) {
         el.href = $( this ).attr( 'href' ) + '&amp;editintro=' + name;
     } );
 }
 
 if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
     $( function () {
         if ( document.getElementById( 'disambigbox' ) ) {
             addEditIntro( 'Template:Disambig_editintro' );
         }
     } );
 
     $( function () {
         var cats = mw.config.get('wgCategories');
         if ( !cats ) {
             return;
         }
         if ( $.inArray( 'Living people', cats ) !== -1 || $.inArray( 'Possibly living people', cats ) !== -1 ) {
             addEditIntro( 'Template:BLP_editintro' );
         }
     } );
 }
 
 /* End of mw.loader.using callback */
 } );