User:Nx/Scripts/Botswitch greasemonkey.js

/*<![CDATA[*/ // ==UserScript== // @name          botswitch // @namespace     http://www.rationalwiki.com/User:Nx // @description   Script to allow switching between two accounts easily on rationalwiki.com // @include       http://rationalwiki.com/* // @include       http://www.rationalwiki.com/* // ==/UserScript==

//Contains switching rules, in the form of "Username" : "Username to switch to" accounts = { "Nx" : "NxBot", "NxBot" : "Nx" }

/* getElementsByClass

function getElementsByClass(classname,node) { function _recGet(out, element, cname) {   while(element) {     if (element.nodeType == 1) {       if (element.className) {         if (element.className.indexOf(cname) != -1) {           out.push(element); }       }        _recGet(out,element.firstChild,cname) }     element = element.nextSibling; } }  if (!node) node = document.documentElement; var res = new Array; _recGet(res,node,classname); return res; }

/* Forms

function JForm { //styles

var s = document.createElement('style');

s.type = 'text/css';

s.rel = 'stylesheet';

s.appendChild(document.createTextNode('')); //Safari sometimes borks on null

document.getElementsByTagName('head')[0].appendChild(s);

var ss;

if (s.styleSheet) {ss = s.styleSheet;} //IE

else {ss = s.sheet;}

ss.insertRule(

"form.jform { width:96%; " +

"margin:auto; " + "padding:.5em; " + "vertical-align:middle; " +

"}"

,0

);

ss.insertRule(

"form.jform * { font-family:sans-serif; " + "vertical-align:middle; " +

"}"

,0

);

this.root = document.createElement("form"); this.root.className="jform"; this.root.setAttribute("action","javascript:void(0)"); }

JForm.prototype.addCallback = function(callback, type) { if (typeof type == 'undefined' ) type = "submit"; this.root.addEventListener(type,callback,false); }

JForm.prototype.addControl = function(control) { this.root.appendChild(control.element); }

JForm.prototype.addElement = function(elem) { this.root.appendChild(elem); }

JForm.control = function(type,id,nm,data) { switch(type) { case "input" : this.type="input"; this.element = document.createElement("input"); this.element.setAttribute("id",id); this.element.setAttribute("name",nm); if (typeof data == "undefined") data = {}; if (data.type) {     this.element.setAttribute("type", data.value); } else { this.element.setAttribute("type", "text"); }   if (data.value) {     this.element.setAttribute("value", data.value); }   if (data.disabled) {     this.element.setAttribute("disabled", data.disabled); }   if (data.readonly) {     this.element.setAttribute("readonly", data.readonly); }   if (data.maxlength) {     this.element.setAttribute("maxlength", data.maxlength); }   if (data.callback) {     this.addCallback(data.callback.handler, data.callback.type); } break; case "text" : this.type="text"; this.element = document.createElement("input"); this.element.setAttribute("type", "text"); this.element.setAttribute("id",id); this.element.setAttribute("name",nm); if (typeof data == "undefined") data = {}; if (data.value) {     this.element.setAttribute("value", data.value); }   if (data.disabled) {     this.element.setAttribute("disabled", data.disabled); }   if (data.readonly) {     this.element.setAttribute("readonly", data.readonly); }   if (data.maxlength) {     this.element.setAttribute("maxlength", data.maxlength); }   if (data.callback) {     this.addCallback(data.callback.handler, data.callback.type); } break; case "password" : this.type="password"; this.element = document.createElement("input"); this.element.setAttribute("type", "password"); this.element.setAttribute("id",id); this.element.setAttribute("name",nm); if (typeof data == "undefined") data = {}; if (data.value) {     this.element.setAttribute("value", data.value); }   if (data.disabled) {     this.element.setAttribute("disabled", data.disabled); }   if (data.readonly) {     this.element.setAttribute("readonly", data.readonly); }   if (data.maxlength) {     this.element.setAttribute("maxlength", data.maxlength); }   if (data.callback) {     this.addCallback(data.callback.handler, data.callback.type); } break; case "button" : this.type="button"; this.element = document.createElement("input"); this.element.setAttribute("id",id); this.element.setAttribute("name",nm); this.element.setAttribute("type", "button"); if (typeof data == "undefined") data = {}; if (data.label) {     this.element.setAttribute("value", data.label); }   if (data.disabled) {     this.element.setAttribute("disabled", data.disabled); }   if (data.callback) {     this.addCallback(data.callback.handler, data.callback.type); } break; case "label" : this.type="label"; this.element = document.createElement("label"); this.element.setAttribute("id",id); if (typeof data == "undefined") data = {}; if (data.label) {     this.element.innerHTML = data.label; }   if (data.boundto) {     this.element.setAttribute("for", data.boundto); } break; case "checkbox" : this.type="checkbox"; this.element = document.createElement("input"); this.element.setAttribute("id",id); this.element.setAttribute("name",nm); this.element.setAttribute("type", "checkbox"); if (typeof data == "undefined") data = {}; if (data.label) {     this.element.setAttribute("value", data.label); }   if (data.disabled) {     this.element.setAttribute("disabled", data.disabled); }   if (data.checked) {     this.element.setAttribute("checked", data.checked); }   if (data.callback) {     this.addCallback(data.callback.handler, data.callback.type); } break; } }

JForm.control.prototype.addCallback = function(callback, type) { if (typeof type == 'undefined' ) {   switch(this.type) {   case "input" : type = "keyup"; break; case "button" : type = "click"; break; case "checkbox" : type = "change"; break; } }  this.element.addEventListener(type,callback,false); }

/* Javascript Windowing system

var focused = null;

var maxfocus = 100;

var windows = [];

var defaultleft = 20;

var defaulttop = 20;

function JWindow(title, width, height, left, top, resizable)

{

//styles

var s = document.createElement('style');

s.type = 'text/css';

s.rel = 'stylesheet';

s.appendChild(document.createTextNode('')); //Safari sometimes borks on null

document.getElementsByTagName('head')[0].appendChild(s);

var ss;

if (s.styleSheet) {ss = s.styleSheet;} //IE

else {ss = s.sheet;}

ss.insertRule(

".jwindow_frame { position:fixed; " +

"display:block; " +

"background-color:lightblue; " +

"border:4px solid DodgerBlue; " +

"z-index:99; " +

"}"

,0

);

ss.insertRule(

".jwindow_frame .titlebar { position:absolute; " +

"left:0px; " +

"top:0px; " +

"background-color:DodgerBlue; " +

"color:White; " +

"cursor:move; " +

"height:20px; " +

"width:100%; " +

"}"

,0

);

ss.insertRule(

".jwindow_frame .shadebutton { position:absolute; " +

"right:21px; " +

"top:0px; " +

"background-color:yellow; " +

"color:black; " + "text-align:center; " + "vertical-align:middle; " +

"cursor:pointer; " +

"height:18px; " +

"width:18px; " +

"}"

,0

);

ss.insertRule(

".jwindow_frame .closebutton { position:absolute; " +

"right:0px; " +

"top:0px; " +

"background-color:red; " +

"color:black; " + "text-align:center; " + "vertical-align:middle; " +

"cursor:pointer; " +

"height:18px; " +

"width:18px; " +

"}"

,0

);

ss.insertRule(

".jwindow_frame .clientarea { position:absolute; " +

"right:0px; " +

"top:20px; " + "width:100%; " +

"background-color:transparent; " + "overflow:auto; " +

"}"

,0

);

//default values

if (typeof width == 'undefined' ) width = 400;

if (typeof height == 'undefined' ) height = 300;

if (typeof left == 'undefined' ) left = defaultleft;

if (typeof top == 'undefined' ) top = defaulttop;

if (typeof title == 'undefined' ) title = 'Untitled'; if (typeof resizable == 'undefined' ) resizable = 'true';

this.resizable = resizable;

this.nu = true;

this.title = title;

this.frameThickness = 4;

this.dir = "";

this.state = "inactive";

this.shaded = false;

this.frame = document.createElement('div');

this.titlebar = document.createElement('div');

this.shadebutton = document.createElement('div');

this.closebutton = document.createElement('div'); this.clientarea = document.createElement('div');

this.frame.className = 'jwindow_frame';

this.titlebar.className = 'titlebar';

this.shadebutton.className = 'shadebutton';

this.closebutton.className = 'closebutton'; this.clientarea.className = 'clientarea';

this.shadebutton.innerHTML = '-';

this.closebutton.innerHTML = 'x';

this.titlebar.textContent = this.title;

this.frame.appendChild(this.titlebar);

this.frame.appendChild(this.shadebutton);

this.frame.appendChild(this.closebutton); this.frame.appendChild(this.clientarea);

this.closebutton.title = "Close";

this.shadebutton.title = "Shade"; this.setWidth(width);

this.setHeight(height);

this.setLeft(left);

this.setTop(top);

var self = this;

this.frame.addEventListener('mousedown',function(e) {self.focus; /*e.preventDefault;*/ return false;},false);

this.frame.addEventListener('mousedown',function(e) {self.initRes(e); return false;},false);

this.titlebar.addEventListener('mousedown',function(e) {self.initMove(e); return false;},false);

this.shadebutton.addEventListener('mousedown',function(e) {self.shade(e); return false;},false);

this.closebutton.addEventListener('mousedown',function(e) {if (e.preventDefault) {e.preventDefault;} self.close; return false;},false);

window.addEventListener('mousemove',function(e) {self.handleEvent(e);},false);

window.addEventListener('mouseup',function(e) {self.handleEvent(e);},false);

window.addEventListener('mouseover',function(e) {self.handleEvent(e);},false);

window.addEventListener('mousedown',function(e) {self.handleEvent(e);},false);

windows.push(this);

this.focus;

}

JWindow.prototype.display = function

{

if (this.nu)

{

this.nu = false;

defaulttop += 32;

defaultleft += 32;

if (window.innerHeight != null && defaulttop > window.innerHeight)

{

defaulttop = 20;

}

}

document.body.appendChild(this.frame);

}

JWindow.prototype.close = function

{

document.body.removeChild(this.frame);

}

JWindow.prototype.setTitle = function(title)

{

this.title = title;

this.titlebar.textContent = this.title;

}

JWindow.prototype.setWidth = function(width)

{

this.width = width;

this.frame.style.width = this.width + "px";

}

JWindow.prototype.setHeight = function(height)

{

this.height = height;

this.frame.style.height = this.height + "px"; this.clientarea.style.height = (this.height - 20) + "px";

}

JWindow.prototype.setTop = function(top)

{if (typeof title == 'undefined' ) title = 'Untitled';

this.top = top;

this.frame.style.top = this.top + "px";

}

JWindow.prototype.setLeft = function(left)

{

this.left = left;

this.frame.style.left = this.left + "px";

}

JWindow.prototype.setResizable = function(res) { this.resizable = res; }

function focussortfunc(a, b)

{

if (a.frame.style.zIndex < b.frame.style.zIndex)

{

return -1;

} else if (a.frame.style.zIndex > b.frame.style.zIndex)

{

return 1;

} else

{

return 0;

}

}

JWindow.prototype.focus = function

{

if (this.frame.style.zIndex != maxfocus)

{

this.frame.style.zIndex = ++maxfocus;

}

if (maxfocus > 500)

{

windows.sort(focussortfunc);

for (var i = 0; i window.innerWidth || y > window.innerHeight) return;

this.left = (x - this.moveOffsetX);

this.top = (y - this.moveOffsetY);

this.frame.style.left = this.left + "px";

this.frame.style.top = this.top + "px";

}

JWindow.prototype.resize = function(x,y)

{

var minsize = 100;

var newX = this.left;

var newY = this.top;

var newH = 0;

var newW = 0;

if (this.dir.indexOf("w") != -1)

{

newX = x - this.resOffsetX;

newW = this.resStartX - x;

} else if (this.dir.indexOf("e") != -1)

{

newW = x - this.resStartX;

}

if (this.dir.indexOf("n") != -1)

{

newY = y - this.resOffsetY;

newH = this.resStartY - y;

} else if (this.dir.indexOf("s") != -1)

{

newH = y - this.resStartY;

}

var W = +this.width + newW;

var H = +this.height + newH;

if (W > minsize)

{

this.resStartX = x;   this.setLeft(newX);

this.setWidth(W);

}

if (H > minsize)

{

this.resStartY = y;   this.setTop(newY) this.setHeight(H);

}

}

JWindow.prototype.initMove = function(e)

{

if (e.preventDefault) {e.preventDefault;}

this.moveOffsetX = e.clientX - this.left/*this.frame.offsetLeft*/;

this.moveOffsetY = e.clientY - this.top/*this.frame.offsetTop*/;

this.frame.style.opacity = "0.5";

this.state = "moving";

}

JWindow.prototype.getDirection = function(x,y)

{ if (!this.resizable) {return ""}

var xRel = x - this.left/*this.frame.offsetLeft*/;

var yRel = y - this.top/*this.frame.offsetTop*/;

var xDir = "";

var yDir = "";

if (yRel >=0 && xRel >=0 && this.height-yRel+8 > 0 && this.width-xRel+8 > 0)

{

if (yRel <= 4) {yDir = "n";}

if (xRel <= 4) {xDir = "w";}

if (this.height-yRel+8 <= 4) {yDir="s";}

if (this.width-xRel+8 <= 4) {xDir="e";}

}

if (this.shaded) {yDir = ""};

return yDir+xDir;

}

JWindow.prototype.initRes = function(e)

{

if (this.dir != "")

{

this.state = "resizing";

this.resOffsetX = e.clientX - this.left/*this.frame.offsetLeft*/;

this.resOffsetY = e.clientY - this.top/*this.frame.offsetTop*/;

this.resStartX = e.clientX;

this.resStartY = e.clientY;

this.frame.style.opacity = "0.5"; if (e.preventDefault) {e.preventDefault;}

}

}

JWindow.prototype.handleEvent = function(e)

{

//if (e.preventDefault) {e.preventDefault;}

if (this.state == "inactive")

{

this.dir = this.getDirection(e.clientX,e.clientY);

if (this.dir == "") {     this.frame.style.cursor="default"; } else { this.frame.style.cursor=this.dir+"-resize"; if (e.preventDefault) {e.preventDefault;} }

}

//moving

if (this.state == "moving" && e.type == "mouseup")

{

this.frame.style.opacity = "1";

this.state = "inactive"; if (e.preventDefault) {e.preventDefault;}

return;

}

if (this.state == "moving" && e.type == "mousemove")

{

this.move(e.clientX, e.clientY); if (e.preventDefault) {e.preventDefault;}

return;

}

//resizing

if (this.state == "resizing" && e.type == "mouseup")

{

this.frame.style.opacity = "1";

this.state = "inactive";

this.dir = this.getDirection(e.clientX,e.clientY);

if (this.dir == "") {this.frame.style.cursor="default";}

else {this.frame.style.cursor=this.dir+"-resize";} if (e.preventDefault) {e.preventDefault;}

return;

}

if (this.state == "resizing" && e.type == "mousemove")

{

this.resize(e.clientX, e.clientY); if (e.preventDefault) {e.preventDefault;}

return;

}

}

JWindow.prototype.addElement = function(elem) { this.clientarea.appendChild(elem); }

JWindow.prototype.removeElement = function(elem) { this.clientarea.removeChild(elem); }

JWindow.prototype.removeAt = function(position) { this.clientarea.removeChild(this.clientarea.childNodes[position]); }

JWindow.prototype.insertElement = function(elem, position) { this.clientarea.insertBefore(elem,this.clientarea.childNodes[position]); }

JWindow.prototype.clear = function { while (this.content.hasChildNodes) {   this.content.removeChild(this.content.firstChild); } }

/* end JWindow

Botswitch = {}; var botswitch_altacc; var botswitch_wgUserName;

Botswitch.switchacc = function(u,p) { var req = false; if (window.XMLHttpRequest) { req = new XMLHttpRequest; } else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); } if (req) {   //log out req.open("GET", "http://rationalwiki.com/wiki/index.php?title=Special:Userlogout&action=raw&ctype=text/javascript", false); //req.send(null); //log in   req.overrideMimeType('text/xml'); req.open("POST", "http://rationalwiki.com/wiki/api.php?action=login&lgname=" + encodeURIComponent(u) + "&lgpassword=" + encodeURIComponent(p) + "&format=xml",false); req.send(null) //errors var res = req.responseXML; var error = res.evaluate("//login/@result"                              , res, null, XPathResult.STRING_TYPE, null ).stringValue; if (error == "EmptyPass" || error == "WrongPass") {     GM_setValue("botswitch_pass_"+botswitch_altacc,""); alert("Wrong password, cookie deleted"); } else if (error == "NoName" || error == "Illegal" || error == "NotExists") {     alert("Wrong username, did you set botswitch_altacc?") } else if (error == "Throttled") {     alert("You've logged in too many times in a short time."); } else { //success if (botswitch_wgUserName != botswitch_altacc) {       var userlink = document.getElementById("pt-userpage"); var swnotice = document.createElement("li"); swnotice.id = "pt-switchnotice"; swnotice.style.textTransform = "none"; swnotice.innerHTML = " - switched to " + botswitch_altacc + ""; userlink.parentNode.insertBefore(swnotice,userlink.nextSibling); botswitch_altacc = botswitch_wgUserName; } else { botswitch_altacc = botswitch_altacc_ori; var swnotice = document.getElementById("pt-switchnotice"); if (swnotice) {         swnotice.parentNode.removeChild(swnotice); }     }    }  } }

Botswitch.passOk = function(wind) { var pass = document.getElementById("pass").value; var checked = document.getElementById("savepass").checked; wind.close; if (checked) {   GM_setValue("botswitch_pass_"+botswitch_altacc,pass,30); } Botswitch.switchacc(botswitch_altacc,pass); }

Botswitch.askPass = function { var passwindow = new JWindow; passwindow.setWidth(280); passwindow.setHeight(140); passwindow.setResizable(false); passwindow.setTitle("Password"); passwindow.setLeft(window.innerWidth/2-140/2); passwindow.setTop(window.innerHeight/2-280/2);

var passform = new JForm; passform.addControl(new JForm.control("label","nameLabel","nameLabel",{label:"Username: "+botswitch_altacc,boundto:"uname"})); passform.addElement(document.createElement("br")); passform.addControl(new JForm.control("label","passLabel","passLabel",{label:"Password: ",boundto:"pass"})); passform.addControl(new JForm.control("password","pass","pass",{})); passform.addElement(document.createElement("br")); passform.addControl(new JForm.control("checkbox","savepass","savepass")); passform.addControl(new JForm.control("label","saveLabel","saveLabel",{label:" save password",boundto:"savepass"})); passform.addElement(document.createElement("br")); passform.addControl(new JForm.control("button","passok","passok",{label:"Ok",callback:{handler:function { Botswitch.passOk(passwindow); }}})); passwindow.addElement(passform.root); passwindow.display; }

Botswitch.init = function { //get pass from cookie var pass; if ((pass = GM_getValue("botswitch_pass_"+botswitch_altacc,null)) == null || pass == "") {   //no pass set Botswitch.askPass; } else { //renew cookie GM_setValue("botswitch_pass_"+botswitch_altacc,pass,30); //switch account Botswitch.switchacc(botswitch_altacc,pass); } }

Botswitch.insertlink = function { var logoutlink = document.getElementById("pt-logout"); if (logoutlink) {   var switchlink = document.createElement("li"); switchlink.id = "pt-switch"; var switcha = document.createElement("a"); switcha.innerHTML = "Switch"; switcha.title = "Switch"; switcha.style.cursor = "pointer"; switcha.addEventListener("click", Botswitch.init, true); switchlink.appendChild(switcha); logoutlink.parentNode.appendChild(switchlink); } }

function init { var unameli = document.getElementById("pt-userpage"); var uname = unameli.firstChild.innerHTML; botswitch_wgUserName = uname; botswitch_altacc = accounts[uname]; botswitch_altacc_ori = botswitch_altacc; Botswitch.insertlink; }

window.addEventListener("load", function(e) { init; }, false); /*]]>*/