User:Gary/user groups.js

/* USER GROUPS SCRIPT NORMAL GROUPS (18 total, as of February 2, 2011): (all), accountcreator, sysop (administrator), autoreviewer (auto patrolled), bot,

/*
	USER GROUPS SCRIPT


	NORMAL GROUPS (18 total, as of February 2, 2011):
		(all), accountcreator, sysop (administrator), autoreviewer (auto patrolled), bot, bureaucrat, checkuser, confirmed, abusefilter (edit filter manager), founder, ipblock-exempt, import, oversight, researcher, reviewer, rollbacker, steward, transwiki	
	
	SPECIAL GROUPS (3)
		(anonymous), autoconfirmed, user
	
	EXAMPLE USAGE (all nouns are in singular form):
		<div class="for-sysop-only"></div>
	
	AND
		<div class="not-for-sysop"></div>
	
	
	NOTES
	
		- (all) has no associated class.
		- The associated class for (anonymous) uses "anonymous".
		- classes can be wrapped around each other. The one with the highest priority is the innermost class.
	
	TODO
	
		- 
*/

if (typeof(unsafeWindow) != 'undefined')
{
	var console = unsafeWindow.console;
	mw = unsafeWindow.mw;
}

// Settings ('X' is replaced with the group)
var hideText = 'not-for-X';
var showText = 'for-X-only';
var hiddenStyle = 'display: none;';
var hiddenContentId = 'hidden-content-';
var userGroupContentClass = 'user-group-content';

mw.util.addCSS('.hidden-content-link { display: inline-block; font-family: monospace; font-size: 0.9em; font-weight: bold; vertical-align: top; /*width: 15px;*/ }\
a.hidden-content-link:hover { text-decoration: none; }');

// normal user groups (17 total); (all) group is missing (-1)
var allUserGroups = { 'accountcreator': true, 'sysop': true, 'autoreviewer': true, 'bot': true, 'bureaucrat': true, 'checkuser': true, 'confirmed': true, 'abusefilter': true, 'founder': true, 'ipblock-exempt': true, 'import': true, 'oversight': true, 'researcher': true, 'reviewer': true, 'rollbacker': true, 'steward': true, 'transwiki': true, };

// do (anonymous) first; they have NO groups
if (!mw.config.get('wgUserGroups'))
{
	mw.util.addCSS('.' + hideText.replace('X', 'anonymous') + ' { ' + hiddenStyle + ' }');
}
else
{
	for (var group in allUserGroups) createGroupCss(group);

	// special user groups; (anonymous) is missing, will do last
	var specialUserGroups = { 'autoconfirmed': true, 'user': true, };
	for (var group in specialUserGroups) createGroupCss(group);
	
	// (anonymous) users
	mw.util.addCSS('.' + showText.replace('X', 'anonymous') + ' { ' + hiddenStyle + ' }');
}

// Add links to expand hidden content.
// Find all occurrences and append (...), which is clickable.
function expandHiddenContent()
{
	// Find all hidden content and add a class to them for other uses
	allUserGroups['anonymous'] = true;
	for (var group in allUserGroups)
	{
		$('.' + hideText.replace('X', group)).addClass(userGroupContentClass);
		$('.' + showText.replace('X', group)).addClass(userGroupContentClass);
	}
	
	$('.' + userGroupContentClass).each(function(i)
	{
		var hidden = $(this);
		var groupInfo = findUserGroup(hidden.attr('class').split(' '));
		if (!groupInfo) return true;
		
		// content is shown
		if (hidden.css('display') != 'none')
		{
			hidden.attr('title', 'This content is ' + (groupInfo[1] ? 'shown only to' : 'hidden only from') + ' members of the \'' + groupInfo[0] + '\' user group.');
		}
		// content is hidden
		else
		{
			hidden.attr('id', hiddenContentId + i);
			var expand = $('<a class="hidden-content-link" href="https://profilbaru.com/en/javascript:toggleHiddenContent(' + i + ')" title="This content is ' + (groupInfo[1] ? 'shown only to' : 'hidden only from') + ' members of the \'' + groupInfo[0] + '\' user group.">(+)</a>');
			var newNode = $('<div></div>');
			hidden.after(newNode);
			newNode.append(expand).append(' ').append(hidden);
		}
	});
}

function findUserGroup(arrayOfClasses)
{
	for (var group in allUserGroups)
	{
		if ($.inArray(hideText.replace('X', group), arrayOfClasses) != -1) return [group, 0];
		if ($.inArray(showText.replace('X', group), arrayOfClasses) != -1) return [group, 1];
	}
	return false;
}

toggleHiddenContent = function(i)
{
	var id = $('#' + hiddenContentId + i);
	var text = id.prev().contents().first()[0];
	var display = id.css('display');
	
	if (display == 'none')
	{
		id.css('display', 'inline');
		text.nodeValue = '(-)';
	}
	else
	{
		id.css('display', 'none');
		text.nodeValue = '(+)';
	}
}

$(expandHiddenContent);

function createGroupCss(group)
{
	if (userHasGroup(group)) mw.util.addCSS('.' + hideText.replace('X', group) + ' { ' + hiddenStyle + ' }'); // 'not-for-X'
	else mw.util.addCSS('.' + showText.replace('X', group) + ' { ' + hiddenStyle + ' }'); // 'for-X-only'	
}

function userHasGroup(group)
{
	for (var i = 0; i < mw.config.get('wgUserGroups').length; i++)
	{
		if (group == mw.config.get('wgUserGroups')[i])
			return true;
	}

	return false;
}

if (typeof(unsafeWindow) != 'undefined')
{
	unsafeWindow.toggleHiddenContent = toggleHiddenContent;
}

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.