Jump to content

User:Ale jrb/Scripts/waLib2.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* ============================================== *\
** 	WikiApps2 - JavaScript Library
**      for MediaWiki v1.16 and above
**
** Copyright (c) Alex Barley [[User:Ale_jrb]]
** Some rights reserved.
**
** ============================================== **
**		revision: 0011 (BETA)
**
**		TRACKER: [[User:Ale_jrb/Scripts]]
\* ============================================== */

// start
function wa_main () {
	var me = this;
	this.waa = new waa ();
	this.wam = new wam ();
	
	this.revision = 11;
	
	this.go = function ( c ) {
		if ( c !== undefined ) {
			switch ( c ) {
				case ':ajax': case ':api':
					return me.waa;
					break;
					
				case ':dom': case ':page': case ':elems':
					return false;
					break;
					
				case ':misc': case ':funcs': case ':func': case ':other':
					return me.wam;
					break;
					
				default:
					throw 'wa lib: undefined request on library call';
					break;
			}
		}
	}
}

// wikiapps ajax. expects syntax: wa(':api').action('id').action('id').wait(funcondone).action('id').action('id').wait(funcondone).run();
// returned container
	// Action elements just add themselves to the queue. The Wait element adds a stop to the queue, and hits Execute. Execute runs
	// all Actions until the stop marker with a callback of Check. Check sees if anything is still Executing, and if not, deletes
	// the Stop and hits Execute again. Repeat until queue is empty, calling funcondone as required. Return data can always be
	// accessed internally from wa(':api').results['id'] or wa(':ajax').results['id'].
function waa () {
	// wikiapps ajax
	var m = this;
	
	if ( wgServer !== undefined ) { this.wikibase = wgServer; this.wikiapi = this.wikibase + wgScriptPath + '/api.php'; this.wikipage = this.wikibase + wgArticlePath.replace ( '$1', '' ); }
	
	this.intqueueid = 0;
	this.queue_torun = {};
	this.queue_isrun = {};
	this.queue_torun [ this.intqueueid ] = [];
	this.queue_isrun [ this.intqueueid ] = [];
	
	this.results = {};
	
	this.editreq = 0; // we use this as the internal id so that editreqs without a token don't get confused with other, simultaneous, internal requests.
}

waa.prototype.exec = function ( queueid, eatstop ) {
	// handles queue, creates waar objects as required and executes them.
	var m = wa (':api' );
	var dobreak = false;
	m.killqueue = [];
	
	// perform queue handling. If a queue is provided, we want to move all the actions on the current internal queue onto the 
	// user defined queue (we push them on after any that are already there, or create it if it doesn't exist). We then want to execute that queue. 
	// If no queue is defined (or an internal queue is defined) we'll just use that one.
	if ( ( queueid === null ) || ( queueid === undefined ) ) {
		queueid = m.intqueueid ++; // set the queue for this execution, and increment count for the next one
		m.queue_torun [m.intqueueid] = []; m.queue_isrun [m.intqueueid] = [];
	} else {
		if ( m.queue_torun [queueid] === undefined ) {
			m.queue_torun [queueid] = []; m.queue_isrun [queueid] = [];
			m.queue_torun [queueid] = m.queue_torun [queueid].concat ( m.queue_torun [m.intqueueid] );
			m.queue_isrun [queueid] = m.queue_isrun [queueid].concat ( m.queue_isrun [m.intqueueid] );
		} else {
			m.queue_torun [queueid] = m.queue_torun [queueid].concat ( m.queue_torun [m.intqueueid] );
			m.queue_isrun [queueid] = m.queue_isrun [queueid].concat ( m.queue_isrun [m.intqueueid] );
		}
		
		m.intqueueid ++;
		m.queue_torun [m.intqueueid] = []; m.queue_isrun [m.intqueueid] = [];
	}
	
	while ( m.queue_torun [queueid][0] !== undefined ) {
		switch ( m.queue_torun [queueid][0][0] ) {
			case 'stop':
				if ( eatstop === true ) { 
					if ( typeof m.queue_torun [queueid][0][1] !== 'function' ) m.queue_torun [queueid][0][1] = function () {};
					m.queue_torun [queueid][0][1] ();
					eatstop = false;
				} else { dobreak = true; }
				break;
				
			case 'command':
				this.queue_isrun[queueid].push ( m.queue_torun [queueid][0][1][0] );
				
				if ( m.queue_torun [queueid][0][1][2] === undefined ) m.queue_torun [queueid][0][1][2] = 'GET';
				
				var tempurl  = this.wikiapi + '?' + m.queue_torun [queueid][0][1][1];
				
				var tempcall = new waar ( m.queue_torun [queueid][0][1][0], queueid );
				tempcall.requestType = m.queue_torun [queueid][0][1][2];
				tempcall.requestUrl = tempurl;
				tempcall.doRequest ( m.check, queueid );
				
				tempcall = null; tempurl = null;
				break;
				
			case 'token':
				this.queue_isrun[queueid].push ( m.queue_torun [queueid][0][1][0] );
				
				var tempurl  = this.wikiapi + '?format=xml&action=query&prop=info&titles=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][1] );
					tempurl += '&intoken=' + m.queue_torun [queueid][0][1][2];
				
				var tempcall = new waar ( m.queue_torun [queueid][0][1][0], queueid );
				tempcall.requestType = 'GET';
				tempcall.requestUrl = tempurl;
				tempcall.doRequest ( m.check, queueid );
				
				tempcall = null; tempurl = null;
				break;
				
			case 'rtoken':
				this.queue_isrun[queueid].push ( m.queue_torun [queueid][0][1][0] );
				
				var tempurl  = this.wikiapi + '?format=xml&action=query&prop=revisions&titles=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][1] );
					tempurl += '&rvprop=ids&rvlimit=1&rvtoken=rollback';
				
				var tempcall = new waar ( m.queue_torun [queueid][0][1][0], queueid );
				tempcall.requestType = 'GET';
				tempcall.requestUrl = tempurl;
				tempcall.doRequest ( m.check, queueid );
				
				tempcall = null; tempurl = null;
				break;
				
			case 'rollback':
				this.queue_isrun[queueid].push ( m.queue_torun [queueid][0][1][0] );
								
				var tempurl  = this.wikiapi;
				
				var temppost  = 'format=xml&action=rollback&user=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][1] );
					temppost += '&title=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][2] );
					temppost += '&token=' + encodeURIComponent ( m.results [ m.queue_torun [queueid][0][1][0] ]['query']['pages']['page']['revisions']['rev-attr']['rollbacktoken'] );
				if ( m.queue_torun [queueid][0][1][3] ) temppost += '&summary=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][3] );
				
				var tempcall = new waar ( m.queue_torun [queueid][0][1][0], queueid );
				tempcall.requestType = 'POST';
				tempcall.postParams = temppost;
				tempcall.requestUrl = tempurl;
				tempcall.doRequest ( m.check, queueid );
				
				tempcall = null; tempurl = null;
				break;
				
			case 'get':
				this.queue_isrun[queueid].push ( m.queue_torun [queueid][0][1][0] );
			
				var tempurl  = this.wikiapi + '?format=xml&action=query&prop=revisions&titles=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][1] );
					tempurl += '&rvprop=content&rvlimit=' + m.queue_torun [queueid][0][1][2];
			
				var tempcall = new waar ( m.queue_torun [queueid][0][1][0], queueid );
				tempcall.requestType = 'GET';
				tempcall.requestUrl = tempurl;
				tempcall.doRequest ( m.check, queueid );
				
				tempcall = null; tempurl = null;
				break;
				
			case 'contribs':
				this.queue_isrun[queueid].push ( m.queue_torun [queueid][0][1][0] );
				
				if ( m.queue_torun [queueid][0][1][2] === undefined ) m.queue_torun [queueid][0][1][2] = 10;
			
				var tempurl  = this.wikiapi + '?format=xml&action=query&list=usercontribs&uclimit=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][2] );
					tempurl += '&ucuser=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][1] ) + '&ucprop=ids|title|timestamp|comment';
			
				var tempcall = new waar ( m.queue_torun [queueid][0][1][0], queueid );
				tempcall.requestType = 'GET';
				tempcall.requestUrl = tempurl;
				tempcall.doRequest ( m.check, queueid );
				
				tempcall = null; tempurl = null;
				break;
				
			case 'block':
				this.queue_isrun[queueid].push ( m.queue_torun [queueid][0][1][0] );
				
				if ( m.queue_torun [queueid][0][1][2].indexOf ( 'intok' ) > -1 ) {
					var usetoken = m.results [ m.queue_torun [queueid][0][1][2] ]['query']['pages']['page-attr']['blocktoken'];
				} else {
					var usetoken = m.queue_torun [queueid][0][1][2];
				}
				usetoken = wa ( ':func' ).encodewiki ( usetoken );
				
				var tempurl  = this.wikiapi
				
				var temppost  = 'format=xml&action=block&user=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][1] );
					temppost += '&expiry=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][3] );
					temppost += '&reason=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][4] ) + '' + m.queue_torun [queueid][0][1][5];
					temppost += '&token=' + usetoken;
				
				var tempcall = new waar ( m.queue_torun [queueid][0][1][0], queueid );
				tempcall.requestType = 'POST';
				tempcall.postParams = temppost;
				tempcall.requestUrl = tempurl;
				tempcall.doRequest ( m.check, queueid );
				
				tempcall = null; tempurl = null;
				break;
				
			case 'edit':
				// there are two cases: either there is a token, or there is an intok pointer to a token. If this is the case, this token will
				// be looked up in the memory base before committing the edit.
				m.queue_isrun[queueid].push ( m.queue_torun [queueid][0][1][0] );
				
				if ( m.queue_torun [queueid][0][1][2].indexOf ( 'intok' ) > -1 ) {
					var usetoken = m.results [ m.queue_torun [queueid][0][1][2] ]['query']['pages']['page-attr']['edittoken'];
				} else {
					var usetoken = m.queue_torun [queueid][0][1][2];
				}
				usetoken = wa ( ':func' ).encodewiki ( usetoken );
				
				if ( this.queue_torun [ queueid ][0][1][5] === 'append' ) {
					var text = '&appendtext=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][3] );
				} else if ( this.queue_torun [ queueid ][0][1][5] === 'prepend' ) {
					var text = '&prependtext=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][3] );
				} else {
					var text = '&text=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][3] );
				}
				
				var tempurl = this.wikiapi;
				var temppost  = 'format=xml&action=edit&title=' + wa ( ':func' ).encodewiki ( m.queue_torun [ queueid ][0][1][1] );
					temppost += '&summary=' + wa ( ':func' ).encodewiki ( m.queue_torun [queueid][0][1][4] ) + text;
					temppost += '&token=' + usetoken;
					
				var tempcall = new waar ( m.queue_torun [queueid][0][1][0], queueid );
				tempcall.requestType = 'POST';
				tempcall.postParams = temppost;
				tempcall.requestUrl = tempurl;
				
				tempcall.doRequest ( m.check, queueid );
				
				tempcall = null; tempurl = null; temppost = null;
				
				break;
				
			default:
				throw 'wa lib: unrecognised item in chain queue; check library extensions';
				break;
		}
		if ( dobreak === true ) break;
		
		this.queue_torun[queueid].splice ( 0, 1 );
	}
	
	return this;
}
waa.prototype.run = function ( queueid ) {
	this.exec ( queueid ); return this;
}
waa.prototype.go = function ( queueid ) {
	this.exec ( queueid ); return this;
}
waa.prototype.start = function ( queueid ) {
	this.exec ( queueid ); return this;
}

waa.prototype.stop = function ( queueid ) {
	var m = wa (':api' );
	if ( ! queueid ) return this;
	
	m.queue_torun [ queueid ] = [];
	m.queue_isrun [ queueid ] = [];
	
	return this;
}
waa.prototype.kill = function ( queueid ) {
	this.stop ( queueid ); return this;
}

waa.prototype.wait = function ( whendone ) {
	var m = wa (':api' );
	
	if ( whendone === undefined ) whendone = function () {};
	this.queue_torun[m.intqueueid].push ( new Array ( 'stop', whendone ) );
	
	return this;
}
waa.prototype.check = function ( id, queueid ) {
	var m = wa (':api' );
	
	// remove id from wait list
	for ( var i in m.queue_isrun[queueid] ) {
		if ( m.queue_isrun [queueid][i] === id ) {
			
			m.queue_isrun[queueid].splice ( i, 1 );
		}
	}
	
	if ( m.queue_isrun[queueid].length > 0 ) return m;
	m.exec ( queueid, true );
	
	return m;
}

waa.prototype.command = function ( id, command, requesttype ) {
	var m = wa (':api' );
	
	m.queue_torun[m.intqueueid].push ( new Array ( 'command', new Array ( id, command, requesttype ) ) );
	
	return this;
}
waa.prototype.edit = function ( id, page, token, content, summary, where ) { // use token = 0 if you don't have one
	var m = wa (':api' );
	
	if ( token === 0 ) {
		var editreq = m.editreq ++;
		
		m.queue_torun[m.intqueueid].push ( new Array ( 'token', new Array ( 'intok' + editreq, page, 'edit' ) ) );
		m.queue_torun[m.intqueueid].push ( new Array ( 'stop' ) );
		m.queue_torun[m.intqueueid].push ( new Array ( 'edit', new Array ( id, page, 'intok' + editreq, content, summary, where ) ) );
	} else {
		m.queue_torun[m.intqueueid].push ( new Array ( 'edit', new Array ( id, page, token, content, summary, where ) ) );
	}
	
	return m;
}
waa.prototype.block = function ( id, user, token, expiry, reason, blockoptions ) { // use token = 0 if you don't have one
	var m = wa (':api' );
	
	if ( token === 0 ) {
		var blockreq = m.blockreq ++;
		
		m.queue_torun[m.intqueueid].push ( new Array ( 'token', new Array ( 'intok' + blockreq, user, 'block' ) ) );
		m.queue_torun[m.intqueueid].push ( new Array ( 'stop' ) );
		m.queue_torun[m.intqueueid].push ( new Array ( 'block', new Array ( id, user, 'intok' + blockreq, expiry, reason, blockoptions ) ) );
	} else {
		m.queue_torun[m.intqueueid].push ( new Array ( 'edit', new Array ( id, user, token, expiry, reason, blockoptions ) ) );
	}
	
	return m;
}
waa.prototype.rollback = function ( id, user, page, summary ) {
	var m = wa (':api' );
	
	m.queue_torun[m.intqueueid].push ( new Array ( 'rtoken', new Array ( id, page ) ) );
	m.queue_torun[m.intqueueid].push ( new Array ( 'stop' ) );
	m.queue_torun[m.intqueueid].push ( new Array ( 'rollback', new Array ( id, user, page, summary ) ) );
	
	return this;
}
waa.prototype.get = function ( id, page, revisions, properties ) {
	var m = wa (':api' );
	
	this.queue_torun[m.intqueueid].push ( new Array ( 'get', new Array ( id, page, revisions ) ) );
	
	return this;
}
waa.prototype.contribs = function ( id, user, count ) {
	var m = wa (':api' );
	
	this.queue_torun[m.intqueueid].push ( new Array ( 'contribs', new Array ( id, user, count ) ) );
	
	return this;
}
waa.prototype.token = function ( id, target, token ) {
	var m = wa (':api' );
	
	m.queue_torun[m.intqueueid].push ( new Array ( 'token', new Array ( id, target, token ) ) );
	
	return this;
}


// wikiapps misc.
function wam () {
	// wikiapps misc
	var m = this;
}
wam.prototype.encodewiki = function ( page ) {
	return encodeURIComponent ( page );
}
wam.prototype.encodetoarray = function ( xml ) {
	var m = wa (':func' );
	
	if ( xml.getElementsByTagName ( 'api' ) [0] ) { var base = xml.getElementsByTagName ( 'api' ) [0]; }
	else if ( xml.getElementsByTagName ( 'SearchSuggestion' ) [0] ) { var base = xml.getElementsByTagName ( 'SearchSuggestion' ) [0]; }
	else { return false; }
	m.array = {};
	
	m.array = m.createrecursive ( base );
	
	//alert('hi');
	//alert(m.array);
	
	return m.array;
}
wam.prototype.createrecursive = function ( object ) {
	var m = wa (':func' );
	
	var r = {};
	var c = {};
	
	for ( var i in object.childNodes ) {
		if ( object.childNodes[i].nodeType !== undefined ) {
			
			if ( r [ object.childNodes[i].nodeName ] !== undefined ) {
				if ( object.childNodes[i].nodeType === 3 ) continue; // we only ever want one text object, which could have been concatenated
				
				// FIXME: can this duplication be eliminated/shortened?
				if ( r [ object.childNodes[i].nodeName ] === null ) {
					// if the name already exists, switch it to an array form with index 0.
					var tmp = r [ object.childNodes[i].nodeName ];
					r [ object.childNodes[i].nodeName ] = [];
					r [ object.childNodes[i].nodeName ] [0] = tmp;
					var tmp2 = r [ object.childNodes[i].nodeName + '-attr' ];
					r [ object.childNodes[i].nodeName + '-attr' ] = [];
					r [ object.childNodes[i].nodeName + '-attr' ] [0] = tmp2;
				}
				else if ( r [ object.childNodes[i].nodeName ] [0] === undefined ) {
					var tmp = r [ object.childNodes[i].nodeName ];
					r [ object.childNodes[i].nodeName ] = [];
					r [ object.childNodes[i].nodeName ] [0] = tmp;
					var tmp2 = r [ object.childNodes[i].nodeName + '-attr' ];
					r [ object.childNodes[i].nodeName + '-attr' ] = [];
					r [ object.childNodes[i].nodeName + '-attr' ] [0] = tmp2;
				}
				
				var l = r [ object.childNodes[i].nodeName ].length;
				
				if ( object.childNodes[i].childNodes.length === 0 ) {
					r [ object.childNodes[i].nodeName ] [ l ] = object.childNodes[i].nodeValue;
					r [ object.childNodes[i].nodeName + '-attr' ] [ l ] = m.returnattributes ( object.childNodes[i] );
				} else {
					r [ object.childNodes[i].nodeName ] [ l ] = m.createrecursive ( object.childNodes [i] );
					r [ object.childNodes[i].nodeName + '-attr' ] [ l ] = m.returnattributes ( object.childNodes[i] );
				}
				//alert('enddef');
				
			} else {
				//alert('def2');
				
				if ( object.childNodes[i].childNodes.length === 0 ) {
					if ( object.childNodes[i].nodeType === 3 ) { r [ object.childNodes[i].nodeName ] = concatTextNodes ( object.childNodes[i] ); } else { r [ object.childNodes[i].nodeName ] = object.childNodes[i].nodeValue; }
					r [ object.childNodes[i].nodeName + '-attr' ] = m.returnattributes ( object.childNodes[i] );
				} else {
					r [ object.childNodes[i].nodeName ] = m.createrecursive ( object.childNodes [i] );
					r [ object.childNodes[i].nodeName + '-attr' ] = m.returnattributes ( object.childNodes[i] );
				}
				
			}
		
		} else {
			
		}
	}
	
	return r;
}
wam.prototype.returnattributes = function ( object ) {
	var m = wa (':func' );
	
	if ( object.attributes === null ) return null;
	if ( object.attributes.length === 0 ) return null;
	
	var r = {};
	for ( var i in object.attributes ) {
		if ( object.attributes[i].nodeName === undefined ) continue;
		r [ object.attributes[i].nodeName ] = object.attributes[i].nodeValue;
	}
	
	return r;
}


// wikiapps ajax request.
function waar ( responseId, queueid ) {
	// wikiapps ajax request
	var waarm = this;
	
	this.requestType = 'GET';
	this.responseType = 'xml';
	this.requestUrl = '';
	this.pageRequest = false;
	
	this.postParams = '';
	this.responseId = responseId;
	this.queueId = queueid;
	
	this.abort = function () {
		if ( waarm.pageRequest != false ) {
			waarm.pageRequest.abort ();
			return true;
		}
	}
	
	this.doRequest = function ( runOnComplete, queueid ) {
		this.queueid = queueid;
		
		if ( this.requestUrl === '' ) return false;
		if ( window.XMLHttpRequest ) { // if good browser
			waarm.pageRequest = new XMLHttpRequest ();
		}
		else if ( window.ActiveXObject ) { // if IE
			try { // try request 1
				waarm.pageRequest = new ActiveXObject ( "Msxml2.XMLHTTP" );
			} 
			catch ( e ) { // it failed.
				try {	// try request 2
					waarm.pageRequest = new ActiveXObject ( "Microsoft.XMLHTTP" );
				}
				catch ( e ) { return false; }
			}
		}
		else
		{
			return false;
		}
		
		
		waarm.pageRequest.onreadystatechange = function () {
			if ( waarm.pageRequest.readyState == 4 ) { 
				if ( waarm.pageRequest.status == 200 ) {
					if ( waarm.responseType == 'xml' ) {
						wa ( ':api' ).results [ waarm.responseId ] = wa ( ':func' ).encodetoarray ( waarm.pageRequest.responseXML );
					} else {
						wa ( ':api' ).results [ waarm.responseId ] = waarm.pageRequest.responseText;
					}
					runOnComplete ( waarm.responseId, waarm.queueid );
				}
			}
		}
		
		if ( this.requestType == 'GET' ) {
			// do get request
			waarm.pageRequest.open ( 'GET', this.requestUrl, true );
			switch ( this.responseType ) {
				default: case 'xml':
					if ( waarm.pageRequest.overrideMimeType ) { waarm.pageRequest.overrideMimeType ( 'text/xml' ); } else {
						waarm.pageRequest.setRequestHeader ( 'Content-type', 'text/xml' ); }
					break;
					
				case 'html':
					if ( waarm.pageRequest.overrideMimeType ) waarm.pageRequest.overrideMimeType ( 'text/html' );
					break;
			}
			waarm.pageRequest.send ( null );
		}
		else if ( this.requestType == 'POST' )
		{
			// do post request
			waarm.pageRequest.open ( 'POST', this.requestUrl, true );
			waarm.pageRequest.setRequestHeader ( "Content-type", "application/x-www-form-urlencoded" );
			waarm.pageRequest.setRequestHeader ( "Content-length", this.postParams.length );
			waarm.pageRequest.setRequestHeader ( "Connection", "close" );
			waarm.pageRequest.send ( this.postParams );
		}
		else
		{ /* unrecognised */ }
		
	};
	
	return true;
}


// functioning.
	concatTextNodes = function ( anySibling ) {
		// returns a single string of all text nodes that are (only) siblings to this one in the correct order.
		
		if ( anySibling.nodeType !== 3 ) return false;
		
		var parent = anySibling.parentNode, r = '';
		
		for ( var i = 0, l = parent.childNodes.length; i < l; i ++ ) {
			if ( parent.childNodes [i].nodeType !== 3 ) continue;
			
			r += parent.childNodes [i].nodeValue;
		}
		
		return r;
	}

// prototyping.
	// arrays
	Array.prototype.count = function () {
		return this.length;
	}
	
	Array.prototype.contains = function ( searchFor, recursive ) {
		if ( recursive === null ) recursive = false;
		var haystack = this;
		
		return in_array ( searchFor, haystack, recursive );
	}
	
	Array.prototype.getPosition = function ( searchFor ) {
		for ( var i = 0, l = this.length; i < l; i ++ ) {
			if ( this [i] == searchFor ) return i;
		}
		
		return false;
	}
	
	// document
	/*document.prototype.selected = function () {
		if ( window.getSelection ) {
			return window.getSelection ();
		} else if ( document.getSelection ) {
			return document.getSelection ();
		} else if ( document.selection ) {
			return document.selection.createRange ().text;
		} else { return false; }
	}*/
	
// compatibility fixing.
	// popups
	wa_popups = function ( action ) {
		// check popups exist
		if ( typeof popupsReady !== 'function' ) return false;
		if ( ! popupsReady () ) return false;
		
		switch ( action ) {
			default: case 'refresh': case 'remove':
				var container = defaultPopupsContainer ();
				setupTooltips ( container, true );
			
			case 'add':
				setupTooltips ();
			
				break;
		}
		
		return true;
	}

if ( typeof waLoaded_2 === 'undefined' ) {
	var wap = new wa_main ();
	var wa = wap.go;
}

// define
var waLoaded_2 = true;

// end

//function test () {
//	wa ( ':api' ).command ( 'getcats', 'format=xml&action=query&prop=categories&cllimit=500&titles=' + wa(':func').encodewiki ( 'Ichabod_Washburn' ) ).wait ( function () { /*catMan.cats.getcats ( 0, true );*/ } ).run ();
	//wa ( ':api' ).get('t', 'User:Ale_jrb', 5).run();
//}
//hookEvent ('load', test);