משתמש:קיפודנחש/flexGadgets.js

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
  • אופרה: ללחוץ על Ctrl-F5.
mw.loader.using( ['mediawiki.api', 'mediawiki.user', 'jquery.ui'], function() {
"use strict";
var api = new mw.Api(),
	userRights,
	allGadgets = {},
	hardActiveGadgets = {},
	softActiveGadgets = {},
	cookieName = 'softGadgetsGadget',
	current = $.cookie( cookieName ),
	strings = {
		cancel: 'ביטול',
		save: 'הפעל וזכור',
		onetime: 'הפעלה חד פעמית',
		prefs: 'העדפות',
		clearall: 'נקה הכל',
		title: 'העדפות מקומיות'
	};
mw.user.getRights().done( function( data ) {
	userRights = data;
} );

function showForm( e ) {
	e.preventDefault();
	api.get( {
			action: 'parse',
			page: 'Mediawiki:Gadgets-definition'
		} )
		.done( function( data ) {
			if ( data && data.parse && data.parse.text && data.parse.text['*'] )
				buildFormAndShowit( data.parse.text['*'] );
		} );
}

function buildFormAndShowit( gadgetsDefinitionHtml ) {
	var bag = '__NOEDITSECTION__\n__NOTOC__\n',
		div = $( '<div>' ).append( $( gadgetsDefinitionHtml ) );
	div.find( '#toc' ).remove();
	div.find( 'h2, li' )
		.each( function( index, item ) {
			var $item = $( item );
			if ( $item.is( 'h2' ) ) {
				var title = $item.find( 'span:first' ).text().replace( /_/g, " " );
				if ( $.trim( title ) )
					bag += '\n==' + title + '==';
			}
			else
				bag += lineOfSourceItem( $item );
		} );
	api.post( {
		action: 'parse',
		text: bag
	} ).done( function( data ) {
		handleParsedPage( data.parse.text['*'] );
	} );
}

function lineOfSourceItem( $item ) {
	var sourceText = $item.text(),
		gadgetName = $.trim( sourceText.replace( /[[|].*/, '' ) ),
		s = '',
		active = mw.user.options.get( 'gadget-' + gadgetName );

	if ( active ) {
		hardActiveGadgets[gadgetName] = 1;
		return '';
	} 
	if ( userRights ) {
		var match = sourceText.match( /rights\s*=\s*([^|[]*)/ );
		if ( match ) {
			var required = match[1].split( ',' );
			for ( var i = 0; i < required.length; i++ )
				if ( $.inArray( required[i], userRights ) < 0 )
					return ''; // current user does not have rights for this gadget.
		}
	}

	allGadgets[gadgetName] = 1;
	return '\n* <span class = "spanCheckbox" id = "spanGadget-' + gadgetName + '"></span> {{Mediawiki:Gadget-' + gadgetName + '}}';
}

function handleParsedPage( parsedString ) {
	var $page = $( parsedString );
	for ( var gadget in allGadgets ) {
		var cb = $( '<input>', {
				type: 'checkbox'
			} )
			.prop( 'checked', !!( hardActiveGadgets[gadget] || softActiveGadgets[gadget] ) )
			.prop( 'disabled', hardActiveGadgets[gadget] );
		$page.find( '#spanGadget-' + gadget ).prepend( cb );
	}
	var div = $( '<div>' )
		.css( {
			overflow: 'auto',
			width: 'auto'
		} )
		.append( $page );
	showDialog( div );
}

function actOnUserChoice( content, remember ) {
	var selected = [];
	softActiveGadgets = {};
	for ( var gadget in allGadgets ) {
		if ( hardActiveGadgets[gadget] )
			continue;
		if ( content.find( '#spanGadget-' + gadget + ' input' ).prop( 'checked' ) ) {
			loadGadget( gadget ); // never mind if it's already loaded: mw.loader keeps track.
			selected.push( gadget );
			softActiveGadgets[gadget] = 1;
		}
	}
	if ( remember )
		$.cookie( cookieName, selected.join( '.' ) );
}

function showDialog( content ) {
	var buttons = {};
	buttons[strings.cancel] = function() {
		$( this ).dialog( 'close' );
	};
	buttons[strings.onetime] = function() {
		actOnUserChoice( content, false );
		$( this ).dialog( "close" );
	};
	buttons[strings.save] = function() {
		actOnUserChoice( content, true );
		$( this ).dialog( "close" );
	};
	buttons[strings.clearall] = function() {
		$( this ).find('input:enabled[type=checkbox]').prop('checked', false);
	};
	
	var dialog = $( '<div>' )
		.append( content )
		.dialog( {
			resizable: true,
			height: 600,
			width: 1000,
			modal: true,
			title: strings.title,
			buttons: buttons
		} );
}

function loadGadget( gadget ) {
	mw.loader.load( 'ext.gadget.' + gadget );
}

function start() {
	if ( current ) {
		var softies = current.split( '.' );
		for ( var i = 0; i < softies.length; i++ ) {
			var softie = softies[i];
			softie = $.trim( softie );
			softActiveGadgets[softie] = 1;
			loadGadget( softie );
		}
	}
	$( mw.util.addPortletLink( mw.user.isAnon() ? 'p-personal' : 'p-cactions', '', strings.prefs ) ).click( showForm );
}
start();
} );