User:Steel359/enscripts.js
From Wikipedia
Note: After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac); IE: hold Ctrl while clicking Refresh, or press Ctrl-F5; Konqueror:: simply click the Reload button, or press F5; Opera users may need to completely clear their cache in Tools→Preferences.
// This is a slightly modified version of [[User:AzaToth/morebits.js]]. All credit goes to him for writing the script.
/**
* Will escape a string to be used in a RegExp
*/
RegExp.escape = function( text, space_fix ) {
if ( !arguments.callee.sRE ) {
arguments.callee.sRE = /(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^)/g;
}
text = text.replace( arguments.callee.sRE , '\\$1' );
// Special Mediawiki escape, underscore/space is the same, often at lest:
if( space_fix ) {
text = text.replace( / |_/g, '[_ ]' );
}
return text;
}
namespaces = {
'-2': 'Media',
'-1': 'Special',
'0' : '',
'1' : 'Talk',
'2' : 'User',
'3' : 'User_talk',
'4' : 'Project',
'5' : 'Project talk',
'6' : 'Image',
'7' : 'Image talk',
'8' : 'MediaWiki',
'9' : 'MediaWiki talk',
'10': 'Template',
'11': 'Template talk',
'12': 'Help',
'13': 'Help talk',
'14': 'Category',
'15': 'Category talk'
};
/**
* Helper functions to get the month as a string instead of a number
*/
Date.monthNames = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
];
Date.monthNamesAbbrev = [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec'
];
Date.prototype.getMonthName = function() {
return Date.monthNames[ this.getMonth() ];
}
Date.prototype.getMonthNameAbbrev = function() {
return Date.monthNamesAbbrev[ this.getMonth() ];
}
Date.prototype.getUTCMonthName = function() {
return Date.monthNames[ this.getUTCMonth() ];
}
Date.prototype.getUTCMonthNameAbbrev = function() {
return Date.monthNamesAbbrev[ this.getUTCMonth() ];
}
// Simple helper functions to see what groups a user might belong
function userIsInGroup( group ) {
return ( wgUserGroups != null && wgUserGroups.indexOf( group ) != -1 ) || ( wgUserGroups == null && group == 'anon' );
}
function userIsAnon() {
return wgUserGroups == null;
}
// AOL Proxy IP Addresses (2007-02-03)
var AOLNetworks = [
'64.12.96.0/19',
'149.174.160.0/20',
'152.163.240.0/21',
'152.163.248.0/22',
'152.163.252.0/23',
'152.163.96.0/22',
'152.163.100.0/23',
'195.93.32.0/22',
'195.93.48.0/22',
'195.93.64.0/19',
'195.93.96.0/19',
'195.93.16.0/20',
'198.81.0.0/22',
'198.81.16.0/20',
'198.81.8.0/23',
'202.67.64.128/25',
'205.188.192.0/20',
'205.188.208.0/23',
'205.188.112.0/20',
'205.188.146.144/30',
'207.200.112.0/21',
];
// AOL Client IP Addresses (2007-02-03)
var AOLClients = [
'172.128.0.0/10',
'172.192.0.0/12',
'172.208.0.0/14',
'202.67.66.0/23',
'172.200.0.0/15',
'172.202.0.0/15',
'172.212.0.0/14',
'172.216.0.0/16',
'202.67.68.0/22',
'202.67.72.0/21',
'202.67.80.0/20',
'202.67.96.0/19',
];
/**
* ipadress is in the format 1.2.3.4 and network is in the format 1.2.3.4/5
*/
function isInNetwork( ipaddress, network ) {
var iparr = ipaddress.split('.');
var ip = (parseInt(iparr[0]) << 24) + (parseInt(iparr[1]) << 16) + (parseInt(iparr[2]) << 8) + (parseInt(iparr[3]));
var netmask = 0xffffffff << network.split('/')[1];
var netarr = network.split('/')[0].split('.');
var net = (parseInt(netarr[0]) << 24) + (parseInt(netarr[1]) << 16) + (parseInt(netarr[2]) << 8) + (parseInt(netarr[3]));
return (ip & netmask) == net;
}
/* Returns true if given string contains a valid IP-address, that is, from 0.0.0.0 to 255.255.255.255*/
function isIPAddress( string ){
var res = /(\d{1,4})\.(\d{1,3})\.(\d{1,3})\.(\d{1,4})/.exec( string );
return res != null && res.slice( 1, 5 ).every( function( e ) { return e < 256; } );
}
/**
* Maps the querystring to an object
*
* Functions:
*
* QueryString.exists(key)
* returns true if the particular key is set
* QueryString.get(key)
* returns the value associated to the key
* QueryString.equals(key, value)
* returns true if the value associated with given key equals given value
* QueryString.toString()
* returns the query string as a string
*
* Optional parameter to exists, get and equals, can define another query string, but remember that that string wont be cached.
*/
function QueryString() {}
QueryString.init = function(str) {
var params = {};
if( QueryString.params != null && !str ) {
return;
}
if ( !str ) {
QueryString.params = {};
}
var queryString = str || location.search.substring(1);
if(queryString.length == 0) {
return;
}
if( !str ) {
QueryString.str = queryString;
}
queryString.replace(/\+/, ' ');
var args = queryString.split('&');
for( var i in args ) {
var pair = args[i].split( '=' );
var key = decodeURIComponent( pair[0] ), value = key;
if( pair.length == 2 ) {
value = decodeURIComponent( pair[1] );
}
params[key] = value;
}
if( !str ) {
QueryString.params = params;
}
return params;
}
QueryString.get = function(key, str) {
if( str ) {
var val = QueryString.init(str)[key];
return val ? val : null;
} else if( QueryString.params == null ) {
QueryString.init();
}
return QueryString.params[key] ? QueryString.params[key] : null;
};
QueryString.exists = function(key, str) {
if( str ) {
return QueryString.init(str)[key] ? true : false;
} else if( QueryString.params == null ) {
QueryString.init();
}
return QueryString.params[key] ? true : false;
}
QueryString.equals = function(key, value, str) {
if (str ) {
return QueryString.init(str)[key] == value ? true : false;
} else if( QueryString.params == null ) {
QueryString.init();
}
return QueryString.params[key] == value ? true : false;
}
QueryString.toString = function() {
if( QueryString.str == null ) {
QueryString.init();
}
return QueryString.str ? QueryString.str : null;
}
QueryString.create = function( arr ) {
var resarr = Array();
for( var i in arr ) {
if( typeof arr[i] == 'object' ){
var v = Array();
for(var j in arr[i] ) {
v[j] = encodeURIComponent( arr[i][j] );
}
resarr.push( encodeURIComponent( i ) + '=' + v.join('|') );
} else {
resarr.push( encodeURIComponent( i ) + '=' + encodeURIComponent( arr[i] ) );
}
}
return resarr.join('&');
}
QueryString.params = null;
QueryString.str = null;
/**
* Simple exception handling
*/
Exception = function( str ) {
this.str = str || '';
}
Exception.prototype.what = function() {
return this.str;
}
/**
* Status updating class
*/
Status = function() {}
/*
Initiate an element to be a status window, it will remove all it's childs
*/
Status.init = function( elem ) {
if( !( elem instanceof Element ) ) {
throw new Exception( 'object not an instance of Element' );
}
Status.elem = elem;
Status.currentNode = null;
while( elem.hasChildNodes() ) {
elem.removeChild( elem.firstChild );
}
}
// Private function
Status.append = function( obj, node ) {
if( Status.elem == null ) {
throw new Exception( 'no initialized object found' );
}
if ( ! ( obj instanceof Array ) ) {
obj = [ obj ];
}
node = node || Status.currentNode;
for( var i in obj ) {
if( typeof obj[i] == 'string' ) {
node.appendChild( document.createTextNode( obj[i] ) );
} else {
node.appendChild( obj[i] );
}
}
}
Status.error = function( obj ) {
Status.currentNode = document.createElement( 'div' );
Status.currentNode.style.color = 'Red';
Status.append( obj );
Status.elem.appendChild( Status.currentNode );
return Status.currentNode;
}
Status.warn = function( obj ) {
Status.currentNode = document.createElement( 'div' );
Status.currentNode.style.color = 'OrangeRed';
Status.append( obj );
Status.elem.appendChild( Status.currentNode );
return Status.currentNode;
}
Status.info = function( obj ) {
Status.currentNode = document.createElement( 'div' );
Status.currentNode.style.color = 'ForestGreen';
Status.append( obj );
Status.elem.appendChild( Status.currentNode );
return Status.currentNode;
}
Status.debug = function( obj , level ) {
level = level || 1;
if( Status.debugLevel >= level ) {
Status.currentNode = document.createElement( 'div' );
Status.currentNode.style.color = 'DimGray';
Status.append( "Debug (" + level + "): " );
Status.append( obj );
Status.elem.appendChild( Status.currentNode );
return Status.currentNode;
} else {
return null;
}
}
Status.debugLevel = 0;
Status.status = function( obj ) {
Status.currentNode = document.createElement( 'div' );
Status.currentNode.style.color = 'SteelBlue';
Status.append( obj );
Status.elem.appendChild( Status.currentNode );
return Status.currentNode;
}
Status.progress = function ( obj, node ) {
Status.append( obj, node );
}
// Simple helper function to create a simple node
function htmlNode( type, content, color ) {
var node = document.createElement( type );
if( color ) {
node.style.color = color;
}
node.appendChild( document.createTextNode( content ) );
return node;
}
// A simple dragable window
function SimpleWindow( width, height ) {
this.width = width;
this.height = height;
this.frame = document.createElement( 'div' );
SimpleWindow.frames.push( this.frame );
this.topbar = document.createElement( 'div' );
this.topbarover = document.createElement( 'div' );
this.closeButton = document.createElement( 'span' );
this.frame.appendChild( this.topbar );
this.topbarover.appendChild( this.closeButton );
this.frame.style.zIndex = 100;
this.frame.style.width = width + 'px';
this.frame.style.height = height + 'px';
this.frame.style.position = 'fixed';
this.frame.style.background = 'AliceBlue';
this.frame.style.border = '2px ridge Black';
this.frame.simpleWindow = this;
this.frame.addEventListener( 'mousedown', this.focus, true );
this.closeButton.appendChild( document.createTextNode( '[X]' ) );
this.closeButton.style.position = 'absolute';
this.closeButton.style.fontWeight = '100';
this.closeButton.style.fontSize = '1.7em';
this.closeButton.style.top = '0px';
this.closeButton.style.right = '0px';
this.closeButton.style.cursor = 'pointer';
this.closeButton.simpleWindow = this;
this.closeButton.addEventListener( 'click', this.close, false );
this.topbar.style.width = '100%';
this.topbar.style.height = '20px';
this.topbar.style.background = 'LightSteelBlue';
this.topbar.style.position = 'absolute';
this.topbar.style.fontWeight = '900';
this.topbar.style.fontSize = '1em';
this.topbar.style.fontFamily = 'sans-serif';
this.topbar.style.textAlign = 'center';
this.topbar.style.verticalAlign = 'baseline';
this.topbar.style.top = '0px';
this.topbar.style.left = '0px';
this.topbarover.style.width = '100%';
this.topbarover.style.height = '24px';
this.topbarover.style.position = 'absolute';
this.topbarover.style.top = '0px';
this.topbarover.style.left = '0px';
this.topbarover.simpleWindow = this;
this.topbarover.addEventListener( 'mousedown', this.beginMove, true );
}
SimpleWindow.prototype.focus = function(e) {
for( var i in SimpleWindow.frames ) {
SimpleWindow.frames[i].style.zIndex = 99;
}
this.simpleWindow.frame.style.zIndex = 100;
}
SimpleWindow.prototype.display = function() {
this.title = this.title || "";
this.content = this.content || document.createTextNode( "" );
this.topbar.appendChild( document.createTextNode( this.title ) );
var content = document.createElement( 'div' );
content.style.position = 'relative';
content.style.top = '20px';
content.style.height = ( this.height - 20 ) + 'px';
content.style.overflow = 'auto';
content.appendChild( this.content );
this.frame.appendChild( content );
this.frame.appendChild( this.topbarover );
this.frame.style.width = this.width + 'px';
this.frame.style.height = this.height + 'px';
this.frame.style.top = (window.innerHeight - this.height )/2 + 'px' ;
this.frame.style.left = (window.innerWidth - this.width )/2 + 'px';
document.getElementsByTagName('body')[0].appendChild( this.frame );
}
SimpleWindow.prototype.close = function(e) {
if( e ) {
this.simpleWindow.frame.parentNode.removeChild(this.simpleWindow.frame);
} else {
this.frame.parentNode.removeChild(this.frame);
}
}
SimpleWindow.prototype.setWidth = function( width ) {
this.width = width;
}
SimpleWindow.prototype.setHeight = function( height ) {
this.height = height;
}
SimpleWindow.prototype.setTitle = function( title ) {
this.title = title;
}
SimpleWindow.prototype.setContent = function( content ) {
this.content = content;
}
SimpleWindow.frames = [];
SimpleWindow.prototype.currentObject = null;
SimpleWindow.prototype.beginMove = function(e) {
if( e.button != 0 ) {
return;
}
this.simpleWindow.initX = e.layerX;
this.simpleWindow.initY = e.layerY;
this.simpleWindow.lastX = e.clientX;
this.simpleWindow.lastY = e.clientY;
SimpleWindow.currentObject = this.simpleWindow;
window.addEventListener( 'mousemove', SimpleWindow.moveWindow, false );
window.addEventListener( 'mouseup', function(e) {
SimpleWindow.currentObject = null;
window.removeEventListener( 'mousemove', SimpleWindow.moveWindow, false );
window.removeEventListener( 'mouseup', SimpleWindow.moveWindow, false );
}, false );
}
SimpleWindow.moveWindow = function(e) {
if( SimpleWindow.currentObject == null ) {
return;
}
var y = e.clientY - SimpleWindow.currentObject.initY;
var x = e.clientX - SimpleWindow.currentObject.initX;
SimpleWindow.currentObject.frame.style.top = y + 'px';
SimpleWindow.currentObject.frame.style.left = x + 'px';
e.stopPropagation();
}

