Kamel:Nachteule/RTRC-dev.js

aus Kamelopedia, der wüsten Enzyklopädie
Wechseln zu: Navigation, Suche

Hinweis: Leere nach dem Speichern 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
  • Internet Explorer: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen
/**
 * Real-Time Recent Changes
 * Created on April 25th, 2010
 *
 * version: 0.8.2-dev
 * url: http://meta.wikimedia.org/wiki/User:Krinkle/Tools/Real-Time_Recent_Changes
 *
 * Copyright (c) 2010 Krinkle <krinklemail (at) gmail (.) com>
 *
 * Real-Time Recent Changes by Krinkle [1] is licensed under
 * a Creative Commons Attribution-Share Alike 3.0 Unported License [2]
 *
 * [1] <http://commons.wikimedia.org/wiki/User:Krinkle>
 * [2] <http://creativecommons.org/licenses/by-sa/3.0/>
 *
 * kamelopedierte Fassung (basierend auf v0.8.2-beta)
 * -------------------------------------------------
 * Global variables: wgVars, jQuery
 */
$ = jQuery;
/**
 * Configuration
 * -------------------------------------------------
 */
	var krRTRC_appVersion = "v0.1 berta";
	var krRTRC_appDate = "November 10, 2010";
	var krRTRC_APIURL = mw.config.get( 'wgServer' )+mw.config.get( 'wgScriptPath' )+"/api.php";
	var krRTRC_LoaderSRC = "http://kamelopedia.mormo.org/images/c/ce/Bufferingbuffering.gif"; // 32x32px
	var krRTRC_BliconSRC = "http://kamelopedia.mormo.org/images/a/ae/18px-Achtung.svg.png"; // 18x15
	var krRTRC_HelpURL = "http://kamelopedia.mormo.org/index.php/Kamelopedia:RTRC/Hilfe";
	var krRTRC_Debug = 0; // Debug on or off
	if ( typeof krRTRC_Disabled == 'undefined' || krRTRC_Disabled !== true ) {
		var krRTRC_Disabled = false;
	} else {
		var krRTRC_Disabled = true;
	}
	var krRTRC_MarkPatrolCacheMax = 20;
 
	// Are used later:
	var krRTRC_Patrolright = false;
	var krRTRC_Patroltoken = false;
	var krRTRC_Delhistright = false;
	var krRTRC_RCDataURL = false;
		var krRTRC_optLimit = "25";
		var krRTRC_optFiltAnon = false;
		var krRTRC_optFiltPatrol = false;
		var krRTRC_optUser = "";
		var krRTRC_optTypeEdit = true;
		var krRTRC_optTypeNewpage = true;
		var krRTRC_optPage = "";
		var krRTRC_optRctype = "";
		var krRTRC_optFrom = false;
		var krRTRC_optUntill = false;
		var krRTRC_optRcshow = "";
		var krRTRC_optRcprop = "";
		var krRTRC_optRcstart = "";
		var krRTRC_optNS = "";
		var krRTRC_optOrder = "desc";
		var krRTRC_optRcend = "";
		var krRTRC_optRInt = 3000;
		var krRTRC_optIRCBL = false;
	var krRTRC_RCTimeout = false;
	var krRTRC_RCEnabled = null;
	var krRTRC_IntMsgs = {};
	var krRTRC_RCLegendHTML = "";
	var krRTRC_MassPatrol = false;
	var krRTRC_AutoDiff = false;
	var krRTRC_AutoDiffTop = false;
	var krRTRC_DayHeadPrev = false;
	var krRTRC_SkipDiffs = [];
	var krRTRC_MarkPatrolCache = [];
	var krRTRC_Months = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
 
	var krRTRC_SkipButon = "";
	var krRTRC_FeedMemHTML = "";
	var krRTRC_FeedMemUidArr = [];
	var krRTRC_TimeDiff = 0; // Difference UTC vs. wiki - fetched from siteinfo/timeoffset, in minutes funzt net
	var krRTRC_WikiID = "unknown"; // wgDBname
	var krRTRC_Updating = false;
 
	// Messages
	if( typeof window.krMsgs !== 'object' ) {
		$.getScript('http://kamelopedia.mormo.org/index.php?title=MediaWiki:Skin/Kamelopedia:RTRC&action=raw', function(){
			krRTRC_Months = krRTRC_Msg('months').split(',');
		});
	}
 
/**
 * Tool Functions
 * -------------------------------------------------
 */
	// Logs a message if debugging is enabled
	function krLog(s,o){
		if (krRTRC_Debug===1){ console.log(s); if(o){console.log(o);}}
		return true;
	}
 
	if ( typeof String.prototype.ucFirst === 'undefined' ) {
		String.prototype.ucFirst = function(){
			return this.substr(0,1).toUpperCase() + this.substr(1,this.length);
		};
	}
	if ( typeof String.prototype.escapeRE === 'undefined' ) {
	        String.prototype.escapeRE = function() {
	                return this.replace(/([\\{}()|.?*+^$\[\]])/g, "\\$1");
	        };
	}
 
	// Encode/decode htmlentities
	function krEncodeEntities(s){
		return $("<div/>").text(s).html();
	}
	function krDencodeEntities(s){
		return $("<div/>").html(s).text();
	}
 
	// Get interface message
	function krRTRC_Msg(key){
		if(krMsgs[key]){
			return krMsgs[key];
		} else {
			return key.ucFirst();
		}
 
	}
 
	// Returns a GET-parameter as string
	function krGetUrlParam(s,url){
		url = url ? url : document.location.href;
		// Get last match, stop at hash
		var re = new RegExp( '[^#]*[&?]' + s.escapeRE() + '=([^&#]*)' ); 
		var m = re.exec( url );
		if ( m && m.length > 1 ) {
			return decodeURIComponent( m[1] );
		}
		return null;
	}
 
	// Returns all GET-parameters as array
	function krParseUrlParams(l) {
		var url = l ? l : document.location.href;
		var match = url.match(/\?[^#]*/);
		if (match === null) return null;
		var query = match[0];
		var ret = {};
		var pattern = /[&?]([^&=]*)=?([^&]*)/g;
		match = pattern.exec(query);
		for (; match !== null; match = pattern.exec(query)) {
			var key = decodeURIComponent(match[1]);
			var value = decodeURIComponent(match[2]);
			ret[key] = value;
		}
		return ret;
	}
 
	// Check if a variable is 'empty'
	function krEmpty(v){
		var key;
 
		if (v === "" || v === 0 || v === "0" || v === null || v === false || typeof v === 'undefined'){
			return true;
		}
 
		if (typeof v == 'object'){
			for (key in v){
				return false;
			}
			return true;
		}
 
		return false;
	}
 
	// Trim whitespace
	// Thanks to http://blog.stevenlevithan.com/archives/faster-trim-javascript
	function krTrim(v){
		return v.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
	}
 
	// Prepends a leading zero if value is under 10
	function krRTRC_leadZ(i){
		if (i<10){ i="0" + i;}
		return i;
	}
 
	// Construct a URL to a page on the wiki
	function krRTRC_WikiLink(s){
		var l = mw.config.get( 'wgServer' );
		l += mw.config.get( 'wgArticlePath' ).replace("$1", encodeURIComponent(s).replace(/\%3A/g, ":").replace(/\%2F/g, "/").replace(/\%3F/g, "?"));
		return l;
	}
 
	// Adjust API-timestamp to local timezone time
	// Convert API-timestamp to Date()-readable
	// Example: "2010-04-25T23:24:02Z" => "2010/04/25 23:24:02"
	// Convert to UNIX Epoch - amount of ms to adjust
	function krRTRC_APITimeConv(s){
		s = s.toString(); // Possible number/integer to string
		s = s.replace("-","/").replace("-","/").replace("T"," ").replace("Z",""); // Convert to Date()-readable
		return new Date(s);
	}
 
	// Adjust API-timestamp to local timezone time
	// Convert API-timestamp to Date()-readable
	// Example: "2010-04-25T23:24:02Z" => "2010/04/25 23:24:02"
	// Convert to UNIX Epoch - amount of ms to adjust
	function krRTRC_AdjustAPIClocktime(s){
		d = krRTRC_APITimeConv(s);
		//msd = krRTRC_TimeDiff*60*1000; // Get difference in miliseconds funzt net
                msd = 120*60*1000; // sollte funzen
		d.setTime(d.getTime()+msd); // Adjust object to difference
		return krRTRC_leadZ(d.getHours())+':'+krRTRC_leadZ(d.getMinutes()); // Return clocktime with leading zeros
	}
 
	// Adjust long timestamp to local timezone
	// - Converts from LongTime to Date()-readable
	// - Example: "20100424013000" => "20100424011000"
	// - Convert to UNIX Epoch - amount of ms to adjust
	// - Returns new LongTime
	function krRTRC_AdjustLongTime(s){
		s = s.toString(); // Possible number/integer to string
		s = s.substr(0,4)+'/'+s.substr(4,2)+'/'+s.substr(6,2)+' '+s.substr(8,2)+':'+s.substr(10,2)+':'+s.substr(12,2); // Convert to Date()-readable
		d = new Date(s);
		if(d=='Invalid Date'){ krLog("krRTRC_AdjustLongTime: d-var: Invalid Date"); return false; }
		msd = krRTRC_TimeDiff*60*1000; // Get difference in miliseconds
		d.setTime(d.getTime()-msd); // Adjust object to difference
		return d.getFullYear()+''+krRTRC_leadZ(d.getMonth()+1)+''+krRTRC_leadZ(d.getDate())+''+krRTRC_leadZ(d.getHours())+''+krRTRC_leadZ(d.getMinutes())+''+krRTRC_leadZ(d.getSeconds()); // Return longtime with leading zeros
	}
 
	// Returns whether the given variable is an integer
	function krRTRC_isInt(i){
		return parseInt(i,10)===i;
	}
 
	// Searches an array for the giving string
	function krInArray(s, array){
		for (i = 0; i < array.length; i++){
			if (array[i] == s){
				return true;
			}
		}
		return false;
	}
 
 
/**
 * App Main Functions
 * -------------------------------------------------
 */
 
	function krRTRC_RCDayHead(time) {
		var current = time.getDate();
		if(current == krRTRC_DayHeadPrev){
			return '';
		} else {
			krRTRC_DayHeadPrev = current;
			return '<div class="item"><div><strong>'+time.getDate()+' '+krRTRC_Months[time.getMonth()]+'</strong></div></div>';
		}
	}
 
	function krRTRC_BuildItem(type,title,rcid,revid,old_revid,user,timestamp,comment,patrolled,anon,oldlen,newlen,logtype){
 
		// Get size difference in bytes (can be negative, zero or positive)
		diffsize = (+newlen) - (+oldlen);
 
		//patrolled-var is empty string if edit is patrolled, else undefined
		patrolled = patrolled === '' ? true : false;
 
		//anon-var is empty string if edit is by anon, else undefined
		anon = anon === '' ? true : false;
 
		// typeSymbol, diffLink & itemClass
		var typeSymbol = "&nbsp;";
		var itemClass = "";
		var diffLink = krRTRC_IntMsgs.diff;
		if (type == 'edit'){
 
			if (krRTRC_Patrolright === true && krRTRC_optFiltPatrol == 'on'){
				typeSymbol = '<span class="unpatrolled">!</span>';
			} else if (krRTRC_Patrolright === true && patrolled === false){
				typeSymbol = '<span class="unpatrolled">!</span>';
			}
 
			itemClass = 'rcitem';
 
		} else if (type == 'new'){
 
			itemClass = 'rcitem';
 
			typeSymbol = '<span class="log">N</span>';
 
		} else if (type == 'log'){
 
			itemClass = 'rcitem';
 
			typeSymbol = '<span class="newpage">L</span>';
 
		} 
 
		// strip HTML from comment
		comment = comment.replace(/<&#91;^>&#93;*>/g, "");
 
		// Check if comment is AES
		if( comment.indexOf("[[COM:AES|←]]") === 0 ){
			itemClass += ' aes';
			comment = comment.replace("[[COM:AES|←]]", "← ");
		}
 
		// Anon-attribute
		if (anon){
			usertypeClass = ' anoncontrib';
		} else {
			usertypeClass = ' usercontrib';
		}
/*
	Example:
 
	<div class="item rcitem patrolled" diff="0" user="Abc">
		<div diff>(<a class="diff" diff="0" rcid="0" href="http://">diff</a>)</div>
		<div type><span class="unpatrolled">!</span></div>
		<div timetitle>00:00 <a href="http://?rcid=0" target="_blank">Abc</a></div>
		<div user><a class="user" href="http://User:Abc">Abc</a></div>
		<div other><a href="http://User talk:Abc">talk</a> / <a href="http://Special:Contributions/Abc">contribs</a>&nbsp;<span class="comment">Abc</span></div>
		<div size><span class="mw-plusminus-null">(0)</span></div>
	</div>
*/
		// build & return item
		var item = krRTRC_RCDayHead(krRTRC_APITimeConv(timestamp));
		item += '<div class="item '+itemClass+usertypeClass+'" diff="'+revid+'" rcid="'+rcid+'" user="'+user+'">';
 
		if (type == 'edit'){
			diffLink = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' ) + "?diff="+revid+"&oldif="+old_revid+"&rcid="+rcid;
			diffLink = '<a class="rcitemlink diff" diff="'+revid+'" rcid="'+rcid+'" href="'+diffLink+'">'+krRTRC_IntMsgs.diff+'</a>';
		} else if (type == 'log'){
			diffLink = '<a class="rcitemlink logPage" logtype="'+logtype+'">'+logtype+'</a>';
		}  else if (type == 'new'){
			diffLink = '<a class="rcitemlink newPage" rcid="'+rcid+'">Neu</a>';
		}
 
 
		item += '<div first>('+diffLink+') '+typeSymbol+' ';
		item += krRTRC_AdjustAPIClocktime(timestamp)+' <a class="page" href="'+krRTRC_WikiLink(title)+'?rcid='+rcid+'" target="_blank">'+title+'</a></div>';
		item += '<div user>&nbsp;<small>&middot;&nbsp;<a href="'+krRTRC_WikiLink("User talk:"+user)+'" target="_blank">D</a> &middot; <a href="'+krRTRC_WikiLink("Special:Contributions/"+user)+'" target="_blank">B</a>&nbsp;</small>&middot;&nbsp;<a class="user" href="'+krRTRC_WikiLink("User:"+user)+'" target="_blank">'+user+'</a></div>';
		item += '<div other>&nbsp;<span class="comment">'+krEncodeEntities(comment)+'</span></div>';
 
		if (diffsize > 0){
			el = diffsize > 399 ? "strong" : "span";
			item += '<div size><'+el+' class="mw-plusminus-pos">('+diffsize+')</'+el+'></div>';
		} else if (diffsize === 0){
			item += '<div size><span class="mw-plusminus-null">(0)</span></div>';
		} else {
			el = diffsize < -399 ? "strong" : "span";
			item += '<div size><'+el+' class="mw-plusminus-neg">('+diffsize+')</'+el+'></div>';
		}
 
		item += '</div>';
		return item;
	}
 
	function krRTRC_GetRCOptions(){
 
		krRTRC_optLimit = $("#rc-options-limit").val();
 
		krRTRC_optFiltAnon = $("#rc-options-filter-anons:checked").val();
		krRTRC_optRcshow = krRTRC_optFiltAnon == 'on' ? "|anon" : "";
 
		krRTRC_optFiltPatrol = $("#rc-options-filter-unpatrolled:checked").val();
		if (krRTRC_optFiltPatrol == 'on'){ krRTRC_optRcshow += "|!patrolled";
		}
 
		if (krRTRC_Patrolright === true){ krRTRC_optRcprop = "|patrolled";}
 
		krRTRC_optUser = $("#rc-options-rcuser").val() === '' ? false : krTrim($("#rc-options-rcuser").val());
		if (!krEmpty(krRTRC_optUser)){
			krRTRC_optUser = "&rcuser="+krRTRC_optUser;
		} else { krRTRC_optUser = ""; }
 
		krRTRC_optTypeEdit = $("#rc-options-type-edit:checked").val() == 'on' ? true : false;
		krRTRC_optTypeNewpage = $("#rc-options-type-newpage:checked").val() == 'on' ? true : false;
		krRTRC_optRctype = [];
		if (krRTRC_optTypeEdit){ krRTRC_optRctype.push('edit'); }
		if (krRTRC_optTypeNewpage){ krRTRC_optRctype.push('new'); }
		krRTRC_optRctype = krRTRC_optRctype.join("|");
 
		if (krRTRC_optRctype === ""){
			// If all of, enable all
			$("#rc-options-type-edit").click();
			$("#rc-options-type-newpage").click();
			krRTRC_optRctype = 'edit|new';
		}
 
		/* RCTITLES DISABLED:
		krRTRC_optPage = $("#rc-options-rctitle").val() === '' ? false : krTrim($("#rc-options-rctitle").val());
		if (!krEmpty(krRTRC_optPage)){
			krRTRC_optPage = "&rctitles="+krRTRC_optPage;
		} else { krRTRC_optPage = ""; }
		*/
 
		krRTRC_optFrom = krEmpty(krTrim($("#rc-options-timeframe-rcfrom").val())) ? false : krTrim($("#rc-options-timeframe-rcfrom").val());
		krRTRC_optUntill = krEmpty(krTrim($("#rc-options-timeframe-rcuntill").val())) ? false : krTrim($("#rc-options-timeframe-rcuntill").val());
 
		if (krRTRC_optOrder == 'older'){
			if ( krRTRC_isInt(parseInt(krRTRC_optUntill, 10)) && krRTRC_AdjustLongTime(krRTRC_optUntill) ){
				krRTRC_optRcstart = "&rcstart="+krRTRC_AdjustLongTime(krRTRC_optUntill);
			} else { krRTRC_optRcstart = "";}
			if ( krRTRC_isInt(parseInt(krRTRC_optFrom, 10)) && krRTRC_AdjustLongTime(krRTRC_optFrom) ){
				krRTRC_optRcend = "&rcend="+krRTRC_AdjustLongTime(krRTRC_optFrom);
			} else { krRTRC_optRcend = "";}
		} else if (krRTRC_optOrder == 'newer'){
			if ( krRTRC_isInt(parseInt(krRTRC_optFrom, 10)) && krRTRC_AdjustLongTime(krRTRC_optFrom) ){
				krRTRC_optRcstart = "&rcstart="+krRTRC_AdjustLongTime(krRTRC_optFrom);
			} else { krRTRC_optRcstart = "";}
			if ( krRTRC_isInt(parseInt(krRTRC_optUntill, 10)) && krRTRC_AdjustLongTime(krRTRC_optUntill)){
				krRTRC_optRcend = "&rcend="+krRTRC_AdjustLongTime(krRTRC_optUntill);
			} else { krRTRC_optRcend = "";}
		}
 
		krRTRC_optNS = $("#rc-options-namespace").val();
 
		krRTRC_optRcdir = $("input[name='rc-options-rcdir']:checked").val();
		krRTRC_optOrder = krRTRC_optRcdir == 'asc' ? 'newer' : 'older';
 
		krRTRC_optRInt = parseInt($("#rc-options-interval").val(), 10)*1000;
 
		krRTRC_optIRCBL = $("#rc-options-ircbl:checked").val() == 'on' ? true : false;
 
		krRTRC_optAutoDiff = $("#rc-options-autodiff").val();
		krRTRC_AutoDiff = krRTRC_optAutoDiff == 'On' ? true : false;
		krRTRC_optAutoDiffTop = $("#rc-options-autodiff-top:checked").val();
		krRTRC_AutoDiffTop = krRTRC_optAutoDiffTop == 'on' ? true : false;
 
		krRTRC_RCDataURL = krRTRC_APIURL+"?action=query&format=xml&list=recentchanges"+krRTRC_optUser+""+krRTRC_optPage+"&rctype="+krRTRC_optRctype+"|log&rcshow=!bot"+krRTRC_optRcshow+"&rcprop=flags|timestamp|user|title|comment|sizes|ids"+krRTRC_optRcprop+"|loginfo&rcnamespace="+krRTRC_optNS+"&rclimit="+krRTRC_optLimit+"&rcdir="+krRTRC_optOrder+krRTRC_optRcstart+krRTRC_optRcend;
		return krRTRC_RCDataURL;
	}
 
	function krRTRC_RebindElements() { //called when the list is refreshed
 
		// Re-apply "skipped" and "patrolled" classes
		$("#krRTRC_RCOutput>.feed div.rcitem").each(function(){
 
			// Compare each diff-attribute to the array, if match mark item with the class
 
			if(krInArray($(this).attr("rcid"), krRTRC_SkipDiffs)){
				$(this).addClass("skipped");
			} else if(krInArray($(this).attr("rcid"), krRTRC_MarkPatrolCache)){
				$(this).addClass("patrolled");
			}
		});
 
		// The current diff in diff-view stays marked
		$("#krRTRC_RCOutput>.feed div[rcid="+window.currentDiffRcid+"]").addClass("indiff");
 
		// All http-links within the diff-view open in a new window
		$("#krRTRC_DiffFrame>table.diff a[href^=http://]").attr("target", "_blank");
 
	}
 
	function krRTRC_PushFrontend(){
		$("#krRTRC_RCOutput").removeClass("placeholder");
		$("#krRTRC_RCOutput>.feed").html(krRTRC_FeedMemHTML);
 
		krRTRC_RebindElements();// rebind elements
		krRTRC_DayHeadPrev = "";// reset day
		krRTRC_RCTimeout = setTimeout(krRTRC_Refresh, krRTRC_optRInt);
		$("#krRTRC_loader").hide();
	}
 
	function krRTRC_ApplyIRCBL(){ if (krRTRC_Updating === true){ // Only run if there's an update going on
		krRTRC_FeedMemUidArr = [];
 
		$(krRTRC_FeedMemHTML).find("div.item").each(function(index, el){
			krRTRC_FeedMemUidArr.push($(el).attr("user"));
		});
		krRTRC_FeedMemUidArr.shift();
 
		try { // Parsing json could cause fatal error if url is not HTTP 200 OK (ie. HTTP 404 Error)
		$.ajax({
			url: "http://toolserver.org/~krinkle/CVN/API/?raw=0&format=json&uid="+krRTRC_FeedMemUidArr.join("|")+"&jsoncallback=?",
			timeout: 500,
			dataType: 'json',
			success: function(data){
 
				// If none of the users appear in the database at all, then data.users is null
				if(data.users){
 
					// Loop through all users
					$.each(data.users, function(i, val){ // i=username, val=object
 
						// Only if blacklisted, otherwise dont highlight
						if(val.usertype == 'bl'){
 
							var tooltip = "";
 
							// Get blacklist reason
							if(val.reason){ tooltip += krRTRC_Msg('reason')+': '+val.reason+". ";
							} else { tooltip += krRTRC_Msg('noreasonfound'); }
 
							// Get blacklist adder
							if(val.adder){ tooltip += krRTRC_Msg('adder')+": "+val.adder;
							} else { tooltip += krRTRC_Msg('adder')+": "+krRTRC_Msg('unknown'); }
 
							// Apply blacklisted-class, and insert icon with tooltip
							krRTRC_FeedMemHTML = $("<div>"+krRTRC_FeedMemHTML+"</div>").find("div.item[user="+i+"] .user").addClass("blacklisted").prepend('<img src="'+krRTRC_BliconSRC+'" alt="" title="'+tooltip+'" />').attr("title", tooltip).end().html();
						}
 
					});
				}
 
				// Either way, push the feed to the frontend
				krRTRC_PushFrontend();
				$("#krRTRC_RCOutput>.feed").append('<small id="krRTRC_Dumpdate">CVN DB '+krRTRC_Msg('lastupdate')+': '+data.dumpdate+' (UTC)</small>');
				krRTRC_Updating = false;
			},
			error: function(data, txtstatus, error){ // Ignore errors, just push to frontend
				krRTRC_PushFrontend();
				krRTRC_Updating = false;
			}
		});
		} catch(e){ // Ignore errors, just push to frontend
			krRTRC_PushFrontend();
			krRTRC_Updating = false;
		}
 
	} }
 
	function krRTRC_Refresh(){
		if(krRTRC_RCEnabled === true & krRTRC_Updating === false){
 
			// Indicate updating
			$("#krRTRC_loader").show();
			krRTRC_Updating = true;
			// Download recent changes
			$.ajax({
				type: "GET",
				url: krRTRC_RCDataURL,
				dataType: "xml",
				success: function(rawback){
 
					// Last-update heading
						// Get current time + localtime adjustment
							lastupdate = new Date();
							msd = krRTRC_TimeDiff*60*1000;
							lastupdate.setTime(lastupdate.getTime()+msd);
						krRTRC_FeedMemHTML = '<div id="krRTRC_lastupdate">'+krRTRC_Msg('lastupdate')+': '+lastupdate.toUTCString()+' | <a href="'+krRTRC_GeneratePermalink()+'">'+krRTRC_Msg('permalinktext')+'</a></div>';
 
					// API errors ?
					if( $(rawback).find('error').length > 0 ){
 
						krLog("krRTRC_GetRCData()-> "+$(rawback).find('rc').length+" errors");
						$("#krRTRC_RCOutput").removeClass("placeholder");
 
						// Account doesnt have patrol flag
						if($(rawback).find('error').attr("code") == "rcpermissiondenied"){
							krRTRC_FeedMemHTML += '<h3>Downloading recent changes failed</h3><p>Please untick the "Unpatrolled only"-checkbox or request the Patroller-right on <a href="'+mw.config.get( 'wgServer' )+'">'+mw.config.get( 'wgServer' )+'</a>';
 
						// Other error
						} else {
 
							krRTRC_FeedMemHTML += '<h3>Downloading recent changes failed</h3><p>Please check the settings above and try again. If you believe this is a bug, please <a href="http://meta.wikimedia.org/w/index.php?title=User_talk:Krinkle/Tools&action=edit&section=new&editintro=User_talk:Krinkle/Tools/Editnotice&preload=User_talk:Krinkle/Tools/Preload" target="_blank"><strong>let me know</strong></a>.';
						}
						krRTRC_PushFrontend();
						krRTRC_Updating = false;
 
					// Everything is OK - with results
					} else if( $(rawback).find('rc').length > 0 ){
 
						var htmloutput = '<div id="krRTRC_list">';
						$(rawback).find('rc').each(function(i){
							htmloutput += krRTRC_BuildItem($(this).attr("type"),$(this).attr("title"),$(this).attr("rcid"),$(this).attr("revid"),$(this).attr("old_revid"),$(this).attr("user"),$(this).attr("timestamp"),$(this).attr("comment"),$(this).attr("patrolled"),$(this).attr("anon"),$(this).attr("oldlen"),$(this).attr("newlen"),$(this).attr("logtype"));
						});
						krRTRC_FeedMemHTML += htmloutput+"</div>";
						if(krRTRC_optIRCBL===true){
							krRTRC_ApplyIRCBL();
							//krRTRC_Updating is set to false within krRTRC_ApplyIRCBL()
						} else {
							krRTRC_PushFrontend();
							krRTRC_Updating = false;
						}
 
					// Everything is OK - no results
					} else {
						krRTRC_FeedMemHTML += '<strong><em>'+krRTRC_Msg('nomatches')+'</em></strong>';
						krRTRC_PushFrontend();
						krRTRC_Updating = false;
					}
 
					$RCOptions_submit.removeAttr("disabled").css("opacity","1.0");
				}
 
			});
		}
	}
 
	function krRTRC_hardRefresh(){
 
		krRTRC_RCEnabled = true;
		$("#krRTRC_toggleRefresh").val("Aus").removeClass("button-on");
		var x = krRTRC_GetRCOptions();
		clearTimeout(krRTRC_RCTimeout);
		krRTRC_Refresh();
 
	}
 
	// Checks the GET-parameters and manipulates #krRTRC_RCOptions
	// Also initiates jumpstart
	function krRTRC_ProcesPermalink(l){
		var get = krGetUrlParam('rclimit',l);
			$("#rc-options-limit option[value="+get+"]").attr("selected", "selected");
		get = krGetUrlParam('rcshow_anon',l);
			if (get=="on"){ $("#rc-options-filter-anons").attr("checked", "checked");}
		get = krGetUrlParam('rcshow_patrol',l);
			if (get=="on"){ $("#rc-options-filter-unpatrolled").attr("checked", "checked");}
		get = krGetUrlParam('rcuser',l);
			$("#rc-options-rcuser").val(get);
		get = krGetUrlParam('typeedit',l);
			if (get=="off"){ $("#rc-options-type-edit").removeAttr("checked");}
		get = krGetUrlParam('typenewpage',l);
			if (get=="off"){ $("#rc-options-type-newpage").removeAttr("checked");}
		/* RCTITLES DISABLED:
		get = krGetUrlParam('rctitles',l);
		$("#rc-options-rctitle").val(get);
		*/		
		get = krGetUrlParam('rcfrom',l);
			$("#rc-options-timeframe-rcfrom").val(get);
		get = krGetUrlParam('rcuntill',l);
			$("#rc-options-timeframe-rcuntill").val(get);
		get = krGetUrlParam('rcnamespace', l);//krRTRC_optNS
			$("#rc-options-namespace option[value="+get+"]").attr("selected", "selected");
		get = krGetUrlParam('rcdir',l);
			if (get=="asc"){
				$("#krRTRC_RCOptions input[name=rc-options-rcdir][value=asc]").attr("checked", "checked");
				$("#krRTRC_RCOptions input[name=rc-options-rcdir][value=desc]").removeAttr("checked");
			}		
		get = krGetUrlParam('ajaxint',l);
			if (get !== "" && get !== " " && get !== null && get !== false){ $("#rc-options-interval").val(get);}
		get = krGetUrlParam('ircbl',l);
			if (get=="on"){ $("#rc-options-ircbl").attr("checked", "checked");}
		get = krGetUrlParam('autodiff');
			if (get=="on"){ $("#rc-options-autodiff").val("An").addClass("button-on");}
		get = krGetUrlParam('autodiff_top',l);
			if (get=="on"){ $("#rc-options-autodiff-top").attr("checked", "checked");}
		get = krGetUrlParam('jumpstart',l);
			if (get=="on"){ get = krRTRC_GetRCOptions(); krRTRC_hardRefresh(); /* EXPERIMENTAL: krRTRC_RefreshWhois();*/ window.location.hash = '';window.location.hash = 'toggleHelp'; }
	}
 
	// Checks the settings and returns a the permalink that would reproduce these settings manipulates #krRTRC_RCOptions
	function krRTRC_GeneratePermalink(){
	var a = '&rclimit='+krRTRC_optLimit;
		a += krRTRC_optFiltAnon == 'on' ? '&rcshow_anon=on' : '';
		a += krRTRC_optFiltPatrol == 'on' ? '&rcshow_patrol=on' : '';
		a += krRTRC_optUser ? krRTRC_optUser : '';
		a += krRTRC_optTypeEdit ? '' : '&typeedit=off';
		a += krRTRC_optTypeNewpage ? '' : '&typenewpage=off';
		a += krRTRC_optPage ? krRTRC_optPage : '';
		a += krRTRC_optFrom === false ? '' : '&rcfrom='+krRTRC_optFrom;
		a += krRTRC_optUntill === false ? '' : '&rcuntill='+krRTRC_optUntill;
		a += krRTRC_optNS === "" ? '' : '&rcnamespace='+krRTRC_optNS;
		a += '&rcdir=';
			a += krRTRC_optRcdir == 'asc' ? 'asc' : 'desc';
		a += Math.round(krRTRC_optRInt/1000) !== 3 ? '&ajaxint='+Math.round(krRTRC_optRInt/1000) : '';
		a += krRTRC_optIRCBL ? '&ircbl=on' : '';
		a += krRTRC_AutoDiff ? '&autodiff=on' : '';
		a += krRTRC_AutoDiffTop ? '&autodiff_top=on' : '';
		return mw.config.get( 'wgServer' )+mw.config.get( 'wgScript' )+"?title="+mw.config.get( 'wgPageName' )+a+'&jumpstart=on';
	}
 
	function krRTRC_NextDiff() {
		var $lis = $("#krRTRC_RCOutput>.feed div.rcitem:not(.indiff,.patrolled,.skipped)");
		if(krRTRC_AutoDiffTop === true) {
			$lis.eq(0).find("a.rcitemlink").click();
		} else {
			// eq(-1) doesn't work somehow..
			$lis.eq($lis.length-1).find(" a.rcitemlink").click();
		}
	}
 
	function krRTRC_TipIn($targetEl, uid, is_anon){
		krLog("krRTRC_TipIn()");
		var o = $targetEl.offset();
		if(is_anon){
			links = ' · <a target="_blank" title="Whois '+uid+'?" href="http://toolserver.org/~chm/whois.php?ip='+uid+'">WHOIS</a>';				
		} else {
			links = '';
		}
		//links += ' · <a target="_blank" title="View cross-wiki contributions" href="http://toolserver.org/~luxo/contributions/contributions.php?user='+uid+'&blocks=true">CrossWiki</a>';
		if(krRTRC_Delhistright === true){
			links += ' · <a target="_blank" title="View deleted contributions" href="'+krRTRC_WikiLink('Special:DeletedContributions/'+uid)+'">Bestattete Beiträge</a>'; 
		}
		$krRTRC_Tiptext.html('<a id="krRTRC_Tip_FilterAdd" onclick="$(\'#rc-options-rcuser\').val(\''+uid+'\'); $RCOptions_submit.click();" uid="'+uid+'" title="Filter by '+uid+'">[+<small>filter</small>]</a>'+links);
		$krRTRC_Tip.css({"left" : o.left+"px", "top" : (o.top-23)+"px", "display" : "block"/*, "width" : $krRTRC_Tiptext.width()+"px"*/}).fadeIn('fast');
		window.krRTRC_TipTime = setTimeout(krRTRC_TipOut,9000);
	}
 
	function krRTRC_TipOut(){
		if(typeof krRTRC_TipTime !== 'undefined'){
			clearTimeout(krRTRC_TipTime);
		}
		$krRTRC_Tip.fadeOut();
	}
 
	function krRTRC_RefreshWhois(){
 
		$.ajax({
			type: "GET",
			url: "http://secure.grizzdesign.nl/RTRC-whoisonline.php?wiki_user=" + encodeURIComponent(mw.config.get( 'wgUserName' ) + "@" + krRTRC_WikiID) + "&rtrc_hideme=0&rtrc_url=" + encodeURIComponent(window.location.href) + "&debug=0&jsoncallback=?",
			timeout: 500,
			dataType: 'json',
			success: function(data){
				krLog("Whosonline data",data);
				$("#krwhosonline").html(data);
			}
		}); 
 
 
	}
 
	function krRTRC_ToggleMassPatrol(b){
		if(b === true){
			krRTRC_MassPatrol = true;
			$krRTRC_MassPatrol.val("An").addClass("button-on");
			$(".patrollink a").click();
		} else {
			krRTRC_MassPatrol = false;
			$krRTRC_MassPatrol.val("Aus").removeClass("button-on");
		}
 
	}
 
	function krRTRC_GetPatroltoken(){
		$.ajax({
			type: "GET",
			url: krRTRC_APIURL+"?action=query&format=xml&list=recentchanges&rctoken=patrol&rclimit=1&rctype=new", //added rctype=new because several wikis only do newpages, by getting all rcs changes are it'll return an edit and thus error instead of token. Unless there are wikis with RC-patrol but no NP-patrol (as supposed to both or the opposite), this will be just fine. If there are wikis without NP-patrol but with RC-patrol, we'll have to split up somewhere around here.
			dataType: "xml",
			success: function(rawback){
				krRTRC_Patroltoken = $(rawback).find('rc').attr("patroltoken");
				if(krRTRC_Patroltoken){
					krRTRC_Patroltoken = krRTRC_Patroltoken.replace("+","%2B").replace("\\","%5C");
				} else {
					krRTRC_Patroltoken = false;
				}
			}
		});
	}
 
	// Init Phase 1 : When the DOM is ready
	function krRTRC_init1(){
		krLog("Init Phase 1 started");
		while (krRTRC_initFuncs.length > 0) {
			(krRTRC_initFuncs.shift())();
		}
		krLog("Init Phase 1 done");
	}
 
	// Init Phase 2 : Called in GetIntMsgs()
	function krRTRC_init2(){
		krLog("Init Phase 2 started");
		while (krRTRC_initFuncs2.length > 0) {
				(krRTRC_initFuncs2.shift())();
		}
		krLog("Init Phase 2 done");
	}
 
 
/**
 * App Initiate Functions (Phase 1, pre IntMsg)
 * -------------------------------------------------
 */
	// CheckRights, GetPatrol, GetSiteinfo, GetIntMsg
	window.krRTRC_initFuncs = [];
 
	// function CheckRights()
	//
	// Checks the userrights of the current user via the API
	window.krRTRC_initFuncs[0] = function(){
		$.ajax({
			type: "GET",
			url: krRTRC_APIURL+"?action=query&meta=userinfo&uiprop=rights&format=xml",
			dataType: "xml",
			success: function(rawback){
				if ($(rawback).find("r:contains('patrol')").length > 0){
					$(rawback).find("r:contains('patrol')").each(function(){
						if ($(this).text() == 'patrol' && krRTRC_Patrolright === false){
							krRTRC_Patrolright = true;
						}
					});
				}
				if ($(rawback).find("r:contains('deletedhistory')").length > 0){
					$(rawback).find("r:contains('deletedhistory')").each(function(){
						if ($(this).text() == 'deletedhistory' && krRTRC_Delhistright === false){
							krRTRC_Delhistright = true;
						}
					});
				}
			}
		});
	};
 
	// function GetPatroltoken()
	//
	// Requests a patroltoken via the API
	window.krRTRC_initFuncs[1] = function(){
		krRTRC_GetPatroltoken();
	};
 
	// function GetSiteInfo()
	//
	// Downloads siteinfo via the API
	window.krRTRC_initFuncs[2] = function(){
		$.ajax({
			type: "GET",
			url: krRTRC_APIURL+"?action=query&meta=siteinfo&format=xml",
			dataType: "xml",
			success: function(rawback){
				krRTRC_TimeDiff = $(rawback).find('general').attr("timeoffset");
				krRTRC_WikiID = $(rawback).find('general').attr("wikiid");
				document.title = "RTRC: "+krRTRC_WikiID;
			}
		});
	};
 
	// function GetIntMsgs()
	//
	// Downloads interface messages via the API
	window.krRTRC_initFuncs[3] = function(){
 
		$.getJSON(krRTRC_APIURL+"?action=query&format=json&meta=allmessages&amlang="+mw.config.get( 'wgUserLanguage' )+"&ammessages=show|hide|ascending abbrev|descending abbrev|markaspatrolleddiff|markedaspatrolled|markedaspatrollederror|next|diff|talkpagelinktext|contributions|recentchanges-label-legend|recentchanges-label-bot|recentchanges-label-minor|recentchanges-label-newpage|recentchanges-label-unpatrolled|recentchanges-legend-bot|recentchanges-legend-minor|recentchanges-legend-newpage|recentchanges-legend-unpatrolled|namespaces|namespacesall|blanknamespace&callback=?", function(data) {
			krLog("GetIntMsgs->"+data); krLog(data);
			data = data.query.allmessages;
			for(i = 0; i < data.length; i++){
				krRTRC_IntMsgs[data[i].name] = data[i]['*'];
			}
 
			// Interface messages ready, excecute init phase 2
			krRTRC_init2();
		});
	};
 
/**
 * App Initiate Functions (Phase 2, post IntMsg)
 * -------------------------------------------------
 */
	// Buildpage, ProcesPermalink, Bindevent
	window.krRTRC_initFuncs2 = [];
 
	// function BuildPage()
	//
	// Prepares the page
	window.krRTRC_initFuncs2[0] = function(){
		$("#p-namespaces>ul>li").removeClass("new").find(">a>span").eq(0).html("Tool");
		$("#ca-talk").removeClass("new").find(">a").attr("href", "http://kamelopedia.mormo.org/index.php?title=Kamel_Diskussion:Nachteule&action=edit&section=new&preloadtitle=RTRC-Feedback").attr("target", "_blank").find(">span").html("Feedback");
		$("#footer").remove();
		$("#content").addClass("krRTRC_body");
		krRTRC_RCLegendHTML = '<div id="krRTRC_RCLegend">Farben: <div class="item patrolled inline-block">&nbsp;'+krRTRC_IntMsgs.markedaspatrolled+'&nbsp;</div>, <div class="item indiff inline-block">&nbsp;'+krRTRC_Msg('currentedit')+'&nbsp;</div>, <div class="item skipped inline-block">&nbsp;'+krRTRC_Msg('skippededit')+'&nbsp;</div>, <div class="item aes inline-block">&nbsp;Edit with an Automatic Edit Summary&nbsp;</div><br />'+krRTRC_Msg('abbreviations')+': D - '+krRTRC_IntMsgs.talkpagelinktext+', B - '+krRTRC_IntMsgs.contributions+'</div>';
		krRTRC_RCNamespaceDropdown = '<select id="rc-options-namespace" name="rc-options-namespace">';
		krRTRC_RCNamespaceDropdown += '<option value>'+krRTRC_IntMsgs.namespacesall+'</option>';
		krRTRC_RCNamespaceDropdown += '<option value="0">'+krRTRC_IntMsgs.blanknamespace+'</option>';
 
		for(var ns in mw.config.get( 'wgFormattedNamespaces' )){
			if(ns > 0){ krRTRC_RCNamespaceDropdown += '<option value="'+ns+'">'+mw.config.get( 'wgFormattedNamespaces' )[ns]+'</option>'; }
		} krRTRC_RCNamespaceDropdown += '</select>';
		$("#content").html(
		'<div id="content-inner"><div id="krRTRC_PageWrap" class="plainlinks">' +
			'<div id="krRTRC_Topbar">Letzte Änderungen in luxuriös und Echtzeit <small class="ns">('+krRTRC_appVersion+')</small><small id="toggleHelp">[Hilfe]</small></div>' +
			'<div id="krRTRC_RCForm"><fieldset id="krRTRC_RCOptions" class="nohelp"><form>' +
				'<div class="panel"><label for="rc-options-limit" class="head">'+krRTRC_Msg('limit')+'</label><select id="rc-options-limit" name="rc-options-limit"><option value="10">10</option><option selected="" value="25">25</option><option value="50">50</option><option value="75">75</option><option value="100">100</option></select></div>' +
				'<div class="sep"></div>' +
				'<div class="panel"><label class="head">'+krRTRC_Msg('filter')+'</label><div style="text-align:left"><input type="checkbox" value="on" id="rc-options-filter-anons" name="rc-options-filter-anons"><label for="rc-options-filter-anons"> '+krRTRC_Msg('anononly')+'</label><br /><input type="checkbox" value="on" id="rc-options-filter-unpatrolled" name="rc-options-filter-unpatrolled"><label for="rc-options-filter-unpatrolled"> '+krRTRC_Msg('unpatrolledonly')+'</label></div></div>' +
				'<div class="sep"></div>' +
				'<div class="panel"><label for="rc-options-rcuser" class="head">'+krRTRC_Msg('userfilter-opt')+' <span section="Userfilter" class="helpicon"></span></label><div style="text-align:center"><input type="text" value="" size="16" id="rc-options-rcuser" name="rc-options-rcuser" /><br /><input class="button" type="button" id="RCOptions_RcuserClr" value="'+krRTRC_Msg('clear')+'" /></div></div>' +
				'<div class="sep"></div>' +
				'<div class="panel"><label class="head">'+krRTRC_Msg('type')+'</label><div style="text-align:left"><input type="checkbox" value="on" id="rc-options-type-edit" name="rc-options-type-edit" checked="checked"><label for="rc-options-type-edit"> '+krRTRC_Msg('edits')+'</label><br /><input type="checkbox" checked="checked" value="on" id="rc-options-type-newpage" name="rc-options-type-newpage"><label for="rc-options-type-newpage"> '+krRTRC_Msg('newpages')+'</label></div></div>' +
				'<div class="sep"></div>' +
				// RCTITLES DISABLED: https://bugzilla.wikimedia.org/show_bug.cgi?id=12394#c5
				// '<div class="panel"><label class="head" for="rc-options-rctitle">'+krRTRC_Msg('pagefilter-opt')+' <span section="Pagefilter" class="helpicon"></span></label><div style="text-align:center"><input type="text" value="" size="16" id="rc-options-rctitle" name="rc-options-rctitle" /><br /><input class="button" type="button" id="RCOptions_RctitleClr" value="'+krRTRC_Msg('clear')+'" /></div></div>' +
				//'<div class="sep"></div>' +
				'<div class="panel"><label class="head">'+krRTRC_Msg('timeframe-opt')+' <span section="Timeframe" class="helpicon"></span></label><div style="text-align:right"><label for="rc-options-timeframe-rcfrom">'+krRTRC_Msg('from')+': </label><input type="text" value="" size="14" id="rc-options-timeframe-rcfrom" name="rc-options-timeframe-rcfrom"><br /><label for="rc-options-timeframe-rcuntill">'+krRTRC_Msg('untill')+': </label><input type="text" value="" size="14" id="rc-options-timeframe-rcuntill" name="rc-options-timeframe-rcuntill"></div></div>' +
				'<div class="sep"></div>' +
				'<div class="panel"><label for="rc-options-namespace" class="head">'+krRTRC_IntMsgs.namespaces+'</label>'+krRTRC_RCNamespaceDropdown+'</div>' +
				'<div class="sep"></div>' +
				'<div class="panel"><label class="head">'+krRTRC_Msg('order')+' <br /><span section="Order" class="helpicon"></span></label><div style="text-align:left"><input type="radio" name="rc-options-rcdir" value="asc"> '+krRTRC_Msg('asc')+' <br /><input type="radio" name="rc-options-rcdir" value="desc" checked="checked"> '+krRTRC_Msg('desc')+' </div></div>' +
				'<div class="sep"></div>' +
				'<div class="panel"><label for="rc-options-interval" class="head">R <br /><span section="Reload_Interval" class="helpicon"></span></label><input type="text" value="3" size="1" id="rc-options-interval" name="rc-options-interval"></div>' +
				'<div class="sep"></div>' +
				'<div class="panel"><label class="head" for="rc-options-ircbl">IRCBL<br /><span section="IRC_Blacklist" class="helpicon"></span></label><input type="checkbox" value="on" size id="rc-options-ircbl" name="rc-options-ircbl" /></div>' +
				'<div class="sep"></div>' +
				'<div class="panel panel-last"><input class="button" type="button" id="RCOptions_submit" value="'+krRTRC_Msg('apply')+'" /></div>' +
				//'<hr style="clear:both" />' +
				//'<div class="panel2"><label for="krRTRC_MassPatrol" class="head">MassPatrol <span section="MassPatrol" class="helpicon"></span></label><input id="krRTRC_MassPatrol" class="button button-off" type="button" value="Aus" /></div>' +
				//'<div class="sep2"></div>' +
				//'<div class="panel2"><label for="rc-options-autodiff" class="head">AutoDiff <span section="AutoDiff" class="helpicon"></span></label><input type="button" class="button button-off" value="Aus" id="rc-options-autodiff" /> <input type="checkbox" value="on" id="rc-options-autodiff-top" /> <label for="rc-options-autodiff-top"> '+krRTRC_Msg('loadfromtop')+'</label></div>' +
			//	'<div class="sep2"></div>' +
			//	'<div class="panel2"><label for="krRTRC_toggleRefresh" class="head">Pause</label><input id="krRTRC_toggleRefresh" class="button button-off" type="button" value="Aus" /></div>' +
			'</fieldset></form></div>' +
			'<a name="krRTRC_DiffTop" />' +
			'<div id="krRTRC_DiffFrame" style="display:none"></div>' +
			'<div id="krRTRC_RCOutput" class="placeholder">'+krRTRC_RCLegendHTML+'</div>' +
			'<div style="clear:both"></div>' );//+
			//'<div id="krRTRC_Footer"><div class="inside">' +
			//	'<span style="float:left"><a href="http://meta.wikimedia.org/wiki/User:Krinkle/Tools/Real-Time_Recent_Changes" class="external text" rel="nofollow">'+krRTRC_Msg('documentation')+'</a></span>' +
			//	'Real-Time Recent Changes by <a href="http://commons.wikimedia.org/wiki/User:Krinkle" class="external text" rel="nofollow">Krinkle</a> is licensed under a <a href="http://creativecommons.org/licenses/by-sa/3.0" class="external text" rel="nofollow">Creative Commons Attribution-Share Alike 3.0 Unported License</a>.' +
				//'<span style="float:right"><a href="http://meta.wikimedia.org/wiki/User:Krinkle/Tools/Real-Time_Recent_Changes#Changelog" id="krwhosonline" class="external text" rel="nofollow">'+krRTRC_Msg('whatsnew')+'</a></span>' +
			//'</div></div>');
		$("body").append("<div id='krRTRC_Tip'><span id='krRTRC_Tiptext'></span></div>");
 
		$("#content-inner").css("position", "relative");
		$("#krRTRC_RCOutput").prepend('<div class="feed"></div><img src="'+krRTRC_LoaderSRC+'" id="krRTRC_loader" style="display:none" />');
 
		//EXPERIMENTAL
		//$('<div class="sep2"></div><div class="errorbox"><b>Experimental:</b> <a href="javascript:krRTRC_RefreshWhois()">Refresh WhoisOnline</a> | ...</div>').appendTo("#krRTRC_RCOptions > form");
	};
 
	// function ProcesPermalink()
	window.krRTRC_initFuncs2[1] = function(){
		krRTRC_ProcesPermalink();
	};
 
	// function Bindevents()
	//
	// Binds events to the user interface
	window.krRTRC_initFuncs2[2] = function(){
 
		$RCOptions_submit = $("#RCOptions_submit");
 
		// Apply button
		$RCOptions_submit.click(function(){
			$RCOptions_submit.attr("disabled", "disabled").css("opacity","0.5");
			a = krRTRC_GetRCOptions();
			krRTRC_hardRefresh();
			return false;
		});
 
		// Close Diff
		$("#diffClose").live("click", function(){
			$("#krRTRC_DiffFrame").fadeOut('fast');
		});
 
		// Load diffview on (diff)-link click
		window.currentDiff = "unknown";
		window.currentDiffRcid = "unknown";
		$("a.diff").live("click", function() {
			window.currentDiff = $(this).attr("diff");
			window.currentDiffRcid = $(this).attr("rcid");
			var title = $(this).parent().find(">a.page").text();
			var href = $(this).parent().find(">a.diff").attr('href');
			$("#krRTRC_DiffFrame").removeAttr('style'/* this resets style="max-height:400" from a.newPage below */).load(mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' ) + '?action=render&diff='+window.currentDiff+'&diffonly=1&uselang='+mw.config.get( 'wgUserLanguage' ), function() {
				$(this).html($(this).html().replace("diffonly=", "krinkle=").replace("diffonly=", "krinkle="));
				if (krInArray(window.currentDiffRcid, krRTRC_SkipDiffs)){
					krRTRC_SkipButon = '<span class="tab"><a id="diffUnskip">Un-Überspringen</a></span>';
				} else {
					krRTRC_SkipButon = '<span class="tab"><a id="diffSkip">Überspringen</a></span>';
				}
			$("#krRTRC_DiffFrame").fadeIn().prepend('<h3>'+title+'</h3><div id="krRTRC_DiffTools"><span class="tab"><a id="diffClose">X</a></span><span class="tab"><a href="'+href+'" target="_blank" id="diffNewWindow">In neuem Tab öffnen</a></span>' + 
			( krRTRC_Patroltoken ? '<span class="tab"><a onclick="(function(){ if($(\'.patrollink a\').length){ $(\'.patrollink a\').click(); } else { $(\'#diffSkip\').click(); } })();">[Markieren]</a></span>' : '' ) +
			'<span class="tab"><a id="diffNext">'+krRTRC_IntMsgs.next.ucFirst()+' &raquo;</a></span>'+krRTRC_SkipButon+'</div>');
 
				if(krRTRC_MassPatrol === true){
					$(".patrollink a").click();
				}
 
				$("#krRTRC_RCOutput>.feed div.indiff").removeClass("indiff");
				krRTRC_RebindElements();
			});
			return false;
		});
		$("a.newPage").live("click", function() {
			window.currentDiffRcid = $(this).attr("rcid");
			var title = $(this).parent().find(">a.page").text();
			var href = $(this).parent().find(">a.page").attr('href');
			$("#krRTRC_DiffFrame").css("max-height", "400px").load(href + '&action=render&uselang='+mw.config.get( 'wgUserLanguage' ), function(){
				if (krInArray(window.currentDiffRcid, krRTRC_SkipDiffs)){
					krRTRC_SkipButon = '<span class="tab"><a id="diffUnskip">Unskip</a></span>';
				} else {
					krRTRC_SkipButon = '<span class="tab"><a id="diffSkip">Skip</a></span>';
				}
				$("#krRTRC_DiffFrame").fadeIn().prepend('<h3>'+title+'</h3><div id="krRTRC_DiffTools"><span class="tab"><a id="diffClose">X</a></span><span class="tab"><a href="'+href+'" target="_blank" id="diffNewWindow">Open in Wiki</a></span><span class="tab"><a onclick="$(\'.patrollink a\').click()">[mark]</a></span><span class="tab"><a id="diffNext">'+krRTRC_IntMsgs.next.ucFirst()+' &raquo;</a></span>'+krRTRC_SkipButon+'</div>');
				if(krRTRC_MassPatrol === true){
					$(".patrollink a").click();
				}
				$("#krRTRC_RCOutput>.feed div.indiff").removeClass("indiff");
				krRTRC_RebindElements();
			});
			return false;
		});
 
		// Mark as patrolled
		$(".patrollink").live("click", function(){
			$(".patrollink>a").html(krRTRC_IntMsgs.markaspatrolleddiff+'...');
			$.ajax({
				type: "GET",
				url: krRTRC_APIURL+'?action=patrol&format=xml&list=recentchanges&rcid='+currentDiffRcid+'&token='+krRTRC_Patroltoken,
				dataType: "xml",
				success: function(rawback){
					if( $(rawback).find('error').length > 0 ){
						$(".patrollink").html('<span style="color:red">'+krRTRC_IntMsgs.markedaspatrollederror+'</span>');
						krLog("PatrolError: "+$(rawback).find('error').attr("code")+"; info: "+$(rawback).find('error').attr("info"));
					} else {
						$(".patrollink").html('<span style="color:green">'+krRTRC_IntMsgs.markedaspatrolled+'</span>');
						$("#krRTRC_RCOutput>.feed div[rcid="+window.currentDiffRcid+"]").addClass("patrolled");
 
						// Patrolling/Refreshing sometimes overlap eachother causing patrolled edits to show up in an 'unpatrolled only' feed.
						// Make sure that any patrolled edits stay marked as such to prevent AutoDiff from picking a patrolled edit
						// See also krRTRC_RebindElements()
						krRTRC_MarkPatrolCache.push(window.currentDiffRcid);
 
						while(krRTRC_MarkPatrolCache.length > krRTRC_MarkPatrolCacheMax){
							krLog('MarkPatrolCache -> Cache array is bigger then cachemax, shifting array('+krRTRC_MarkPatrolCache.length+' vs. '+krRTRC_MarkPatrolCacheMax+'). Current array:');
							krLog(krRTRC_MarkPatrolCache);
							krRTRC_MarkPatrolCache.shift();
							krLog('MarkPatrolCache -> Cache array is shifted. New array:');
							krLog(krRTRC_MarkPatrolCache);
						}
 
						if (krRTRC_AutoDiff === true) { krRTRC_NextDiff();}
					}
				},
				error: function(){
					$(".patrollink").html('<span style="color:red">'+krRTRC_IntMsgs.markedaspatrollederror+'</span>');
				}
			});
			return false;
		});
 
		// Trigger NextDiff
		$("#diffNext").live("click", function() {
			krRTRC_NextDiff();
		});
 
		// SkipDiff
		$("#diffSkip").live("click", function(){
			$("#krRTRC_RCOutput>.feed div[rcid="+window.currentDiffRcid+"]").addClass("skipped"); // Add class
			krRTRC_SkipDiffs.push(window.currentDiffRcid); // Add to array, to reAddClass after refresh in krRTRC_RebindElements
			krRTRC_NextDiff(); // Load next
		});
 
		// UnskipDiff
		$("#diffUnskip").live("click", function(){
			$('#krRTRC_RCOutput>.feed div[rcid='+window.currentDiffRcid+']').removeClass("skipped"); // Remove class
			krRTRC_SkipDiffs.splice(krRTRC_SkipDiffs.indexOf(window.currentDiffRcid), 1); // Remove from array, to no longer reAddClass after refresh
			//krRTRC_NextDiff(); // Load next ?
		});
 
		// Show helpicons
		$("#toggleHelp").live("click", function(){
			$("#krRTRC_RCOptions").toggleClass('nohelp');
		});
 
		// Link helpicons
		$("#krRTRC_RCForm .helpicon").attr("title", krRTRC_Msg('clickforinfo'));
		$("#krRTRC_RCForm .helpicon").live("click", function(){
			window.open(krRTRC_HelpURL+'#'+$(this).attr("section"), "_blank");
			return false;
		});
 
		// Clear rcuser-field
		// If MassPatrol is active, warn that clearing rcuser will automatically disable MassPatrol f
		$("#RCOptions_RcuserClr").live("click", function(){
			if(krRTRC_MassPatrol === true){
				var a = window.confirm(krRTRC_Msg('masspatrol_userfilterconfirm'));
				if(a){
					$("#rc-options-rcuser").val("");
					krRTRC_ToggleMassPatrol(false);
				}
			} else {
				$("#rc-options-rcuser").val("");
			}
			$RCOptions_submit.click();
		});
 
		// Clear rctitle-field
		/* RCTITLES DISABLED:
		$("#RCOptions_RctitleClr").live("click", function(){
			if(krRTRC_MassPatrol === true){
				var a = window.confirm(krRTRC_Msg('masspatrol_userfilterconfirm'));
				if(a){
					krRTRC_ToggleMassPatrol(false);
				}
			}
			$("#rc-options-rctitle").val("");
			$RCOptions_submit.click();
		});
		*/
 
		// Tip
		$krRTRC_Tip = $("#krRTRC_Tip");
		$krRTRC_Tiptext = $("#krRTRC_Tiptext");
		$("#krRTRC_Tip,#krRTRC_Tiptext").live("click", function(){
			krRTRC_TipOut();
		});
		$("#krRTRC_Tip,#krRTRC_Tiptext").live("mouseover", function(){
			clearTimeout(window.krRTRC_TipTime);
		});
		$("#krRTRC_Tip,#krRTRC_Tiptext").live("mouseleave", function(){
			window.krRTRC_TipTime = setTimeout(krRTRC_TipOut,9000);
		});
 
 
		// Mark as patrolled when rollbacking
		// Note: As of MediaWiki r(unknown) rollbacking does already automatically patrol all reverted revisions. But by doing it anyway it saves a click for the AutoDiff-users
		$(".mw-rollback-link a").live("click", function(){
			$(".patrollink a").click();
		});
 
		// Button: MassPatrol
		$krRTRC_MassPatrol = $("#krRTRC_MassPatrol");
		$krRTRC_MassPatrol.live("click", function(){
			if(krRTRC_MassPatrol === true){
				krRTRC_ToggleMassPatrol(false);
			} else if(krRTRC_AutoDiff === true) {
				krRTRC_ToggleMassPatrol(true);
			} else {
				var a = window.confirm(krRTRC_Msg('masspatrol_autodiffneeded'));
				if(a){
					krRTRC_AutoDiff = true;
					$("#rc-options-autodiff").val("An").addClass("button-on");
					krRTRC_ToggleMassPatrol(true);
				}
			}
		});
 
		// Button: AutoDiff
		$("#rc-options-autodiff").live("click", function(){
			if(krRTRC_AutoDiff === true){
				if(krRTRC_MassPatrol === true){
					var a = window.confirm(krRTRC_Msg('autodiff_masspatrolneeds'));
					if(a){
						$("#rc-options-autodiff").val("Aus").removeClass("button-on");
						krRTRC_AutoDiff = false;
						krRTRC_ToggleMassPatrol(false);
					}
				} else {
					$(this).val("Aus").removeClass("button-on");
					krRTRC_AutoDiff = false;
				}
			} else {
				$(this).val("An").addClass("button-on");
				krRTRC_AutoDiff = true;		
			}
		});
 
		// Checkbox: AutoDiff from top
		$("#rc-options-autodiff-top").live("click", function(){
			if(krRTRC_AutoDiffTop === true){
				$(this).removeAttr("checked");
				krRTRC_AutoDiffTop = false;
			} else {
				$(this).attr("checked", "checked");
				krRTRC_AutoDiffTop = true;		
			}
		});
 
		// Button: Pause
		$("#krRTRC_toggleRefresh").live("click", function(){
			krLog("#krRTRC_toggleRefresh clicked");
			if(krRTRC_RCEnabled === true){
				krRTRC_RCEnabled = false;
				$(this).val("An").addClass("button-on");
				clearTimeout(krRTRC_RCTimeout);
			} else if(krRTRC_RCEnabled === false){
				krRTRC_RCEnabled = true;
				$(this).val("Aus").removeClass("button-on");
				krRTRC_hardRefresh();
			} else {
				$(this).val("An").addClass("button-on");
				clearTimeout(krRTRC_RCTimeout);
			}
			return false;
		});
 
 
 
	};
 
/**
 * Fire it off when the DOM is ready...
 * -------------------------------------------------
 */
// If on the right page in the right action...
if( mw.config.get( 'wgPageName' )=="Kamelopedia:RTRC" && mw.config.get( 'wgAction' )=='view' && !krRTRC_Disabled ){
 
importStylesheetURI('http://kamelopedia.mormo.org/index.php?title=MediaWiki:Skin/Kamelopedia:RTRC.css&action=raw&ctype=text/css');
//importStylesheetURI('http://secure.grizzdesign.nl/RTRCdev.css');
importStylesheetURI('http://kamelopedia.mormo.org/skins/common/diff.css');
 
$(function(){
	if ( $("html").hasClass("msie") ){
		var s = "Internet Explorer wird nicht unterstützt. Bitte Firefox, Chrome oder Safari nutzen.";
		alert(s);
		$("<hr /><p style='color:red'>"+s+"</p>").insertBefore("#catlinks");
		return true;
	} else if ( $("html").hasClass("opera") ){
		alert("Opera wird nicht unterstützt. Auf eigens Risiko nutzen, oder Firefox, Chrome oder Safari nutzen.");
	}
	krRTRC_init1();
});
 
}//endif;