User:Random832/common.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
The accompanying .css page for this skin is at User:Random832/common.css. |
// wikibits customization
if(window.histrowinit) window.removeEventListener('load',histrowinit,false);
ts_alternate_row_colors = false;
// General library stuff {{{
// Event handler function {{{
function mkEvt(elem,evtname,handler) {
// old-style event handlers have more robust canceling and target
// finding - here's a trick to let me attach multiple ones
var oldhandler = elem['on'+evtname];
elem['on'+evtname] = function() {
if(oldhandler) {
elem._eventTemp = oldhandler;
if(elem._eventTemp() == false) return false;
}
elem._eventTemp = handler;
return elem._eventTemp();
}
}
//}}}*/
// Hack to fix race condition w/ importScript {{{
addOnloadHook = function(hookFunct) {
// Allows add-on scripts to add onload functions
if(doneOnloadHook) hookFunct();
else onloadFuncts[onloadFuncts.length] = hookFunct;
};
// }}} */
// tricks with getElementById {{{
document._realGEBI = document.getElementById;
document.getElementById = function(id){
if(id=="p-cactions") {
if(this._realGEBI("p-cactions2"))
return this._realGEBI("p-cactions2");
}
var x = this._realGEBI(id);
if(x) return x;
else {
switch(id) {
case "content": x= this._realGEBI("mw_content");break;
case "column-content": x= this._realGEBI("mw_contentwrapper");break;
case "bodyContent": x= this._realGEBI("mw_contentholder");break;
case "column-one": x= this._realGEBI("mw_portlets");break;
case "globalWrapper": x= this._realGEBI("mw_main");break;
default: return null;
}
}
return x;
}
// }}} */
/* }}} */
/* check if page is discussion {{{ */
var pageIsDiscussion = false;
addOnloadHook(function pageIsDiscussion_hook() {
if(wgNamespaceNumber % 2) {
pageIsDiscussion = true; return;
}
if(wgNamespaceNumber == 4) {
if(wgPageName.indexOf("noticeboard") > 0) {
pageIsDiscussion = true; return;
}
if(wgPageName.indexOf("Village_pump") > 0) {
pageIsDiscussion = true; return;
}
if(wgPageName.indexOf("_for_deletion/") > 0) {
pageIsDiscussion = true; return;
}
if(wgPageName.indexOf("_for_discussion/") > 0) {
pageIsDiscussion = true; return;
}
if(wgPageName.indexOf("Requests_for_comment/User_names") > 0) {
pageIsDiscussion = true; return;
}
}
});
/* }}} */
/* Add a tab for arbitrary actions {{{
// TODO undelete
// event handling here isn't making sense, and the style is somehow
// broken anyway (needs a skin check maybe?)
addOnloadHook(function blankTab_hook() {
try {
var theList = $('p-cactions').getElementsByTagName("UL")[0];
var myLi = document.createElement("LI");
var myForm = document.createElement("FORM");
var myInput = document.createElement("INPUT");
myForm.appendChild(myInput);
myLi.appendChild(myForm);
theList.appendChild(myLi);
// TODO move to .css
myLi.style.cssText = "float: right; padding-top: 1px;"
myForm.style.cssText = "display: inline"
myInput.style.cssText = "width: 4em; background-color:white; font: inherit; border: none; text-align: right"
myForm.onsubmit = function(e) {
e.preventDefault();
switch(myInput.value) {
case 'move':
location.href = ('Special:Movepage/'+wgPageName)
.replace(/(.*)/,wgArticlePath);
break;
case 'contribs':
location.href = ('Special:Contributions/'+wgPageName.replace(/^[^:]*:/,'').replace(/\/(.*)/,''))
.replace(/(.*)/,wgArticlePath);
break;
case 'links':
location.href = ('Special:Whatlinkshere/'+wgPageName)
.replace(/(.*)/,wgArticlePath);
break;
case 'log': case 'logs':
location.href = ('Special:Log')
.replace(/(.*)/,wgArticlePath)
+'?page='+escape(wgPageName);
break;
case 'edit lead':
location.href = wgScriptPath+'/index.php?' +
'title='+escape(wgPageName) + "&" +
'action=edit§ion=0';
break;
default: location.href = wgScriptPath+'/index.php?' +
'title='+escape(wgPageName) + "&" +
'action='+escape(myInput.value)
}
}
} catch(x) { Debug(x,'addBlankTab') }
});
// }}} */
// Alt text {{{
$(function() {
try {
for(var i=0;i<document.images.length;i++) {
var img = document.images[i];
if(img.alt && !img.title) img.title = 'alt: '+img.alt;
}
} catch(x) { Debug(x,'processImages') }
});
// }}} */
// [[User:Random832]] script for finding "resolved" tags. {{{
// semi-experimental, not yet adapted for anything but ANI.
if (wgPageName == "Wikipedia:Administrators\'_noticeboard/Incidents" && wgAction == "view") {
addOnloadHook(function ANI_toc_hook(){
var sections = document.getElementById('toc').getElementsByTagName("li");
for(var i=0;i<sections.length;i++) {
try {
var link = sections[i].firstChild;
var target=document.getElementsByName(link.hash.slice(1))[0];
var next = target.parentNode.nextSibling;
// discard text nodes
while(next.nodeType != 1) next = next.nextSibling;
// now we have the header, now skip another
if(next.tagName != "H2") { continue; }
next = next.nextSibling;
while(next.nodeType != 1) next = next.nextSibling;
if ((/\bresolved\b/.test(next.className))) {
//resolved
sections[i].className = "ani_resolved"
sections[i].style.fontStyle = 'italic'
//sections[i].appendChild(document.createTextNode("resolved"))
} else {
//not resolved
sections[i].className = "ani_unresolved"
sections[i].style.fontWeight = 'bold'
}
// BUG: chokes on sections beginning with a digit
// (anchor has name instead of id).
} catch(x) {
if(window.console) //firebug
console.log("caught %o",x);
}//end try
}//end for
});//end onloadhook function
}//end if WP:ANI
// }}}
(function submit_validation_hook() { // set up submit validation {{{
var validators = [];
var is_preview = false;
window.addOnSubmitValidator = function(x) {
validators[validators.length] = x;
}
addOnloadHook(function() {
var editform = document.getElementById('editform');
if(!editform) return;
mkEvt(editform,'submit',function() {
if(is_preview) return true;
for(var i=0;i<validators.length;i++) {
var result = validators[i]();
if(!result) return false;
}
});
if (document.getElementById('wpPreview')) {
mkEvt(document.getElementById('wpPreview'),'click',function () {
is_preview = true;
});
}
});
})(); // }}}
// Edit summary check {{{
addOnSubmitValidator(function() {
var editsummary = document.getElementById('wpSummary').value;
if( /^\/\*.*\*\/\s*$/.test(editsummary)) editsummary = ''
if(!editsummary) return confirm("Submit this edit without an edit summary?");
else return true;
});
// }}} */
// links on CAT:PER {{{
if(wgPageName=="Category:Wikipedia_protected_edit_requests")
$(function(){
var pagediv = document.getElementById("mw-pages");
var links = pagediv.getElementsByTagName("A");
for(var i=0;i<links.length;i++) {
links[i].hash = '#editprotected';
}
});
// }}} */
$(function() {
var s = document.createElement('STYLE');
s.textContent = '#edittools_hide_for_script_test {display:none}';
document.getElementsByTagName('HEAD')[0].appendChild(s);
});
/* change diff to history in new messages {{{
$(function() {
var contentSub = document.getElementById("contentSub");
if(!contentSub) return;
var elem = contentSub.nextSibling;
while(elem.nodeType != 1) elem = elem.nextSibling;
if(elem.className != 'usermessage') return;
elem.getElementsByTagName('A')[1].href = elem.getElementsByTagName('A')[1].href.replace("diff=cur","action=history")
elem.getElementsByTagName('A')[1].textContent = "history";
});
// }}}*/
// Section organizer for ANI {{{
if (wgPageName == "Wikipedia:Administrators\'_noticeboard/Incidents" && wgAction == "view") {
addOnloadHook(function ani_sections() {
var headers = document.getElementsByTagName('H2');
for(var i=1;i<headers.length;i++) {
// starting from 1, to skip the toc header.
var section = document.createElement("DIV");
section.className = "sectionContainer";
var anchor = headers[i].previousSibling;
while(anchor.nodeType != 1) anchor = anchor.previousSibling;
headers[i].parentNode.insertBefore(section,headers[i]);
section.appendChild(anchor);
section.appendChild(headers[i]);
var innerSection = document.createElement("DIV");
innerSection.className = "sectionContentHolder";
section.appendChild(innerSection);
while(section.nextSibling && section.nextSibling.tagName != 'H2' && section.nextSibling.id != 'catlinks') {
// look ahead
var anchorcheck = section.nextSibling.nextSibling;
while(anchorcheck && anchorcheck.nodeType!=1) anchorcheck = anchorcheck.nextSibling;
if(anchorcheck && anchorcheck.tagName == 'H2') break;
innerSection.appendChild(section.nextSibling);
}
var ntimestamps = 0;
// evil evil hack
var lastTimestamp = new Date(0);
var lastTimestampText = '(No Timestamp)';
innerSection.textContent.replace(/[0-9][0-9]:[0-9][0-9], [0-3]?[0-9] [A-Z][a-z]* [0-9][0-9][0-9][0-9]/g,function(match) {
var thisTimestamp = new Date(match);
if(thisTimestamp.valueOf() > lastTimestamp.valueOf()) {
lastTimestamp = thisTimestamp;
lastTimestampText = match;
}
ntimestamps++;
});
// was done incorrrectly in local time, convert from UTC
lastTimestamp.setMinutes(
lastTimestamp.getMinutes()-lastTimestamp.getTimezoneOffset()
);
var age = (new Date()).getTime() - lastTimestamp.getTime();
var hideDefault = false;
if (age > 21600000) // 6 hours
hideDefault = true;
if(innerSection.textContent.length < 600) // bytes
hideDefault = false; // no reason to hide in this case
if(ntimestamps < 2) // unanswered
hideDefault = false;
// hide if resolved, also, place the resolved header in the visible part.
var resolved = getElementsByClassName(innerSection,'DIV','resolved');
if(resolved.length) {
resolved = resolved[0];
// [1] to skip an annoying whitespace node
if (resolved != innerSection.firstChild && resolved != innerSection.childNodes[1]) resolved = resolved.cloneNode(true);
section.insertBefore(resolved,innerSection);
hideDefault = true;
}
section.insertBefore(document.createTextNode('Last: ' + lastTimestampText + ". "),innerSection);
section.insertBefore(document.createTextNode(innerSection.textContent.length + " text bytes. "),innerSection);
section.insertBefore(document.createTextNode(ntimestamps + " comments. "),innerSection);
(function ani_sections_closure(){
var header = headers[i];
var innerSectionFix = innerSection;
var button = document.createElement('BUTTON');
if(hideDefault)
button.textContent = 'show';
else
button.textContent = 'hide';
button.onclick = function ani_sections_onclick() {
if(innerSectionFix.style.display == 'none') {
innerSectionFix.style.display = 'block';
this.textContent = 'hide'; }
else {
innerSectionFix.style.display = 'none';
this.textContent = 'show'; }
}
header.insertBefore(button,header.firstChild);
button.style.cssText='float: right';
if(hideDefault) innerSection.style.display='none';
})();
}
});
}
// }}}
/* proof of concept for edit summary length. Not yet converted to wikipedia
<script>
window.onload = function() {
var box = document.getElementById("editsummary")
var len = document.getElementById("length_value")
function utfslop(s) {
var count = 3;
for(var i=0;i<s.length;i++) {
if(s[i] > '\u007f') count++;
if(s[i] > '\u07ff') count++;
}
return count;
}
box.onkeypress = function(evt) {
this.maxLength = 255 - utfslop(this.value);
if(this.value.length > this.maxLength)
this.value = this.value.substr(0,this.maxLength);
}
}
</scr\ipt>
<input id="editsummary">
<input id="length_value">
*/
/* addOnloadHook(function() {
var item = mw.util.addPortletLink('p-cactions','','ßsocks','ca-betasocks','Check socks with Betacommand\'s tool','',null);
var link=item.firstChild;
link.onclick = function() {
jsMsg('<form action="http://tools.wikimedia.de/~betacommand/cgi-bin/compare">'+
'<table>' +
'<tr><th>Master<\/th><td><input name="master"><\/td><\/tr>' +
'<tr><th>Socks<\/th><td><input name="socks"><\/td><\/tr>' +
'<tr><th>Key<\/th><td><input name="key"><\/td><\/tr>' +
'<tr><td colspan="2"><input type="submit"><\/td><\/tr><\/table>'+'<\/form>','betasocks');
return false;
}
}); */
$(function() {
var p = document.getElementById("p-logo");
if(!p) return;
var a = p.firstChild;
while(a.nodeType != 1) a = a.nextSibling;
var done = false;
a.onclick = function() {
if(!done) this.style.backgroundImage = 'none';
var ret = done; done = true; return ret;
}
});
/* convert this bookmarklet later on. javascript:(function(){if(!window['$ssZapClosedXFD']){var x=document.createElement('STYLE');x.textContent='.xfd-closed{display:none} .boilerplate.metadata.vfd{display:none}';
document.getElementsByTagName('HEAD')[0].appendChild(x);
window['$ssZapClosedXFD']=x.sheet}else{
window['$ssZapClosedXFD'].disabled=!window['$ssZapClosedXFD'].disabled}})(); */
/* snippet for WP:AN semi-protection, look at later
if (wgEditRestriction.length > 0) {
addOnloadHook(function() {
var msg_cantedit = document.getElementById("cantedit-msg");
var msg_isprotected = document.getElementById("isprotected-msg");
if(!msg_cantedit && !msg_isprotected)
var canEdit = false;
for(var i=0;i<wgUserGroups.length;i++) {
for(var ii=0;ii<wgEditRestriction.length;ii++) {
if(wgUserGroups[i] == wgEditRestriction[ii]) canEdit = true;
}
}
if(canEdit) { if(msg_isprotected) msg_isprotected.style.display='block'; }
else { if(msg_cantedit) msg_cantedit.style.display='block'; }
});
}
*/
if(wgPageName == 'Special:Watchlist') {
addOnloadHook(function() {
document.forms[0].method = 'get'; // TODO make more robust
});
}
function addEditWarnings(warntext) {
if(!warntext) warntext = "Are you sure you want to edit this page?";
function do_warn() {
return confirm(warntext);
}
var spans = document.getElementsByTagName('SPAN');
for(var i=0;i<spans.length;i++) {
if(/\beditsection\b/.test(spans[i].className)) mkEvt(spans[i],'click',do_warn);
}
mkEvt(document.getElementById('ca-edit'),'click',do_warn);
}
function logCalls(obj,prop) {
var oldfn = obj[prop];
obj[prop] = (function(ofn,nm) {
return (function()
{
var ret = ofn.apply(this,arguments);
console.debug("called %s on %o with arguments %o, returned %o",nm,this,arguments,ret);
});
})(oldfn,prop);
}
logCalls(window,'hookEvent');
logCalls(window,'addHandler');
logCalls(window,'addClickHandler');
$(function() {
var uploadtab = document.getElementById('t-upload');
if(!uploadtab) return
var uploadtablink = uploadtab.getElementsByTagName('a')[0];
if(!uploadtablink) return;
uploadtablink.href = wgArticlePath.replace('\$1','Special:Upload');
});
function shortenTabs() {
function st(id, text) {
try {
document.getElementById(id).getElementsByTagName('A')[0].textContent = text;
} catch(x) {}
}
function img(src,alt) {
var x=document.createElement('IMG');
x.src=src;
x.alt=alt;
return x;
}
st('ca-edit','Edit');
st('ca-talk','Talk');
st('ca-delete','Delete');
st('ca-protect','Prot.');
var unprotect = document.getElementById('ca-unprotect');
if(unprotect) {
unprotect = unprotect.getElementsByTagName('A')[0];
unprotect.textContent = '';
if(wgRestrictionEdit[0] && wgRestrictionEdit[0] == "autoconfirmed")
unprotect.appendChild(img('http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Padlock-silver-medium.svg/16px-Padlock-silver-medium.svg.png','SP'));
if(wgRestrictionEdit[0] && wgRestrictionEdit[0] == "sysop")
unprotect.appendChild(img('http://upload.wikimedia.org/wikipedia/en/thumb/5/59/Padlock.svg/16px-Padlock.svg.png','FP'));
else if(wgRestrictionMove[0] && wgRestrictionMove[0] == "sysop")
unprotect.appendChild(img('http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Padlock-olive.svg/16px-Padlock-olive.svg.png','MP'))
}
}
$(shortenTabs);
// Twinkle Lite
importScript('User:AzaToth/morebits.js');
importScript('User:AzaToth/twinklefluff.js');
//importScript('User:AzaToth/twinklewarn.js');
//importScript('User:AzaToth/twinklearv.js');
//importScript('User:AzaToth/twinklespeedy.js');
importScript('User:AzaToth/twinklediff.js');
//importScript('User:AzaToth/twinkleprotect.js');
//importScript('User:AzaToth/twinkleprod.js');
//importScript('User:AzaToth/twinklexfd.js');
//importScript('User:AzaToth/twinkleimage.js');
//importScript('User:AzaToth/twinkleunlink.js');
//importScript('User:AzaToth/twinkledelimages.js');
//importScript('User:AzaToth/twinkledeprod.js');
//importScript('User:AzaToth/twinklebatchdelete.js');
//importScript('User:AzaToth/twinklebatchprotect.js');
//importScript('User:AzaToth/twinkleimagetraverse.js');
// install [[User:Cacycle/wikEdDiff]] enhanced diff view using ajax
document.write('<script type="text/javascript" src="'
+ 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/wikEdDiff.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s"><\/script>');
/*
var fractions = {
2:{1:'½'},3:{1:'⅓',2:'⅔'},4:{1:'¼',3:'¾'},8:{1:'⅛',3:'⅜',5:'⅝',7:'⅞'}
/*,5:{1:'⅕',2:'⅖',3:'⅗',4:'⅘'},6:{1:'⅙',5:'⅚'}*//*
};
function fixfracs() {
var spans = document.getElementsByTagName('SPAN');
for(var i=0;i<spans.length;i++) { var span=spans[i];
if(span.className != 'template-frac') continue;
var den = span.lastChild.textContent;
var num = span.firstChild.textContent;
if(fractions[den] && fractions[den][num]) {
span.textContent = fractions[den][num];
span.className = 'template-frac-vulgarized';
}
}
}
$(fixfracs);
*/
function toolsbreak() {
function del(x) {
var y = document.getElementById(x);
if(!y) return;
document.removeElement(y)
}
del("ca-delete");
del("ca-undelete");
del("ca-protect");
// not removing ca-unprotect since i've configured it to show
// accurate information about the current protection status
del("t-blockip");
}
$(toolsbreak);