MediaWiki:Gadget-dropdown-menus.js

// "Fail gracefully" if skin not supported var skin = mw.config.get('skin'); var wgUserGroups = mw.config.get('wgUserGroups'); var wgServer= mw.config.get('wgServer'); var wgPageName= mw.config.get('wgPageName');

switch (skin) { case 'modern': case 'monobook': case 'vector': case 'uespmonobook': case 'darkvector':

// Global variables if (typeof(window.cactions) == 'undefined') window.cactions = ""; eval(function {        var globals = cactions ? cactions : null;        cactions = {            admin: wgUserGroups.indexOf('sysop') > -1 ? true : false,            areqs: [],            hovms: (skin == 'vector') ? 50 : 400,            itabs: true,            menus: [],            mouse: null,            mwsvr: wgServer.indexOf('secure.wikimedia.org') == -1 ? null : wgServer.split('://')[1],            pname: encodeURIComponent(wgPageName),            svars: [],            tbusr: false,            timer: [],            lang: {},            xmlhr: true        };        if (globals) for (i in globals) cactions[i] = globals[i];    }); window.xhr = function(request,url,orsc) { with (request) { open('GET',url,true); onreadystatechange = orsc; send(null); }   }

// Find absolute position of element window.findPos = function(eid,offset) { var obj = document.getElementById(eid), pos = [0,0]; do with (obj) { pos[0] += offsetLeft; pos[1] += offsetTop; } while (obj = obj.offsetParent); pos[0] += offset[0]; pos[1] += offset[1]; return pos; }

// Create menu div element window.createMenu = function(mid,vectorise,html) { var menu = document.createElement('div'); with (menu) { id = 'opt-' + mid; className = 'ca-menu'; style.display = 'none'; }       menu.onmouseover = function  {showMenu('opt-'+mid)}; menu.onmouseout = function {hideMenu('opt-'+mid)};

var elements = { ul: document.createElement('ul'), li: null, a: null, txt: null };       with (elements) { for (var i = 0; i < html.length; i++) if (html[i].length) { li = document.createElement('li'); li.id = html[i][0]; a = document.createElement('a'); a.href = html[i][1]; txt = document.createTextNode(cactions._lang[html[i][0].replace(/-/g,'_')]); a.appendChild(txt); li.appendChild(a); ul.appendChild(li); }           menu.appendChild(ul); }

document.body.appendChild(menu); if (vectorise) createTab(mid);

return 'opt-' + mid; }

// Create cactions LI tab window.createTab = function(mid) { var mtitle = mid.charAt(0).toUpperCase + mid.substr(1);

if (skin == 'vector') { var cid = 'p-' + mid; var elements = { div: document.createElement('div'), h3: document.createElement('h3'), span: document.createElement('span'), a: document.createElement('a'), txt: null };           with (elements) { div.id = cid; div.className = 'vectorMenu extraMenu';

txt = document.createTextNode(mtitle); span.appendChild(txt); h3.appendChild(span);

a.href = '#'; a.onmouseover = function {showMenu('opt-'+mid,findPos(cid,[0,40]))}; a.onmouseout = function {hideMenu('opt-'+mid)};

span = document.createElement('span'); txt = document.createTextNode(mtitle); span.appendChild(txt); a.appendChild(span); h3.appendChild(a);

div.appendChild(h3); document.getElementById('right-navigation').insertBefore(div,document.getElementById('p-search')); }       }        else { var cid = 'ca-' + mid; var elements = { li: document.createElement('li'), a: document.createElement('a'), txt: document.createTextNode(mtitle) };           with (elements) { li.id = cid; a.href = '#'; a.onmouseover = function {showMenu('opt-'+mid,findPos(cid,[-10,20]))}; a.onmouseout = function {hideMenu('opt-'+mid)}; a.appendChild(txt); li.appendChild(a);

document.getElementById('p-cactions').getElementsByTagName('div')[0].getElementsByTagName('ul')[0].appendChild(li); }       }    }

// CSS hide elements window.hideElements = function(elements,conditionals) { if (typeof(conditionals) == 'undefined') { for (var i = 0; i < elements.length; i++) if (document.getElementById(elements[i])) document.getElementById(elements[i]).style.display = 'none'; }       else for (var i = 0; i < elements.length; i++) if (document.getElementById(elements[i])) { document.getElementById(elements[i]).style.display = 'none'; if (conditionals[i]) document.getElementById(conditionals[i]).style.display = 'none'; }   }

// Show/hide menu functions window.showMenu = function(mid,pos) { with (cactions) { mouse = mid; if (pos) for (var i = 0; i < menus.length; i++) { if (timer[menus[i]]) { clearTimeout(timer[menus[i]]); timer[menus[i]] = null; }               if (mid.replace(/-[^-]+$/,'') == menus[i]) continue; document.getElementById(menus[i]).style.display = 'none'; }           if (!timer[mid]) with (document.getElementById(mid).style) { display = ''; if (pos) { left = pos[0]+'px'; top = pos[1]+'px'; }           }            else { clearTimeout(timer[mid]); timer[mid] = null; }       }    }    window.hideMenu = function (mid) { with (cactions) { if (mid == mouse.replace(/-[^-]+$/,'')) timer[mid] = null;

if (timer[mid]) { timer[mid] = null; document.getElementById(mid).style.display = 'none'; if (mid == mouse && mid.search(/opt-.*-/) != -1) document.getElementById(mid.replace(/-[^-]+$/,'')).style.display = 'none'; }           else timer[mid] = setTimeout('hideMenu(\''+mid+'\');',hovms); }   }

// Delink element window.removeLink = function(eid) { var element = document.getElementById(eid); if (!element.getElementsByTagName('a').length) return false;

var a = element.getElementsByTagName('a')[0]; element.appendChild(a.removeChild(a.firstChild)); element.removeChild(a);

element.className = 'ca-disabled'; }   // User options hook window.gadgetUserOptionsHookInit = function { var wgCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName'); var wgNamespaceNumber = mw.config.get('wgNamespaceNumber'); var wgScriptPath = mw.config.get('wgScriptPath'); var wgScript = mw.config.get('wgScript'); var wgTitle = mw.config.get('wgTitle');

switch (wgNamespaceNumber) { case 2: case 3: cactions['uname'] = encodeURIComponent(wgTitle.split('/')[0].replace(/ /g,'_')); }       if (wgCanonicalSpecialPageName == 'Contributions') for (var i = 0, hl; hl = document.getElementById('contentSub').getElementsByTagName('a')[i]; i++) { if (hl.href.indexOf('user=') > -1) { cactions['uname'] = hl.href.split('user=')[1].split('&amp;')[0]; break; }       }

if (cactions.uname) { with (cactions) { menus[menus.length] = createMenu('user',true,Array( ['c-u-logs',       '#']                                                                                                                                                    , mwsvr == 'en.wikipedia.org'? ['c-u-rfx',        '#']                                                                                                                                                :[] , ['c-u-blocks',     '#']                                                                                                                                                    , ['c-u-contribs',   wgScript+'?title=Special:Contributions/'+uname+'&action=view']                                                                                          , ['c-u-editcount',  wgScript+'?title=Special:EditCount/'+uname]                                                                                                             , mwsvr? ['c-u-editsum',    'http://toolserver.org/~soxred93/editsummary/index.php?lang='+mwsvr.split('.')[0]+'&wiki='+mwsvr.split('.')[1]+'&name='+uname.replace(/_/g,'+')]    :[] , mwsvr == 'en.wikipedia.org'? ['c-u-wcuser',     'http://en.wikichecker.com/user/?l=all&t='+uname]                                                                                                   :[] , mwsvr? ['c-u-sul',        'http://toolserver.org/~vvv/sulutil.php?user='+uname]                                                                                               :[] , ['c-u-subpages',   wgScript+'?title=Special:PrefixIndex/User:'+uname+'/&action=view']                                                                                      , ['c-u-email',      wgScript+'?title=Special:EmailUser/'+uname+'&action=view']                                                                                              , ['c-u-groups',     wgScript+'?title=Special:ListUsers&action=view&limit=1&username='+uname]                                                                                , ['c-u-rightslog',  wgScript+'?title=Special:Log&action=view&type=rights&page=User:'+uname] ));

menus[menus.length] = createMenu('user-logs',false,Array( ['c-ul-logs',      wgScript+'?title=Special:Log&action=view&user='+uname]                  , ['c-ul-blocks',    wgScript+'?title=Special:Log&action=view&type=block&user='+uname]       , ['c-ul-deletes',   wgScript+'?title=Special:Log&action=view&type=delete&user='+uname]      , ['c-ul-moves',     wgScript+'?title=Special:Log&action=view&type=move&user='+uname]        , ['c-ul-patrols',   wgScript+'?title=Special:Log&action=view&type=patrol&user='+uname]      , ['c-ul-protects',  wgScript+'?title=Special:Log&action=view&type=protect&user='+uname]     , ['c-ul-uploads',   wgScript+'?title=Special:Log&action=view&type=upload&user='+uname]      , ['c-ul-rights',    wgScript+'?title=Special:Log&action=view&type=rights&user='+uname] ));

menus[menus.length] = createMenu('user-blocks',false,Array( admin? ['c-ub-block',     wgScript+'?title=Special:BlockIP/'+uname+'&action=view']            :[] , admin? ['c-ub-unblock',   wgScript+'?title=Special:IPBlockList&action=unblock&ip='+uname]     :[] , ['c-ub-ipblock',   wgScript+'?title=Special:IPBlockList&action=view&ip='+uname]            , ['c-ub-blocklog',  wgScript+'?title=Special:Log&action=view&type=block&page=User:'+uname] ));

menus[menus.length] = createMenu('user-rfx',false,Array( ['c-ux-rfa',       wgScript+'?title=Special:PrefixIndex/Wikipedia:Requests_for_adminship/'+uname+'&action=view'], ['c-ux-rfb',       wgScript+'?title=Special:PrefixIndex/Wikipedia:Requests_for_bureaucratship/'+uname+'&action=view'], ['c-ux-rfar',      wgScript+'?title=Wikipedia:Requests_for_arbitration/'+uname+'&action=view'], ['c-ux-rfc',       wgScript+'?title=Wikipedia:Requests_for_comment/'+uname+'&action=view'], ['c-ux-rfcu',      wgScript+'?title=Wikipedia:Requests_for_checkuser/Case/'+uname+'&action=view'], ['c-ux-spi',       wgScript+'?title=Wikipedia:Sockpuppet_investigations/'+uname+'&action=view'] ));

if (window.xmlhr && window.sajax_init_object && wgEnableAPI) { if (uname.search(/(?:\d{1,3}\.){3}\d{1,3}/) == 0) { areqs['ip'] = new sajax_init_object; xhr(areqs['ip'],wgScriptPath+'/api.php?format=json&action=query&list=blocks&bkusers='+uname+'&bkprop=id&xhr='+Math.random,function {                            with (areqs['ip']) if (readyState == 4 && status == 200) {                                var api = eval('('+responseText+')');                                if (api.query.blocks.length) {                                    hideElements(['c-ub-block']);                                    document.getElementById('c-ub-ipblock').getElementsByTagName('a')[0].style.color = '#EE1111';                                }                                else {                                    hideElements(['c-ub-unblock']);                                    removeLink('c-ub-ipblock');                                }                            }                        } ); }                   else { areqs['user'] = new sajax_init_object; xhr(areqs['user'],wgScriptPath+'/api.php?format=json&action=query&list=users&ususers='+uname+'&usprop=blockinfo|groups&xhr='+Math.random,function {                            with (areqs['user']) if (readyState == 4 && status == 200) {                                var api = eval('('+responseText+')');                                with (api.query.users[0]) {                                    if (typeof(missing) != 'undefined') hideElements(['ca-user']);                                    else {                                        if (typeof(blockedby) != 'undefined') {                                            hideElements(['c-ub-block']);                                            document.getElementById('c-ub-ipblock').getElementsByTagName('a')[0].style.color = '#EE1111';                                        }                                        else { hideElements(['c-ub-unblock']); removeLink('c-ub-ipblock'); }

if (typeof(groups) == 'undefined' || groups.join.indexOf('sysop') == -1) hideElements(['c-ul-blocks','c-ul-deletes','c-ul-protects','c-ul-rights']); }                               }                            }                        } );

if (document.getElementById('c-u-rfx')) { areqs['rfa'] = new sajax_init_object; xhr(areqs['rfa'],wgScriptPath+'/api.php?format=json&action=query&list=allpages&apprefix=Requests_for_adminship%2F'+uname+'&apnamespace=4&aplimit=1&xhr='+Math.random,function {                                with (areqs['rfa']) if (readyState == 4 && status == 200) {                                    var api = eval('('+responseText+')');                                    if (!api.query.allpages.length) removeLink('c-ux-rfa');                                }                            } );

areqs['rfb'] = new sajax_init_object; xhr(areqs['rfb'],wgScriptPath+'/api.php?format=json&action=query&list=allpages&apprefix=Requests_for_bureaucratship%2F'+uname+'&apnamespace=4&aplimit=1&xhr='+Math.random,function {                                with (areqs['rfb']) if (readyState == 4 && status == 200) {                                    var api = eval('('+responseText+')');                                    if (!api.query.allpages.length) removeLink('c-ux-rfb');                                }                            } ); }

areqs['uspace'] = new sajax_init_object; xhr(areqs['uspace'],wgScriptPath+'/api.php?format=json&action=query&list=allpages&apprefix='+uname+'%2F&apnamespace=2&aplimit=1&xhr='+Math.random,function {                            with (areqs['uspace']) if (readyState == 4 && status == 200) {                                var api = eval('('+responseText+')');                                if (!api.query.allpages.length) removeLink('c-u-subpages');                            }                        } ); }

if (document.getElementById('c-u-rfx')) { areqs['rfx'] = new sajax_init_object; xhr(areqs['rfx'],wgScriptPath+'/api.php?format=json&action=query&titles=Wikipedia:Requests_for_arbitration/'+uname+'|Wikipedia:Requests_for_comment/'+uname+'|Wikipedia:Requests_for_checkuser/Case/'+uname+'|Wikipedia:Sockpuppet_investigations/'+uname+'&letype=block&letitle=User:'+uname+'&prop=info&xhr='+Math.random,function {                            with (areqs['rfx']) if (readyState == 4 && status == 200) {                                var api = eval('('+responseText+')');                                for (i in api.query.pages) switch (api.query.pages[i].title.split('/')[0]) {                                    case 'Wikipedia:Requests for arbitration': if (typeof(api.query.pages[i].missing) != 'undefined') removeLink('c-ux-rfar'); break;                                    case 'Wikipedia:Requests for comment': if (typeof(api.query.pages[i].missing) != 'undefined') removeLink('c-ux-rfc'); break; case 'Wikipedia:Requests for checkuser': if (typeof(api.query.pages[i].missing) != 'undefined') removeLink('c-ux-rfcu'); break; case 'Wikipedia:Sockpuppet investigations': if (typeof(api.query.pages[i].missing) != 'undefined') removeLink('c-ux-spi'); break; }                           }                        } );                    }

areqs['ublocks'] = new sajax_init_object; xhr(areqs['ublocks'],wgScriptPath+'/api.php?format=json&action=query&list=logevents&letype=block&letitle=User:'+uname+'&lelimit=1&xhr='+Math.random,function {                        with (areqs['ublocks']) if (readyState == 4 && status == 200) {                            var api = eval('('+responseText+')');                            if (!api.query.logevents.length) removeLink('c-ub-blocklog');                        }                    } ); }               else hideElements(['c-ub-ipblock','c-ul-blocks','c-ul-deletes','c-ul-protects','c-ul-rights']);

if (!tbusr) hideElements(['t-contributions','t-log','t-emailuser']); }

document.getElementById('c-u-logs').onmouseover = function {showMenu('opt-user-logs',findPos('c-u-logs',[40,0]))}; document.getElementById('c-u-logs').onmouseout = function {hideMenu('opt-user-logs')}; document.getElementById('c-u-logs').style.fontWeight = 'bold';

document.getElementById('c-u-blocks').onmouseover = function {showMenu('opt-user-blocks',findPos('c-u-blocks',[40,0]))}; document.getElementById('c-u-blocks').onmouseout = function {hideMenu('opt-user-blocks')}; document.getElementById('c-u-blocks').style.fontWeight = 'bold';

if (document.getElementById('c-u-rfx')) { document.getElementById('c-u-rfx').onmouseover = function {showMenu('opt-user-rfx',findPos('c-u-rfx',[40,0]))}; document.getElementById('c-u-rfx').onmouseout = function {hideMenu('opt-user-rfx')}; document.getElementById('c-u-rfx').style.fontWeight = 'bold'; document.getElementById('opt-user-rfx').style.width = '50px'; }

if (cactions.uname.search(/(?:\d{1,3}\.){3}\d{1,3}/) == 0) hideElements(['c-u-logs','c-ux-rfa','c-ux-rfb','c-u-editcount','c-u-editsum','c-u-wcuser','c-u-sul','c-u-subpages','c-u-email','c-u-groups','c-u-rightslog']); }   }

// Page options hook window.gadgetPageOptionsHookInit = function { var wgCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName'); var wgNamespaceNumber = mw.config.get('wgNamespaceNumber'); var wgArticleId = mw.config.get('wgArticleId'); var wgScriptPath = mw.config.get('wgScriptPath'); var wgScript = mw.config.get('wgScript'); var wgCurRevisionId = mw.config.get('wgCurRevisionId');

if (!wgCanonicalSpecialPageName) { with (cactions) { menus[menus.length] = createMenu('page',true,Array( ['c-p-logs',       '#'], wgArticleId? ['c-p-history',    wgScript+'?title='+pname+'&action=history']                         :[] , wgArticleId? ['c-p-move',       wgScript+'?title=Special:Movepage/'+pname+'&action=view']           :[] , skin != 'vector'? ['c-p-watch',      wgScript+'?title='+pname+'&action=watch']                           :[] , skin != 'vector'? ['c-p-unwatch',    wgScript+'?title='+pname+'&action=unwatch']                         :[] , admin? ['c-p-protect',    wgScript+'?title='+pname+'&action=protect']                         :[] , admin? ['c-p-unprotect',  wgScript+'?title='+pname+'&action=unprotect']                       :[] , admin? ['c-p-delete',     wgScript+'?title='+pname+'&action=delete']                          :[] , admin? ['c-p-undelete',   wgScript+'?title=Special:Undelete/'+pname+'&action=view']           :[] , wgArticleId? ['c-p-diff',       wgScript+'?title='+pname+'&action=view&diff='+wgCurRevisionId]      :[] , wgArticleId? ['c-p-editzero',   wgScript+'?title='+pname+'&action=edit&section=0']                  :[] , wgArticleId && mwsvr == 'en.wikipedia.org'? ['c-p-wcpage',     'http://en.wikichecker.com/article/?a='+pname]                      :[] , ['c-p-purge',      wgScript+'?title='+pname+'&action=purge'] ));

menus[menus.length] = createMenu('page-logs',false,Array( ['c-pl-logs',      wgScript+'?title=Special:Log&action=view&page='+pname]                  , ['c-pl-deletes',   wgScript+'?title=Special:Log&type=delete&page='+pname]                  , ['c-pl-moves',     wgScript+'?title=Special:Log&action=view&type=move&page='+pname]        , wgArticleId? ['c-pl-patrols',   wgScript+'?title=Special:Log&action=view&type=patrol&page='+pname]  :[] , ['c-pl-protects',  wgScript+'?title=Special:Log&action=view&type=protect&page='+pname]     , wgNamespaceNumber == 6? ['c-pl-uploads',   wgScript+'?title=Special:Log&action=view&type=upload&page='+pname]  :[] ));           }

if (cactions.itabs) { hideElements(['ca-protect','ca-unprotect','ca-delete','ca-undelete','ca-history','ca-move'],['c-p-unprotect','c-p-protect','c-p-undelete','c-p-delete']); if (skin != 'vector') hideElements(['ca-watch','ca-unwatch'],['c-p-unwatch','c-p-watch']); }           else hideElements(['c-p-history','c-p-move','c-p-watch','c-p-unwatch','c-p-protect','c-p-unprotect','c-p-delete','c-p-undelete']);

document.getElementById('c-p-logs').onmouseover = function {showMenu('opt-page-logs',findPos('c-p-logs',[40,0]))}; document.getElementById('c-p-logs').onmouseout = function {hideMenu('opt-page-logs')}; document.getElementById('c-p-logs').style.fontWeight = 'bold'; }   }

// shortcuts portlet hook window.gadgetPortletHookInit = function { with (cactions) if (svars.length) { var portlet = document.createElement('div'); with (portlet) { id = 'p-sc'; className = (skin == 'vector') ? 'portal collapsed' : 'portlet'; }

var elements = { h3: document.createElement('h3'), div: document.createElement('div'), ul: document.createElement('ul'), li: null, a: null, txt: null };           with (elements) { h3.appendChild(document.createTextNode('Shortcuts')); portlet.appendChild(h3);

div.className = (skin == 'vector') ? 'body' : 'pBody';

for (var i = 0; i < svars.length; i++) if (!svars[i][1].indexOf('/') || !svars[i][1].search(/http[s]?:\/\//)) { li = document.createElement('li'); li.id = 's-'+svars[i][0].toLowerCase.replace(/\W/g,''); a = document.createElement('a'); a.href = svars[i][1]; txt = document.createTextNode(svars[i][0]); a.appendChild(txt); li.appendChild(a); ul.appendChild(li); }               div.appendChild(ul); portlet.appendChild(div); }

switch (skin) { case 'modern': var sidebarID = 'mw_portlets'; break; case 'monobook': case 'uespmonobook': var sidebarID = 'column-one'; break; case 'vector': var sidebarID = 'panel'; break; }           document.getElementById(sidebarID).insertBefore(portlet,document.getElementById('p-lang')); }   }		// Need to make sure the DOM is loaded *and* the language script is loaded before running the init functions window.onGadgetLangLoaded = function { if ($.isReady) { gadgetPageOptionsHookInit; gadgetPortletHookInit; gadgetUserOptionsHookInit; }		else { $(gadgetUserOptionsHookInit); $(gadgetPageOptionsHookInit); $(gadgetPortletHookInit); }	}

// Propose new languages at http://en.wikipedia.org/wiki/User_talk:Haza-w $.getScript('//starfieldwiki.net/w/index.php?title=MediaWiki:Gadget-dropdown-menus-languages.js&action=raw&ctype=text/javascript', window.onGadgetLangLoaded);

// CSS styles if (mw != null && mw.loader != null & mw.loader.load != null) { mw.loader.load('//starfieldwiki.net/w/index.php?title=MediaWiki:Gadget-dropdown-menus.css&ctype=text/css&action=raw', 'text/css'); }

}