Jump to content

میڈیا وکی:Gadget-foldPortalMenus.js

وکیپیڈیا توں

یاددہانی: محفوظ کرݨ دے بعد انہاں تبدیلیاں کوں ݙیکھݨ کیتے تہاکوں آپݨے براؤزر دا کیشی (cache) صاف کرݨاں ہوسی۔

  • فائرفاکس/ سفاری: ڄݙݨ Reload تے کلک کرو تاں Shift دبا تے رکھو، یا Ctrl-F5 یا Ctrl-R دباؤ (Mac تے R-⌘)
  • گوگل کروم: Ctrl-Shift-R دباؤ (Mac تے Shift-R-⌘)
  • انٹرنیٹ ایکسپلورر: ڄݙݨ Refresh تے کلک کرو تاں Ctrl یا Ctrl-F5 دباؤ
  • اوپیرا: Ctrl-F5 دباؤ۔
$( function() {
  "use strict";
  function doit() {
    var storageKey = 'portalFolded',
      skin = mw.config.get( 'skin' ),
      portalSelector,
      bodySelector,
      storage = mw.storage.get(storageKey) !== null,
      foldedClass = 'foldmenu-folded',
      expandedClass = 'foldmenu-expanded',
      heights = {},
      toggleElement = function( elem ) {
        var id = elem.closest( portalSelector ).attr( 'id' ),
          hide = ! elem.hasClass( foldedClass );
        elem.toggleClass( expandedClass, !hide )
          .toggleClass(foldedClass, hide )
          .siblings( bodySelector ).stop( true ).animate( { maxHeight: hide ? 0 : heights[id] } );
        if (! storage)
          return;
        mw.storage.set( storageKey + id, hide );
      },
      preparePortalBody = function( index, elem ) {
        var $elem = $( elem ),
          id = $elem.closest( portalSelector ).attr( 'id' ),
          height = $elem.height();
        $elem.css( 'max-height', $elem.height() );
        heights[id] = height;
      },
      prepareHeader = function( selector ) {
        $( selector )
          .addClass( expandedClass )
          .prepend( $('<span>', { 'class': 'plus' } ).text( '◄' ) )
          .prepend( $('<span>', { 'class': 'minus' } ).text( '▼' ) )
          .click( function() { toggleElement( $(this) ) } );
      },
      recalcHeights = function() {
        $( portalSelector + ' ' + bodySelector ).each( function() {
          var $div = $( this ),
            id = $div.closest( 'div.portal' ).attr( 'id' ),
            clone = $div.clone()
              .css( { maxHeight: 50000, left: -5000, display: 'block' } )
              .appendTo( 'body' ),
            height = heights[id] = Math.max( (heights[id] || 0), clone.height() );
          $div.css( { maxHeight: height } );
          clone.remove();
        });
      },
      restoreState = function() {
        if (! storage) 
          return;
        $( portalSelector ).each( function( index, item ) {
          var $item = $( item ),
            id = $item.attr( 'id' ),
            $h3 = $( 'h3:first', item );
          if ( mw.storage.get( storageKey + id ) && ! $h3.hasClass( foldedClass ) )
            toggleElement( $( 'h3:first', item ) );
        });
      };

 	switch( skin ) {
		case 'vector':
			portalSelector = 'div.portal';
			bodySelector = 'div.body';
			break;
		case 'monobook':
			portalSelector = 'div.portlet';
			bodySelector = 'div.pBody';
			break;
		default:
			return;
	}
	
	$( portalSelector + ' h3#p-navigation-label' ).toggle( true );
	$( portalSelector + ' ' + bodySelector ).each( preparePortalBody );
	prepareHeader( portalSelector + ' h3' );
	restoreState();
	
	$( document ).on( 'new-portlet-link', function( event, portalId ) {
		recalcHeights();
		if ( ! portalId )
			return;
		var ps = '#' + portalId;
		preparePortalBody( 0, ps );
		prepareHeader( ps + ' h3' );
		restoreState();	
	});
} // doit
setTimeout(doit, 777);
});