Benutzer:P.Copp/scripts/wiki.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/* wiki.js
 * Some helper functions for preprocessor.js and the like
 * <nowiki> */ 

// Support legacy code with ts_number_transform_table
ts_number_transform_table = { ',' : '.', '.' : ',' };

if( !String.prototype.trim ) {
	String.prototype.trim = function() { return this.replace( /^\s+|\s+$/g, '' ); };
}

if( !window.Wiki ) Wiki = {};

Wiki.pageCache    = {};
Wiki.messageCache = {};
Wiki.funcCache    = {};
Wiki.infoLoaded   = {};

//Basic string functions
Wiki.ucfirst = function( s ) {
	if( !s ) return s;
	return s.charAt( 0 ).toUpperCase() + s.substring( 1 );
};
Wiki.lcfirst = function( s ) {
	if( !s ) return s;
	return s.charAt( 0 ).toLowerCase() + s.substring( 1 );
};
//Mimic the behavior of PHP's urlencode function
Wiki.urlencode = function( s ) {
	return encodeURIComponent(s)
		.replace( /%20/g, '+' ).replace( /!/g, '%21' )
		.replace( /'/g, '%27' ).replace( /\(/g, '%28' )
		.replace( /\)/g, '%29' ).replace( /\*/g, '%2A' )
		.replace( /~/g, '%7E' );
};
//This one imitates MediaWiki's wfUrlencode except that spaces are already changed to underscores
Wiki.titleencode = function( s ) {
	return encodeURI( s.replace( / /g, '_' ) )
		.replace( /\+/g, '%2B' ).replace( /'/g, '%27' )
		.replace( /~/g, '%7E' ).replace( /#/g, '%23' )
		.replace( /&/g, '%26' ).replace( /=/g, '%3D' )
		.replace( /\?/g, '%3F' );
};
Wiki.anchorencode = function( s ) {
	return Wiki.urlencode( s ).replace( /%/g, '.' ).replace( /\+/g, '_' ).replace( /\.3A/g, ':' );
};
Wiki.escapeXML = function( s ) {
	return s.replace( /&/g, '&amp;' ).replace( /</g, '&lt;' )
		    .replace( />/g, '&gt;' ).replace( /"/g, '&quot;' );
};

//Counterparts to Language::parseFormattedNumber and Language::formatNum
Wiki.parseFormattedNumber = function( s ) {
	if( !window.ts_number_transform_table ) ts_initTransformTable();
	if ( ts_number_transform_table ) {
		var plain = '';
		for ( var i = 0; i < s.length; i++ ) {
			var c = s.charAt( i );
			plain += typeof ts_number_transform_table[c] == 'undefined'
				? c
				: ts_number_transform_table[c];
		}
		return plain.replace( /,/g, '' );
	}
	return s.replace( /,/g, '' );
};
Wiki.formatNum = function( s, nocommafy ) {
	var s = s + '';

	//First step: commafy
	if( !nocommafy ) {
		var rx = /(^|[^\d\.])(\d{4,})/g, m;
		var result = '', index = 0;
		while( m = rx.exec( s ) ) {
			result += s.substring( index, m.index + m[1].length );
			index = m.index + m[0].length;
			result += Wiki.commafy( m[2] );
		}
		s = result + s.substring( index );
	}

	//Second step: transform to local representation
	if( !window.rev_number_transform_table ) {
		window.rev_number_transform_table = {};
		if( !ts_number_transform_table ) ts_initTransformTable();
		if( ts_number_transform_table )
			for( i in ts_number_transform_table )
				if( typeof i == 'string' && typeof ts_number_transform_table[i] == 'string' )
					rev_number_transform_table[ts_number_transform_table[i]] = i;
	}
	var local = '';
	for( var i = 0; i < s.length; i++ ) {
		var c = s.charAt( i );
		local += typeof rev_number_transform_table[c] == 'undefined'
			? c
			: rev_number_transform_table[c];
	}
	return local;
};
Wiki.commafy = function( s ) {
	for( var i = s.length % 3, bits = []; i <= s.length; i += 3 )
		if( i > 0 ) bits.push( s.substring( i - 3, i ) );
	return bits.join( ',' );
};
Wiki.padString = function( s, len, pad, dir ) {
	if( !pad ) return s;
	var remain = Math.min( len, 500 ) - ( s + '' ).length;
	var padding = '';
	while( remain > 0 ) {
		padding += pad.substring( 0, remain );
		remain -= pad.length;
	}
	return dir === 'right' ? s + padding : padding + s;
};
//Replace message parameters "$1"...
Wiki.insertParams = function( s, params ) {
	if( !s || !params ) return s;
	for( var i = 0; i < params.length; i++ ) {
		var rx = new RegExp('\\$'+ (i+1),'g');
		s = s.replace(rx,params[i]);
	};
	return s;
};

Wiki.getUTCDate = function() {
	var date = new Date();
	var offset = date.getTimezoneOffset();
	if( offset ) date.setTime( date.getTime() + offset * 60000 );
	return date;
};
Wiki.getLocalDate = function() {
	var date = Wiki.getUTCDate( date );
	if( Wiki.timeOffset ) date.setTime( date.getTime() + Wiki.timeOffset * 60000 );
	return date;
};
//from Language::sprintfDate. returns false if it finds characters it can't handle yet
Wiki.formatDate = function( date, format, rawtoggle ) {
	if( !format ) return format;
	var result = '', num = false, raw = false;
	if( !Wiki.infoLoaded.datemessages ) Wiki.loadInfo( ['datemessages'] );
	for( var i = 0; i < format.length; i++ ) {
		var code = format.charAt( i );
		if( code == 'x' ) code += format.charAt( ++i );
		switch( code ) {
			case 'xi':
			case 'xj':
			case 'xk':
			case 'xm':
			case 'xo':
			case 'xt':
			case 'xr':
			case 'xh':
			case 'z' :
			case 'W' :
			case 't' :
			case 'L' :
			case 'o' :
			case 'r' : //
				return false;
			case 'xg':
				var msg = Wiki.monthGenMessages[date.getMonth()];
				result += Wiki.getMessage( wgContentLanguage, msg );
				break;
			case 'D' :
				var msg = Wiki.weekdayAbbrevMessages[date.getDay()];
				result += Wiki.getMessage( wgContentLanguage, msg );
				break;
			case 'l' :
				var msg = Wiki.weekdayMessages[date.getDay()];
				result += Wiki.getMessage( wgContentLanguage, msg );
				break;
			case 'F' :
				var msg = Wiki.monthMessages[date.getMonth()];
				result += Wiki.getMessage( wgContentLanguage, msg );
				break;
			case 'M' :
				var msg = Wiki.monthAbbrevMessages[date.getMonth()];
				result += Wiki.getMessage( wgContentLanguage, msg );
				break;
			case 'xx': result += 'x'; break;
			case 'xn': raw = true; break;
			case 'xN': var rawtoggle = !rawtoggle; break;
			case 'd' : num = Wiki.padString( date.getDate(), 2, '0' ); break;
			case 'j' : num = date.getDate(); break;
			case 'N' : num = date.getDay() || 7; break;
			case 'w' : num = date.getDay(); break;
			case 'm' : num = Wiki.padString( date.getMonth() + 1, 2, '0' ); break;
			case 'n' : num = date.getMonth() + 1; break;
			case 'Y' : num = Wiki.padString( date.getFullYear(), 4, '0' ); break;
			case 'y' : num = Wiki.padString( date.getYear(), 2, '0' ); break;
			case 'a' : result += date.getHours() < 12 ? 'am' : 'pm'; break;
			case 'A' : result += date.getHours() < 12 ? 'AM' : 'PM'; break;
			case 'g' : num = date.getHours() % 12 || 12; break;
			case 'G' : num = date.getHours(); break;
			case 'h' : num = Wiki.padString( date.getHours() % 12 || 12, 2, '0' ); break;
			case 'H' : num = Wiki.padString( date.getHours(), 2, '0' ); break;
			case 'i' : num = Wiki.padString( date.getMinutes(), 2, '0' ); break;
			case 's' : num = Wiki.padString( date.getSecond(), 2, '0' ); break;
			case 'c' : result += Wiki.formatDate( date, 'Y-m-dTH:i:s+00:00', true ); break;
			case 'U' : num = Math.floor( date.getTime() / 1000 ); break;
			case '\\': result += format.charAt( ++i ) || '\\'; break;
			case '"' :
				var pos = format.indexOf( '"', i + 1 );
				if( pos > -1 ) {
					result += format.substring( i + 1, pos );
					i = pos;
				} else {
					result += '"';
				}
				break;
			default  : result += format.charAt( i );
		}
		if( num ) {
			if( raw || rawtoggle ) {
				result += num;
				raw = false;
			} else result += Wiki.formatNum( num, true );
			num = false;
		}
	}
	return result;
};

Wiki.getNS = function( s ) {
	if( typeof wgNamespaceIds[s] != 'undefined' ) return wgNamespaceIds[s];
	if( typeof Wiki.canonicalNamespaceIds[s] != 'undefined' ) return Wiki.canonicalNamespaceIds[s];
	return false;
};

//Page object holding the namespace and title part separately
//Constructor doesn't do any checks, use Wiki.getPage to normalize titles first
Wiki.Page = function( ns, title ) {
	this.ns = ns;
	this.title = title;
	var nstext = wgFormattedNamespaces[ns];
	//The prefixed version of the title (Namespace:Title), stored for convenience
	this.ptitle = nstext + ( nstext ? ':' : '' ) + title;
};
//Construct a page object from a string. Only some basic validity checks are performed,
//interwiki and fragment handling is missing completely
Wiki.getPage = function( s, defaultns ) {
	if( !s ) return false;
	try{ var s = decodeURIComponent( s ); } catch( e ) {};

	//check for illegal chars
	if( s.match( /[<>\[\]\|\{\}\x00-\x1F\xFF]/ ) ) return false;

	//normalize whitespace
	var s = s.replace( /[ _]+/g, ' ' ).trim();

	//TODO: Fragments
	//Leading colon overrides the specified default namespace
	if( s.charAt( 0 ) == ':' ) {
		s = s.substring( 1 );
		var defaultns = 0;
	}

	//Split the namespace off
	var ns = false;
	var pos = s.indexOf( ':' );
	if( pos > -1 )
		ns = Wiki.getNS( s.substring( 0, pos ).trim().toLowerCase().replace( / /g, '_' ) );
	if( ns === false ) {
		ns = defaultns || 0;
		//TODO: Respect wgCapitalLinks
		var title = Wiki.ucfirst( s.trim() );
	} else var title = Wiki.ucfirst( s.substring( pos + 1 ).trim() );
	if( !title ) return false;
	return new Wiki.Page( ns, title );
};

Wiki.Page.prototype.createLink = function( text ) {
	var link = document.createElement( 'a' );
	link.href = wgArticlePath.replace( /\$1/, Wiki.titleencode( this.ptitle ) );
	link.title = this.ptitle;
	link.appendChild( document.createTextNode( text || this.ptitle ) );
	return link;
};
Wiki.Page.prototype.doEdit = function( text, summary, callback ) {
	if( !Wiki.edittoken ) throw 'missing edittoken';
	var query = {
		action  : 'edit',
		title   : this.ptitle,
		token   : Wiki.edittoken,
		summary : summary || ''
	};
	var ts = this.getVal( 'timestamp' );
	if( ts ) query.basetimestamp = ts;
	this.purge();
	return Wiki.callApi( query, { text : text }, callback );
};

Wiki.Page.prototype.purge = function() { delete Wiki.pageCache[this.ptitle]; };

Wiki.Page.prototype.getVal = function( key ) {
	if( !Wiki.pageCache.hasOwnProperty( this.ptitle ) ) return null;
	var data = Wiki.pageCache[this.ptitle];
	if( data.exists === false ) return false;
	if( data.hasOwnProperty( key ) ) return data[key];
	else return null;
};
Wiki.Page.prototype.setVal = function( key, val ) {
	if( !Wiki.pageCache.hasOwnProperty( this.ptitle ) ) Wiki.pageCache[this.ptitle] = {};
	Wiki.pageCache[this.ptitle][key] = val;
};

Wiki.Page.prototype.existsCached = function() {
	if( this.ns == -1 ) return true;
	return this.getVal( 'exists' );
};
Wiki.Page.prototype.exists = function( callback ) {
	var cached = this.existsCached();
	if( cached !== null ) return callback ? callback( cached ) : cached;
	var page = this;
	if( callback )
		return this.load( false, false, function(){ callback( page.existsCached() ) } );
	this.load();
	return this.existsCached();
};

Wiki.Page.prototype.getTextCached = function( redirs ) {
	if( redirs ) {
		var target = this.getVal( 'redirect' );
		if( target === true ) return null;
		else if( target ) return Wiki.getPage( target ).getTextCached();
	}
	return this.getVal( 'text' );
};
Wiki.Page.prototype.getText = function( redirs, callback ) {
	var cached = this.getTextCached( redirs );
	if( cached !== null ) return callback ? callback( cached ) : cached;

	var page = this;
	if( callback )
		return this.load( true, redirs, function(){ callback( page.getTextCached( redirs ) ); } );
	this.load( true, redirs );
	return this.getTextCached( redirs );
};
Wiki.Page.prototype.getTemplateDomCached = function() {
	if( this.getVal( 'dom' ) !== null ) return this.getVal( 'dom' );
	var text = this.getTextCached( true );
	if( text !== null ) {
		this.setVal( 'dom', Wiki.preprocessToObject( text, true ) );
		return this.getVal( 'dom' );
	} else return null;
};
Wiki.Page.prototype.getTemplateDom = function( callback ) {
	var cached = this.getTemplateDomCached();
	if( cached !== null ) return callback ? callback( cached ) : cached;
	var page = this;
	if( callback )
		return this.load( true, true, function() { callback( page.getTemplateDomCached() ); } );
	this.load( true, true );
	return this.getTemplateDomCached();
};

Wiki.Page.prototype.load = function( getText, redirs, callback ) {
	var query = {
		action : 'query',
		rvprop : ['timestamp'],
		titles : this.ns == -2 ? Wiki.getPage( 'File:' + this.title ).ptitle : this.ptitle,
		prop : ['revisions','info']
	};
	if( getText ) query.rvprop.push( 'content' );
	if( redirs ) query.redirects = '';
	if( this.ns == -2 ) query.prop.push( 'imageinfo' );
	if( !Wiki.edittoken ) query.intoken = 'edit';
	var page = this;
	if( callback ) return Wiki.callApi( query, null, function( res ) {
		Wiki.storePage( res );
		callback();	
	} ); else Wiki.storePage( Wiki.callApi( query ) );
};
Wiki.storePage = function( res ) {
	if( !res || !res.query ) return;
	if( res.query.redirects ) {
		var r = res.query.redirects;
		for( var i = 0; i < r.length; i++ ) {
			var page = Wiki.getPage( r[i].from );
			page.setVal( 'exists', true );
			page.setVal( 'redirect', r[i].to );
		}
	}
	if( res.query.pages ) {
		var p = res.query.pages;
		for( var pid in p ) if( p.hasOwnProperty( pid ) ) {
			var page = Wiki.getPage( p[pid].title );
			if( p[pid].missing === '' || p[pid].invalid === '' ) page.setVal( 'exists', false );
			else{
				page.setVal( 'exists', true );
				page.setVal( 'id', p[pid].pageid );
				page.setVal( 'size', p[pid].length );
				if( p[pid].redirect === '' ) page.setVal( 'redirect', true );
				var rev = p[pid].revisions[0];
				page.setVal( 'timestamp', rev.timestamp );
				if( rev.hasOwnProperty( '*' ) ) page.setVal( 'text', rev['*'] || '' );
			}
			if( p[pid].hasOwnProperty( 'imagerepository' ) )
				Wiki.getPage( 'Media:' + page.title ).setVal( 'exists', !!p[pid].imageinfo );
			if( p[pid].hasOwnProperty( 'edittoken' ) ) Wiki.edittoken = p[pid].edittoken;
		}
	}
};

Wiki.encodeQuery = function( obj ) {
	var pairs = [];
	for( var name in obj ) if( obj.hasOwnProperty( name ) ) {
		if( typeof obj[name] == 'object' ) obj[name] = obj[name].join( '|' );
		pairs.push( encodeURIComponent( name ) + '=' + encodeURIComponent( obj[name] ) );
	}
	return pairs.join( '&' );
};

//Ajax functions
//If no callback function is specified, will perform synchronous calls
Wiki.callApi = function( query, data, callback ) {
	var method = data ? 'POST' : 'GET';
	if( typeof query == 'object' ) var query = Wiki.encodeQuery( query );
	if( typeof data == 'object' ) var data = Wiki.encodeQuery( data );
	var url = wgScriptPath + '/api.php?format=json&' + query;
	var req = sajax_init_object();
	if( !req ) return false;
	req.open( method, url, !!callback );
	if( method == 'POST' )
		req.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
	if( callback ) req.onreadystatechange = function() {
		if( req.readyState == 4 ) {
			if( req.status != 200 ) callback( false );
			else eval( 'callback(' + req.responseText + ')' );
		}
	};
	req.send( data || '' );
	if( !callback ) return eval( '(' + req.responseText + ')' );
};

Wiki.getMessageCached = function( lang, key ) {
	if( !Wiki.messageCache.hasOwnProperty( lang ) ) Wiki.messageCache[lang] = {};
	var c = Wiki.messageCache[lang];
	if( c.hasOwnProperty( key ) ) return c[key];
	else return null;
};
Wiki.getMessage = function( lang, key, callback ) {
	var cached = Wiki.getMessageCached( lang, key );
	if( cached !== null ) return callback ? callback( cached ) : cached;

	if( callback )
		return Wiki.loadMessage( lang, key, function(){ callback( Wiki.getMessageCached( lang, key ) ); } );
	Wiki.loadMessage( lang, key );
	return Wiki.getMessageCached( lang, key );
};
Wiki.loadMessage = function( lang, key, callback ) {
	var query = {
		action : 'query',
		meta   : 'allmessages',
		ammessages : key,
		amlang : lang
	};
	if( callback ) return Wiki.callApi( query, null, function( res ) {
		Wiki.storeMessages( res, lang );
		callback();	
	} ); else Wiki.storeMessages( Wiki.callApi( query ), lang );
};	
Wiki.storeMessages = function( res, lang ) {
	if( !res || !res.query || !res.query.allmessages ) return;
	var m = res.query.allmessages;
	if( !Wiki.messageCache[lang] ) Wiki.messageCache[lang] = {};
	var c = Wiki.messageCache[lang];
	for( var i = 0; i < m.length; i++ ) c[m[i].name] = m[i]['*'];
};

Wiki.getFuncCached = function( text ) {
	if( Wiki.funcCache.hasOwnProperty( text ) ) return Wiki.funcCache[text];
	else return null;
};
Wiki.getFunc = function( text, callback ) {
	var cached = Wiki.getFuncCached( text );
	if( cached !== null ) return callback ? callback( cached ) : cached;

	var query = { action : 'expandtemplates' };
	var data = { text : text };
	if( callback ) return Wiki.callApi( query, data, function( res ) {
		callback( Wiki.funcCache[text] = res.expandtemplates['*'] );
	} );
	return Wiki.funcCache[text] = Wiki.callApi( query, data ).expandtemplates['*'];
};

Wiki.magicIsVar = function( name ) {
	return Wiki.magicwordFlags[name] & 1;
};
Wiki.magicIsFunc = function( name ) {
	return Wiki.magicwordFlags[name] & 6;
};
Wiki.getMagicWord = function( s ) {
	if( !Wiki.magicwordAliases ) Wiki.loadInfo( ['magicwords'] );
	var mw = Wiki.magicwordAliases[s];
	if( mw ) return mw.name;
	var mw = Wiki.magicwordAliases[s.toLowerCase()];
	if( mw && mw['case-sensitive'] !== '' ) return mw.name;
	return false;
};

Wiki.loadInfo = function( items, callback ) {
	var query = { action : 'query', meta : [] };
	var data = false;
	var siteinfo = false;
	var allmessages = false;

	for( var i = 0; i < items.length; i++ ) {
		if( Wiki.infoLoaded[items[i]] ) continue;
		switch( items[i] ) {
			case 'magicwords':
				if( !siteinfo ) {
					query.meta.push( 'siteinfo' );
					query.siprop = [];
					siteinfo = true;
				}
				query.siprop.push( 'magicwords' );
				query.siprop.push( 'general' );
			case 'datemessages':
				if( !allmessages ) {
					query.meta.push( 'allmessages' );
					if( !data ) data = {};
					data.ammessages = [];
					query.amlang = wgContentLanguage;
				}
				for( var j = 0; j < Wiki.weekdayMessages.length; j++ )
					data.ammessages.push( Wiki.weekdayMessages[j] );
				for( var j = 0; j < Wiki.weekdayAbbrevMessages.length; j++ )
					data.ammessages.push( Wiki.weekdayAbbrevMessages[j] );
				for( var j = 0; j < Wiki.monthMessages.length; j++ )
					data.ammessages.push( Wiki.monthMessages[j] );
				for( var j = 0; j < Wiki.monthGenMessages.length; j++ )
					data.ammessages.push( Wiki.monthGenMessages[j] );
				for( var j = 0; j < Wiki.monthAbbrevMessages.length; j++ )
					data.ammessages.push( Wiki.monthAbbrevMessages[j] );
		}
	}
	if( !query.meta.length ) return;
	if( callback ) Wiki.callApi( query, data, function( res ) {
		Wiki.storeInfo( res );
		if( typeof callback == 'function' ) callback();
	} ); else Wiki.storeInfo( Wiki.callApi( query, data ) );
};

Wiki.storeInfo = function( res ) {
	if( !res || !res.query ) return;

	var m = res.query.general;
	if( m ) Wiki.timeOffset = m.timeoffset;

	var m = res.query.magicwords;
	if( m ) {
		Wiki.magicwordAliases = {};
		for( var i = 0; i < m.length; i++ ) {
			var flags = Wiki.magicwordFlags[m[i].name];
			var cs = m[i]['case-sensitive'] === '';
			for( var j = 0; j < m[i].aliases.length; j++ ) {
				var alias = cs ? m[i].aliases[j] : m[i].aliases[j].toLowerCase();
				alias = alias.replace( /:$/, '' );
				if( flags & 4 ) Wiki.magicwordAliases['#' + alias] = m[i];
				if( flags & 11 ) Wiki.magicwordAliases[alias] = m[i];
			}
		}
		Wiki.infoLoaded.magicwords = true;
	}

	if( res.query.allmessages ) {
		Wiki.storeMessages( res, wgContentLanguage );
		Wiki.infoLoaded.datemessages = true;
	}
};

Wiki.magicwordFlags = { //1=variable, 2=parser function w/o hash,4=p.function w. hash,8=modifier
	'currentmonth'			: 1,//
	'currentmonth1'			: 1,//
	'currentmonthname'		: 1,//
	'currentmonthnamegen'	: 1,//
	'currentmonthabbrev'	: 1,//
	'currentday'			: 1,//
	'currentday2'			: 1,//
	'currentdayname'		: 1,//
	'currentyear'			: 1,//
	'currenttime'			: 1,//
	'currenthour'			: 1,//
	'localmonth'			: 1,//
	'localmonth1'			: 1,//
	'localmonthname'		: 1,//
	'localmonthnamegen'		: 1,//
	'localmonthabbrev'		: 1,//
	'localday'				: 1,//
	'localday2'				: 1,//
	'localdayname'			: 1,//
	'localyear'				: 1,//
	'localtime'				: 1,//
	'localhour'				: 1,//
	'numberofpages'			: 3,
	'numberofarticles'		: 3,
	'numberoffiles'			: 3,
	'numberofusers'			: 3,
	'numberofactiveusers'	: 3,
	'numberofedits'			: 3,
	'numberofviews'			: 3,
	'numberofadmins'		: 3,
	'pagename'				: 3,//
	'pagenamee'				: 3,//
	'namespace'				: 3,//
	'namespacee'			: 3,//
	'talkspace'				: 3,//
	'talkspacee'			: 3,//
	'subjectspace'			: 3,//
	'subjectspacee'			: 3,//
	'fullpagename'			: 3,//
	'fullpagenamee'			: 3,//
	'subpagename'			: 3,//
	'subpagenamee'			: 3,//
	'basepagename'			: 3,//
	'basepagenamee'			: 3,//
	'talkpagename'			: 3,//
	'talkpagenamee'			: 3,//
	'subjectpagename'		: 3,//
	'subjectpagenamee'		: 3,//
	'sitename'				: 1,
	'scriptpath'			: 1,
	'currentweek'			: 1,
	'currentdow'			: 1,
	'localweek'				: 1,
	'localdow'				: 1,
	'revisionid'			: 1,
	'revisionday'			: 1,
	'revisionday2'			: 1,
	'revisionmonth'			: 1,
	'revisionyear'			: 1,
	'revisiontimestamp'		: 1,
	'revisionuser'			: 1,
	'currentversion'		: 1,
	'currenttimestamp'		: 1,
	'localtimestamp'		: 1,
	'directionmark'			: 1,
	'contentlanguage'		: 1,
	'server'				: 1,
	'servername'			: 1,
	'stylepath'				: 1,
	'int'					: 2,//
	'numberingroup'			: 2,
	'ns'					: 2,//
	'localurl'				: 2,//
	'grammar'				: 2,
	'gender'				: 2,
	'fullurl'				: 2,//
	'lcfirst'				: 2,//
	'ucfirst'				: 2,//
	'lc'					: 2,//
	'uc'					: 2,//
	'displaytitle'			: 2,//
	'urlencode'				: 2,//
	'anchorencode'			: 2,//
	'pagesinnamespace'		: 2,
	'formatnum'				: 2,//
	'padleft'				: 2,//
	'padright'				: 2,//
	'special'				: 4,
	'defaultsort'			: 2,//
	'pagesincategory'		: 2,
	'pagesize'				: 2,
	'protectionlevel'		: 2,
	'formatdate'			: 2,
	'localurle'				: 2,//
	'plural'				: 2,//
	'fullurle'				: 2,//
	'nse'					: 2,//
	'expr'					: 4,//
	'if'					: 4,//
	'ifeq'					: 4,//
	'ifexpr'				: 4,//
	'iferror'				: 4,//
	'switch'				: 4,//
	'ifexist'				: 4,//
	'time'					: 4,
	'timel'					: 4,
	'rel2abs'				: 4,//
	'titleparts'			: 4,//
	'language'				: 2,
	'filepath'				: 2,
	'tag'					: 4,//
	'msg'					: 8,
	'msgnw'					: 8,
	'subst'					: 8,
	'raw'					: 8
};

Wiki.weekdayMessages = [
	'sunday',
	'monday',
	'tuesday',
	'wednesday',
	'thursday',
	'friday',
	'saturday'
];
Wiki.weekdayAbbrevMessages = [
	'sun',
	'mon',
	'tue',
	'wed',
	'thu',
	'fri',
	'sat'
];
Wiki.monthMessages = [
	'january',
	'february',
	'march',
	'april',
	'may_long',
	'june',
	'july',
	'august',
	'september',
	'october',
	'november',
	'december'
];
Wiki.monthGenMessages = [
	'january-gen',
	'february-gen',
	'march-gen',
	'april-gen',
	'may-gen',
	'june-gen',
	'july-gen',
	'august-gen',
	'september-gen',
	'october-gen',
	'november-gen',
	'december-gen'
];
Wiki.monthAbbrevMessages = [
	'jan',
	'feb',
	'mar',
	'apr',
	'may',
	'jun',
	'jul',
	'aug',
	'sep',
	'oct',
	'nov',
	'dec'
];
	
//Standard namespaces
Wiki.canonicalNamespaceIds = {
	'media'                : -2,
	'special'              : -1,
	''                     :  0,
	'talk'                 :  1,
	'user'                 :  2,
	'user_talk'            :  3,
	'project'              :  4,
	'project_talk'         :  5,
	'file'                 :  6,
	'file_talk'            :  7,
	'mediawiki'            :  8,
	'mediawiki_talk'       :  9,
	'template'             : 10,
	'template_talk'        : 11,
	'help'                 : 12,
	'help_talk'            : 13,
	'category'             : 14,
	'category_talk'        : 15
};