User:Haza-w/cactions.js

From Wikipedia, the free encyclopedia

If a message on your talk page led you here, please be wary of who left it. Code that you insert on this page could contain malicious content capable of compromising your account. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. If this is a .js page, the code will be executed when previewing the page.
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
// *** COMMON CROSS-BROWSER COMPATIBILITY CODE ***
 
var isDOM=document.getElementById?1:0,
 isIE=document.all?1:0,
 isNS4=navigator.appName=='Netscape'&&!isDOM?1:0,
 isOp=self.opera?1:0,
 isDyn=isDOM||isIE||isNS4;
 
var cssName = isIE?'divmenuIE':'divmenu';
document.write('<link rel="stylesheet" type="text/css" href="http://en.wikipedia.org/w/index.php?title=User:Haza-w/'+cssName+'.css'
  + '&action=raw&ctype=text/css&dontcountme=s" />');
 
function getRef(i, p)
{
 p=!p?document:p.navigator?p.document:p;
 return isIE ? p.all[i] :
  isDOM ? (p.getElementById?p:p.ownerDocument).getElementById(i) :
  isNS4 ? p.layers[i] : null;
};
 
function getSty(i, p)
{
 var r=getRef(i, p);
 return r?isNS4?r:r.style:null;
};
 
if (!self.LayerObj) var LayerObj = new Function('i', 'p',
 'this.ref=getRef(i, p); this.sty=getSty(i, p); return this');
function getLyr(i, p) { return new LayerObj(i, p) };
 
function LyrFn(n, f)
{
 LayerObj.prototype[n] = new Function('var a=arguments,p=a[0],px=isNS4||isOp?0:"px"; ' +
  'with (this) { '+f+' }');
};
LyrFn('x','if (!isNaN(p)) sty.left=p+px; else return parseInt(sty.left)');
LyrFn('y','if (!isNaN(p)) sty.top=p+px; else return parseInt(sty.top)');
 
var aeOL = [];
function addEvent(o, n, f, l)
{
 var a = 'addEventListener', h = 'on'+n, b = '', s = '';
 if (o[a] && !l) return o[a](n, f, false);
 o._c |= 0;
 if (o[h])
 {
  b = '_f' + o._c++;
  o[b] = o[h];
 }
 s = '_f' + o._c++;
 o[s] = f;
 o[h] = function(e)
 {
  e = e || window.event;
  var r = true;
  if (b) r = o[b](e) != false && r;
  r = o[s](e) != false && r;
  return r;
 };
 aeOL[aeOL.length] = { o: o, h: h };
};
addEvent(window, 'unload', function() {
 for (var i = 0; i < aeOL.length; i++) with (aeOL[i])
 {
  o[h] = null;
  for (var c = 0; o['_f' + c]; c++) o['_f' + c] = null;
 }
});
 
// *** CORE MENU OBJECT AND FUNCTIONS ***
 
function FSMenu(myName, nested, cssProp, cssVis, cssHid)
{
 // This is the base object that users create.
 // It stores menu properties, and has a 'menus' associative array to store a list of menu nodes,
 // and allow timeouts to refer to nodes by name (e.g. menuObject.menus.nodeName).
 
 this.myName = myName;
 this.nested = nested;
 // Some CSS settings users can specify.
 this.cssProp = cssProp;
 this.cssVis = cssVis;
 this.cssHid = cssHid;
 this.cssLitClass = '';
 // The 'root' menu only exists for list menus, and is created in the activation function.
 // For non-nested menus, here's an imaginary node that acts as a parent to other nodes.
 this.menus = { root: new FSMenuNode('root', true, this) };
 this.menuToShow = [];
 this.mtsTimer = null;
 // Other configurable defaults.
 this.showDelay = 0;
 this.switchDelay = 125;
 this.hideDelay = 500;
 this.showOnClick = 0;
 this.animations = [];
 this.animSpeed = 100;
 
 // Free memory onunload in IE.
 if (isIE && !isOp) addEvent(window, 'unload', new Function(myName + ' = null'));
};
 
FSMenu.prototype.show = function(mN) { with (this)
{
 // Set menuToShow to the function parameters. Use a loop to copy values so we don't leak memory.
 menuToShow.length = arguments.length;
 for (var i = 0; i < arguments.length; i++) menuToShow[i] = arguments[i];
 // Use a timer to call a virtual 'root' menu over() function for non-nested menus.
 // For nested/list menus event bubbling will call the real root menu node over() function.
 clearTimeout(mtsTimer);
 if (!nested) mtsTimer = setTimeout(myName + '.menus.root.over()', 10);
}};
 
 
FSMenu.prototype.hide = function(mN) { with (this)
{
 // Clear the above timer and route the hide event to the appropriate menu node.
 clearTimeout(mtsTimer);
 if (menus[mN]) menus[mN].out();
}};
 
function FSMenuNode(id, isRoot, obj)
{
 // Each menu is represented by a FSMenuNode object.
 // This is the node constructor function, with the properties and functions needed by that node.
 // It's passed its own name in the menus[] array, whether this is a root level menu (boolean),
 // and a reference to the parent FSMenu object.
 
 this.id = id;
 this.isRoot = isRoot;
 this.obj = obj;
 this.lyr = this.child = this.par = this.timer = this.visible = null;
 this.args = [];
 var node = this;
 
 // These next per-node over/out functions are an example of closures in JavaScript.
 // Since they're instantiated here, they can use the node's variables as if they were their own.
 
 this.over = function(evt) { with (node) with (obj)
 {
  // Basically, over() gets called when the onmouseover event reaches the menu container,
  // which might be a DIV or UL tag in the document. The event source is a tag inside
  // that container that calls FSMenu.show() and sets the menuToShow array (see above).
  // Browsers will then 'bubble' the event upwards, reaching this function which is set
  // as the onmouseoover/focus/click handler on a menu container. This picks up the
  // properties in menuToShow and shows the given menu as a child of this one.
  // Note that for non-nested menus there is a default timer (mtsTimer) that will mimic
  // an outermost 'root' menu that picks up the event if no other menus intercept it first.
 
  // Ensure NS4 calls the show/hide function within this layer first.
  if (isNS4 && evt && lyr.ref) lyr.ref.routeEvent(evt);
  // Stop this menu hiding itself and intercept the default root show handler (if any).
  clearTimeout(timer);
  clearTimeout(mtsTimer);
 
  // A quick check; if this menu isn't visible, show it (i.e. cancel any animation).
  if (!isRoot && !visible) node.show();
 
  if (menuToShow.length)
  {
   // Pull information out of menuToShow[].
   var a = menuToShow, m = a[0];
   if (!menus[m] || !menus[m].lyr.ref) menus[m] = new FSMenuNode(m, false, obj);
   // c = reference to new child menu that will be shown.
   var c = menus[m];
   // Just clear the menuToShow array and return if we're "showing" the current menu...!
   if (c == node)
   {
    menuToShow.length = 0;
    return;
   }
   // Otherwise, stop any impending show/hide of the child menu, and check if it's a new child.
   clearTimeout(c.timer);
   if (c != child && c.lyr.ref)
   {
    // We have a genuinely new child menu to show. Give it some properties, set a timer to show it.
    // Again, try and avoid memory leaks, but copy over the a/menuToShow arguments.
    c.args.length = a.length;
    for (var i = 0; i < a.length; i++) c.args[i] = a[i];
    // Decide which delay to use -- switchDelay if we already have a child menu, showDelay otherwise.
    var delay = child ? switchDelay : showDelay;
    c.timer = setTimeout('with(' + myName + ') { menus["' + c.id + '"].par = menus["' +
     node.id + '"]; menus["' + c.id + '"].show() }', delay ? delay : 1);
   }
   // Try, try, try to avoid leaking memory... :).
   menuToShow.length = 0;
  }
 
  // For non-nested menus, mimic event bubbling.
  if (!nested && par) par.over();
 }};
 
 this.out = function(evt) { with (node) with (obj)
 {
  // Basically the same as over(), this cancels impending events and sets a hide timer.
  if (isNS4 && evt && lyr && lyr.ref) lyr.ref.routeEvent(evt);
  clearTimeout(timer);
  // We never hide the root menu. Otherwise, mimic event-bubbling for non-nested menus.
  if (!isRoot)
  {
   timer = setTimeout(myName + '.menus["' + id + '"].hide()', hideDelay);
   if (!nested && par) par.out();
  }
 }};
 
 // Finally, now we have created our menu node, get a layer object for the right ID'd element
 // in the page, and assign it onmouseout/onmouseover events. Don't do for virtual root node.
 if (this.id != 'root') with (this) with (lyr = getLyr(id)) if (ref)
 {
  if (isNS4) ref.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
  addEvent(ref, 'mouseover', this.over);
  addEvent(ref, 'mouseout', this.out);
  // For nested UL/LI menus, assign focus/blur events for accessibility.
  if (obj.nested)
  {
   addEvent(ref, 'focus', this.over);
   addEvent(ref, 'click', this.over);
   addEvent(ref, 'blur', this.out);
  }
 }
};
 
FSMenuNode.prototype.show = function() { with (this) with (obj)
{
 // This is called to show the menu node of which it's a method.
 // It sets the parent's child to this, and hides any existing children of the parent node.
 if (!lyr || !lyr.ref) return;
 
 if (par)
 {
  if (par.child && par.child != this) par.child.hide();
  par.child = this;
 }
 
 // This pulls values out of the stored args[] array, and uses the page.elmPos function in the
 // cross-browser code to find the pixel position of the parent item + menu.
 var offR = args[1], offX = args[2], offY = args[3], lX = 0, lY = 0,
  doX = ''+offX!='undefined', doY = ''+offY!='undefined';
 if (self.page && offR && (doX||doY))
 {
  with (page.elmPos(offR, par.lyr ? par.lyr.ref : 0)) lX = x, lY = y;
  if (doX) lyr.x(lX + eval(offX));
  if (doY) lyr.y(lY + eval(offY));
 }
 
 // Highlight the triggering element, if any.
 if (offR) lightParent(offR, 1);
 
 // Show the menu and trigger any 'onshow' events.
 visible = 1;
 if (obj.onshow) obj.onshow(id);
 setVis(1);
}};
 
FSMenuNode.prototype.hide = function() { with (this) with (obj)
{
 // Same as show() above, but this clears the child/parent settings and hides the menu.
 if (!lyr || !lyr.ref) return;
 
 // This is an NS4 hack as its mouse events are notoriously unreliable. Remove as needed.
 if (isNS4 && self.isMouseIn && isMouseIn(lyr.ref)) return show();
 // Dim the triggering element.
 if (args[1]) lightParent(args[1], 0);
 
 // Route the hide call through any child nodes, and clear the par/child references.
 if (child) child.hide();
 if (par && par.child == this) par.child = null;
 
 // Hide the menu node element, and trigger an 'onhide' event if set.
 if (lyr)
 {
  visible = 0;
  if (obj.onhide) obj.onhide(id);
  setVis(0);
 }
}};
 
FSMenuNode.prototype.lightParent = function(elm, lit) { with (this) with (obj)
{
 // This is passed a reference to the parent triggering element, and whether it is lit or not.
 
 if (!cssLitClass || isNS4) return;
 // By default the cssLitClass value is appended/removed to any existing class.
 // Otherwise, if hiding, remove all trailing instances of it (in case of script errors).
 if (lit) elm.className += (elm.className?' ':'') + cssLitClass;
 else elm.className = elm.className.replace(new RegExp('(\\s*' + cssLitClass + ')+$'), '');
}};
 
FSMenuNode.prototype.setVis = function(sh) { with (this) with (obj)
{
 // This is passed one parameter by the core script, whether its menu is shown (boolean).
 // It sets the chosen CSS property of the menu element, and repeatedly calls itself if
 // one or more animations have been specified in the animations property.
 
 lyr.timer |= 0;
 lyr.counter |= 0;
 with (lyr)
 {
  clearTimeout(timer);
  if (sh && !counter) sty[cssProp] = cssVis;
 
  if (isDOM && animSpeed < 100)
   for (var a = 0; a < animations.length; a++) animations[a](ref, counter);
 
  counter += animSpeed*(sh?1:-1);
  if (counter>100) { counter = 100 }
  else if (counter<=0) { counter = 0; sty[cssProp] = cssHid }
  else if (isDOM)
   timer = setTimeout(myName + '.menus["' + id + '"].setVis(' + sh + ')', 50);
 }
}};
 
// *** LIST MENU ACTIVATION ***
 
FSMenu.prototype.activateMenu = function(id, subInd) { with (this)
{
 if (!isDOM || !document.documentElement) return;
 var a, ul, li, parUL, mRoot = getRef(id), nodes, count = 1;
 
 // Because IE sucks, we emulate onfocus/blur event bubbling for accessibility.
 if (isIE)
 {
  var aNodes = mRoot.getElementsByTagName('a');
  for (var i = 0; i < aNodes.length; i++)
  {
   addEvent(aNodes[i], 'focus', new Function('e', 'var node = this.parentNode; while(node) { ' +
    'if (node.onfocus) setTimeout(node.onfocus, 1, e); node = node.parentNode }'));
   addEvent(aNodes[i], 'blur', new Function('e', 'var node = this.parentNode; while(node) { ' +
    'if (node.onblur) node.onblur(e); node = node.parentNode }'));
  }
 }
 
 // Loop through all sub-lists under the given menu.
 var lists = mRoot.getElementsByTagName('ul');
 for (var i = 0; i < lists.length; i++)
 {
  // Find a parent LI node, if any, by recursing upwards from the UL. Quit if not found.
  li = ul = lists[i];
  while (li)
  {
   if (li.nodeName.toLowerCase() == 'li') break;
   li = li.parentNode;
  }
  if (!li) continue;
  // Next, find the parent UL to that LI node.
  parUL = li;
  while (parUL)
  {
   if (parUL.nodeName.toLowerCase() == 'ul') break;
   parUL = parUL.parentNode;
  }
 
  a = null;
  for (var j = 0; j < li.childNodes.length; j++)
   if (li.childNodes[j].nodeName.toLowerCase() == 'a') a = li.childNodes[j];
  if (!a) continue;
 
  // We've found a menu node by now, so give it an ID and event handlers.
  var menuID = myName + '-id-' + count++;
  // Only assign a new ID if it doesn't have one already.
  if (ul.id) menuID = ul.id;
  else ul.setAttribute('id', menuID);
 
  // Attach focus/mouse events to the triggering anchor tag.
  // Check if this link will be triggered onclick instead of onmouseover.
  // If so, we only respect mouseovers/focuses when the menu is visible from a click.
  var sOC = (showOnClick == 1 && li.parentNode == mRoot) || (showOnClick == 2);
  var eShow = new Function('with (' + myName + ') { ' +
   'var m = menus["'+menuID+'"], pM = menus["' + parUL.id + '"];' +
   (sOC ? 'if ((pM && pM.child) || (m && m.visible))' : '') +
   ' show("' + menuID + '", this) }');
  var eHide = new Function(myName + '.hide("' + menuID + '")');
  addEvent(a, 'mouseover', eShow);
  addEvent(a, 'focus', eShow);
  addEvent(a, 'mouseout', eHide);
  addEvent(a, 'blur', eHide);
  if (sOC) addEvent(a, 'click', new Function('e', myName + '.show("' + menuID +
   '", this); if (e.cancelable && e.preventDefault) e.preventDefault(); ' +
   'e.returnValue = false; return false'));
 
  // Prepend an arrow indicator to the anchor tag content if given.
  if (subInd) a.insertBefore(subInd.cloneNode(true), a.firstChild);
 }
 
 // Finally, create/activate the root node.
 menus[id] = new FSMenuNode(id, true, this);
}};
 
// *** DIV MENU & v4 BROWSER COMPATIBILITY ***
 
if (!self.page) var page = { win:self, minW:0, minH:0, MS:isIE&&!isOp };
page.elmPos=function(e,p)
{
 var x=0,y=0,w=p?p:this.win;
 e=e?(e.substr?(isNS4?w.document.anchors[e]:getRef(e,w)):e):p;
 if(isNS4){if(e&&(e!=p)){x=e.x;y=e.y};if(p){x+=p.pageX;y+=p.pageY}}
 if (e && this.MS && navigator.platform.indexOf('Mac')>-1 && e.tagName=='A')
 {
  e.onfocus = new Function('with(event){self.tmpX=clientX-offsetX;' +
   'self.tmpY=clientY-offsetY}');
  e.focus();x=tmpX;y=tmpY;e.blur()
 }
 else while(e){x+=e.offsetLeft;y+=e.offsetTop;e=e.offsetParent}
 return{x:x,y:y};
};
 
if (isNS4)
{
 var fsmMouseX, fsmMouseY, fsmOR=self.onresize, nsWinW=innerWidth, nsWinH=innerHeight;
 document.fsmMM=document.onmousemove;
 
 self.onresize = function()
 {
  if (fsmOR) fsmOR();
  if (nsWinW!=innerWidth || nsWinH!=innerHeight) location.reload();
 };
 
 document.captureEvents(Event.MOUSEMOVE);
 document.onmousemove = function(e)
 {
  fsmMouseX = e.pageX;
  fsmMouseY = e.pageY;
  return document.fsmMM?document.fsmMM(e):document.routeEvent(e);
 };
 
 function isMouseIn(sty)
 {
  with (sty) return ((fsmMouseX>left) && (fsmMouseX<left+clip.width) &&
   (fsmMouseY>top) && (fsmMouseY<top+clip.height));
 };
}
 
var divMenu = new FSMenu('divMenu', false, 'visibility', 'visible', 'hidden');
divMenu.cssLitClass = 'highlighted';
 
if (typeof(ctOriginalTabs) == 'undefined') var ctOriginalTabs = 0;
if (typeof(ctIsAdmin) == 'undefined') var ctIsAdmin = 0;
if (typeof(ctEditIntro) == 'undefined') var ctEditIntro = 0;
if (typeof(ctCustOpts) == 'undefined') var ctCustOpts = 0;
 
// Translingual support
if (typeof(ctWikiId) == 'undefined') var ctWikiId = 'enwiki_p';
if (ctWikiId == 'enwiki_p') {
  var UserStr = 'User:',
    UserTalkStr = 'User_talk:',
    TitleSuffix = ' - Wikipedia, the free encyclopedia',
    SiteAddr = 'en.wikipedia.org';
}
if (ctWikiId == 'frwiki_p') {
  var UserStr = 'Utilisateur:',
    UserTalkStr = 'Discussion_Utilisateur:',
    TitleSuffix = ' - Wikipédia',
    SiteAddr = 'fr.wikipedia.org';
}
if (ctWikiId == 'enwikibooks_p') {
  var UserStr = 'User:',
    UserTalkStr = 'User_talk:',
    TitleSuffix = ' - Wikibooks, collection of open-content textbooks',
    SideAddr = 'en.wikibooks.org';
}
 
function parseURL(URLstr) {
  var l1 = URLstr.replace(/%3A/g,':').replace(/%2F/g,'/'),
    l2 = l1.indexOf('/w/index.php?')>-1?l1.split('title=')[1].split('&')[0].split('#')[0]:l1.split('/wiki/')[1].split('?')[0].replace(/&/g,'%26').replace(/"/g,'%22').split('#')[0];
  return l2;
}
 
function returnPath(isuser) {
  var p1 = parseURL(window.location.toString()),
    p1a = document.title.split(TitleSuffix)[0].replace(/ /g,'_').replace(/&/g,'%26').replace(/"/g,'%22'),
    p2 = document.getElementById('contentSub').innerHTML.indexOf('(Redirected from ')!=-1?isuser?p1a.split(':')[1].split('/')[0]:p1a:isuser?p1.split(':')[1].split('/')[0]:p1;
  return p2;
}
 
function userIsTrue() {
  var u1 = parseURL(window.location.toString()),
    u2 = u1.indexOf(UserStr)+u1.indexOf(UserTalkStr)>-2?1:0;
  return u2;
}
 
// User block query, uses XMLHttpRequest
var XHR;
 
function checkIPBL(uname) {
  var csub = document.getElementById('contentSub');
  if (window.XMLHttpRequest) {
    XHR = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    XHR = new ActiveXObject("Microsoft.XMLHTTP");
  } else XHR = null;
 
  if (XHR == null) {
    csub.innerHTML += "<br />No browser support, directing to block page anyway.";
    window.location = "/wiki/Special:Blockip/"+uname;
  }
  else {
	csub.innerHTML += "<br />Querying active block list...";
    XHR.open("GET","/w/index.php?title=Special:Ipblocklist&action=search&ip="+uname,true);
    XHR.onreadystatechange = processXHR;
	XHR.overrideMimeType('text/xml');
    XHR.send(null);
  }
}
 
function processXHR() {
  var checkIP = returnPath(1).replace(/_/g,' ').replace(/%26/g,'&amp').replace(/%22/g,'"');
  var csub = document.getElementById('contentSub');
  if (XHR.readyState != 4) {
    csub.innerHTML += "."
  return;
  }
  csub.innerHTML += "<br />Block list loaded...";
  if (XHR.status != 200) {
    csub.innerHTML += "<br />Query returned error "+XHR.status;
	return;
  }
  var XMLdata = XHR.responseXML;
  var ULexist = XMLdata.getElementById('bodyContent').getElementsByTagName('ul');
  if (ULexist.length == 0) window.location = "/wiki/Special:Blockip/"+returnPath(1);
  else {
    if (XMLdata.getElementById('bodyContent').getElementsByTagName('ul')[0].firstChild.getElementsByTagName('a')[4].firstChild.data != checkIP) {
      csub.innerHTML += "<br />User not blocked, directing to block page...";
      window.location = "/wiki/Special:Blockip/"+returnPath(1);
    } else {
      csub.innerHTML += "<br />User blocked, directing to unblock page...";
	  window.location = "/w/index.php?title=Special:Ipblocklist&action=unblock&ip="+returnPath(1).replace(/_/g,'%20');
    }
  }
}
 
// Check if node ID exists
function removeNode(parentNode,nodeID) {
  if (document.getElementById(nodeID)) {
    var nodeDOM = document.getElementById(nodeID);
    parentNode.removeChild(nodeDOM);
  }
}
 
function addPgOpts() {
  var pgPath = returnPath(0);
 
  var watchlist = document.getElementById('ca-watch')?'Watch':'Unwatch',
    protection = document.getElementById('ca-protect')?'Protect':'Unprotect',
    pageExists = document.getElementById('ca-history')?1:0,
    undelete = document.getElementById('ca-undelete')?1:0;
 
  var pgOptsDiv = document.createElement('div');
    pgOptsDiv.id = 'pgOpts';
    pgOptsDiv.className = 'menudiv'
    pgOptsDiv.style.width = '150px';
 
    var podHeader = '<div class="header">Page options</div>',
      podHistory = pageExists&&!ctOriginalTabs?'<a href="/w/index.php?title='+pgPath+'&amp;action=history">History</a>':'',
      podMove = pageExists&&!ctOriginalTabs?'<a href="/wiki/Special:Movepage/'+ pgPath+'">Move</a>':'',
      podWatch = !ctOriginalTabs?'<a href="/w/index.php?title='+pgPath+'&amp;action='+watchlist.toLowerCase()+'">'+watchlist+'</a>':'',
      podDiff = pageExists?'<a href="/w/index.php?title='+pgPath+'&amp;diff=cur">Latest diff</a>':'',
      podIntro = ctEditIntro?'<a href="/w/index.php?title='+pgPath+'&amp;action=edit&amp;section=0">Edit intro</a>':'',
      podProtect = pageExists&&ctIsAdmin&&!ctOriginalTabs?'<a href="/w/index.php?title='+pgPath+'&amp;action='+protection.toLowerCase()+'"><b>'+protection+' page</b></a>':'',
      podDelete = pageExists&&ctIsAdmin&&!ctOriginalTabs?'<a href="/w/index.php?title='+pgPath+'&amp;action=delete"><b>Delete page</b></a>':'',
      podUndelete = !pageExists&&ctIsAdmin&&undelete&&!ctOriginalTabs?'<a href="/wiki/Special:Undelete/'+pgPath+'"><b>Undelete</b></a>':'',
      podProtectlog = pageExists?'<a href="/w/index.php?title=Special:Log&amp;type=protect&amp;page='+pgPath+'">Protection log</a>':'',
      podMovelog = pageExists?'<a href="/w/index.php?title=Special:Log&amp;type=move&amp;page='+pgPath+'">Move log</a>':'',
      podDeletelog = '<a href="/w/index.php?title=Special:Log&amp;type=delete&amp;page='+pgPath+'">Deletion log</a>',
      podPurge = '<a href="/w/index.php?title='+pgPath+'&amp;action=purge">Purge cache</a>';
    pgOptsDiv.innerHTML = podHeader+podHistory+podMove+podWatch+podDiff+podIntro+podProtect+podDelete+podUndelete+podProtectlog+podMovelog+podDeletelog+podPurge;
 
  var globalWrapDiv = document.getElementById('globalWrapper'),
    bodyElement = globalWrapDiv.parentNode;
  bodyElement.insertBefore(pgOptsDiv,globalWrapDiv);
 
  var pgCaction = document.createElement('li');
    pgCaction.id = 'ca-pgopts';
    pgCaction.innerHTML = '<a href="#" onmouseover="divMenu.show(\'pgOpts\', this, 50, 10)" onmouseout="divMenu.hide(\'pgOpts\')">Page options</a>';
 
  document.getElementById('p-cactions').getElementsByTagName('ul')[0].appendChild(pgCaction);
 
  if (!ctOriginalTabs) {
    var cactionUL = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
 
    removeNode(cactionUL,'ca-history');
    removeNode(cactionUL,'ca-move');
    removeNode(cactionUL,'ca-' + watchlist.toLowerCase());
 
    if (ctIsAdmin) {
      removeNode(cactionUL,'ca-'+protection.toLowerCase());
      removeNode(cactionUL,'ca-delete');
      removeNode(cactionUL,'ca-undelete');
    }
  }
}
 
function addUsrOpts() {
  var usrPath = returnPath(1);
 
  var usrOptsDiv = document.createElement('div');
    usrOptsDiv.id = 'usrOpts';
    usrOptsDiv.className = 'menudiv'
    usrOptsDiv.style.width = '150px';
 
    var uodHeader = '<div class="header">User options</div>',
      uodVO = '<a href="#" onmouseover="divMenu.show(\'vandOpts\', this, 90, 10)" onmouseout="divMenu.hide(\'vandOpts\')"><b>Vandals &gt;</b></a>',
      uodContribs = '<a href="/wiki/Special:Contributions/'+ usrPath+'">Contributions</a>',
      uodEditsTS = ctWikiId!='enwiki_p'?'<a href="http://tools.wikimedia.de/~interiot/cgi-bin/count_edits?dbname='+ctWikiId+'&amp;user='+usrPath+'">Edit count (ts)</a>':'',
      uodEditsEs = '<a href="http://tools.wikimedia.de/~interiot/cgi-bin/Tool1/wannabe_kate?username='+usrPath+'&site='+SiteAddr+'">Edit count (ts2)</a>',
      uodEditsJS = !isIE&ctWikiId=='enwiki_p'?'<a href="/wiki/User:Interiot/Tool2/code.js?username='+usrPath+'">Edit count (js)</a>':'',
      uodEsum = '<a href="http://www.math.ucla.edu/~aoleg/wp/rfa/edit_summary.cgi?lang='+ctWikiId.slice(0,2)+'&amp;user='+usrPath+'">Edit summary usage</a>',
	  uodEmail = '<a href="/wiki/Special:Emailuser/'+ usrPath+'">E-mail</a>',
      uodUlist = '<a href="/w/index.php?title=Special:Listusers&amp;username='+usrPath+'">User groups</a>',
      uodCreate = '<a href="/w/index.php?title=Special:Log&amp;type=newusers&amp;user='+usrPath+'">User creation log</a>',
      uodRights = '<a href="/w/index.php?title=Special:Log&amp;type=rights&amp;page=User:'+usrPath+'">Rights changes</a>';
    usrOptsDiv.innerHTML = uodHeader+uodVO+uodContribs+uodEditsTS+uodEditsEs+uodEditsJS+uodEsum+uodEmail+uodUlist+uodCreate+uodRights;
 
  var vandOptsDiv = document.createElement('div');
    vandOptsDiv.id = 'vandOpts';
    vandOptsDiv.className = 'menudiv'
    vandOptsDiv.style.width = '150px';
 
    var vodHeader = '<div class="header">Vandal options</div>',
      vodBlock = ctIsAdmin?'<a href="javascript:checkIPBL(\''+usrPath+'\')"><b>Block/unblock</b></a>':'',
      vodBlocklog = '<a href="/w/index.php?title=Special:Log&amp;type=block&amp;page=User:'+usrPath+'">Block log</a>',
      vodBlocklist = '<a href="/w/index.php?title=Special:Ipblocklist&amp;action=search&amp;ip='+usrPath+'">Current block list</a>';
    vandOptsDiv.innerHTML = vodHeader+vodBlock+vodBlocklog+vodBlocklist;
 
  var globalWrapDiv = document.getElementById('globalWrapper'),
    bodyElement = globalWrapDiv.parentNode;
  bodyElement.insertBefore(usrOptsDiv,globalWrapDiv);
  bodyElement.insertBefore(vandOptsDiv,globalWrapDiv);
 
  var usrCaction = document.createElement('li');
    usrCaction.id = 'ca-usropts';
    usrCaction.innerHTML = '<a href="#" onmouseover="divMenu.show(\'usrOpts\', this, 50, 10)" onmouseout="divMenu.hide(\'usrOpts\')">User options</a>';
 
  if (document.getElementById('ca-pgopts')) {
    var pgCactionDOM = document.getElementById('ca-pgopts');
    document.getElementById('p-cactions').getElementsByTagName('ul')[0].insertBefore(usrCaction,pgCactionDOM);
  }
  else {
    document.getElementById('p-cactions').getElementsByTagName('ul')[0].appendChild(usrCaction);
  }
}
 
 
function addCustOpts() {
  now = new Date();
  month = new Array();
  month[0] = "January";
  month[1] = "February";
  month[2] = "March";
  month[3] = "April";
  month[4] = "May";
  month[5] = "June";
  month[6] = "July";
  month[7] = "August";
  month[8] = "September";
  month[9] = "October";
  month[10] = "November";
  month[11] = "December";
 
  var custOptsDiv = document.createElement('div');
    custOptsDiv.id = 'custOpts';
    custOptsDiv.className = 'menudiv'
    custOptsDiv.style.width = '150px';
 
    var custHeader = '<div class="header">Wikilinks</div>',
      custCal = '<a href="/wiki/Wikipedia:Esperanza/Calendar/'+ month[now.getMonth()]+'">Calendar</a>',
	  custStubs = '<a href="/wiki/Category:Stubs">Cat:Stubs</a>',
	  custTests = '<a href="/wiki/Template:TestTemplates">TestTemplates</a>',
	  custCSD = '<a href="/wiki/Wikipedia:Criteria_for_speedy_deletion">Criteria for SD</a>',
      custRfA = '<a href="/wiki/Wikipedia:Requests_for_adminship">RfA</a>',
	  custAfD = '<a href="/wiki/Wikipedia:Articles_for_deletion/Log/Today">AfD</a>',
	  custNP = '<a href="/wiki/Special:Newpages">New pages</a>';
    custOptsDiv.innerHTML = custHeader+custCal+custStubs+custTests+custCSD+custRfA+custAfD+custNP;
 
  var globalWrapDiv = document.getElementById('globalWrapper'),
    bodyElement = globalWrapDiv.parentNode;
  bodyElement.insertBefore(custOptsDiv,globalWrapDiv);
 
  var custCaction = document.createElement('li');
    custCaction.id = 'ca-custopts';
    custCaction.innerHTML = '<a href="#" onmouseover="divMenu.show(\'custOpts\', this, 50, 10)" onmouseout="divMenu.hide(\'custOpts\')">Wikilinks</a>';
 
  document.getElementById('p-cactions').getElementsByTagName('ul')[0].appendChild(custCaction);
}
 
if (parseURL(window.location.toString()).indexOf('Special:') < 0) {
  if ( window.addEventListener ) window.addEventListener( 'load', addPgOpts, false );
  else if ( window.attachEvent ) window.attachEvent( 'onload', addPgOpts );
}
 
if (userIsTrue()) {
  if ( window.addEventListener ) window.addEventListener( 'load', addUsrOpts, false );
  else if ( window.attachEvent ) window.attachEvent( 'onload', addUsrOpts );
}
 
if (ctCustOpts) {
  if ( window.addEventListener ) window.addEventListener( 'load', addCustOpts, false );
  else if ( window.attachEvent ) window.attachEvent( 'onload', addCustOpts );
}