/*
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="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;
}