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.
// When looking at a page in "User" or "User talk", the script will 
// display how long the user has been idle. Based almost entirely on:
/* ======================================================== *\
** StatusCheck - JavaScript User Online Status Checker
**   for Wikipedia
**
** Created by Alex Barley [[User:Ale_jrb]]
\* ======================================================== */


// the following settings are used in this script:
if (offlineAfter == null)	var offlineAfter 			= (15 * 60);	// number of seconds after which a user is considered offline (default: 15 * 60 seconds)
if (statCloseOnClick == null)	var statCloseOnClick 	= true;			// whether to close the status window when clicking on it
if (statPosition == null)	var statPosition = new Array(20, 600);		// position of the status window [left, top, right, bottom]
//main script
function statusCheck() {
	this.launch = function() {
		// launch helper. check whether there is a deletion tag on this page.
		if ((mw.config.get('wgNamespaceNumber') == 2) || (mw.config.get('wgNamespaceNumber') == 3) || (window.location.href.indexOf('Special:Contributions/') > -1)) {
			this.control	= new statusCheck_controller;
			this.control.runCheck();
		} else { return false; /* do nothing!*/ }
	}
}
 
function statusCheck_controller() {
	var statusCheck = this;
	if (mw.config.get('wgPageName') == 'Special:Contributions') {
		this.userName = window.location.href.substr(window.location.href.indexOf('Special:Contributions/') + 22).replace("&action=view","");
   
		if (this.userName == '') return false;
	} else {
		if (mw.config.get('wgTitle').indexOf('/') > -1) { this.userName = mw.config.get('wgTitle').substr(0, mw.config.get('wgTitle').indexOf('/')); } else { this.userName = mw.config.get('wgTitle'); }
	}
 
	this.runCheck = function(callback, value) {
		switch(callback) {
			default:
				statusCheck.interface = new wa_window();
				statusCheck.interface.win_left 		= statPosition[0];
				statusCheck.interface.win_top 		= statPosition[1];
				if (statPosition[2] != null)		statusCheck.interface.win_right = statPosition[2];
				if (statPosition[3] != null)		statusCheck.interface.win_bottom = statPosition[3];
				statusCheck.interface.win_width 	= 110;
				statusCheck.interface.win_height 	= 35;
 
				statusCheck.interface.win_bg		= '#dddddd';
				statusCheck.interface.win_bd		= '#aaaaaa';
				statusCheck.interface.win_bd_wd		= 1;
 
				statusCheck.interface.win_alpha 	= 0.75;				
 
				statusCheck.interface.win_pos 		= 'fixed';
 
				statusCheck.interface.win_content	= '<div style="width: 100px; margin: auto; margin-top: 2px; text-align: center; font-size: 1.15em;">Checking status...</div><div style="width: 100px; margin: auto; margin-top: 7px; text-align: center; font-size: 0.85em;">StatusCheck</div>';
 
				statusCheck.interface.applyAll();
 
				statusCheck.runCheck('1');
				break;
 
			case '1':
				statusCheck.user = new wa_mediawikiUser(this.userName);
				statusCheck.user.getUserContribs(1, function() { statusCheck.runCheck('2'); });
				break;
 
			case '2':
				statusCheck.user.getUserLogs(1, function() { statusCheck.runCheck('3'); });
				break;
 
			case '3':
				// regex extract data: [0] - year; [1] - month; [2] - day; [3] - hour; [4] - minutes; [5] - seconds
				var regTest = /([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z/;
				statusCheck.lastEdit = []; var tempCheck = [];
				tempCheck = regTest.exec(statusCheck.user.editDetails[0]['timestamp']);
				if (tempCheck != null) { statusCheck.lastEdit = tempCheck.slice(1); } else { statusCheck.lastEdit = false; }
 
				statusCheck.lastAction = []; var tempCheck2 = [];
				tempCheck2 = regTest.exec(statusCheck.user.logDetails[0]['timestamp']);
				if (tempCheck2 != null) { statusCheck.lastAction = tempCheck2.slice(1); } else { statusCheck.lastAction = false; }
 
				// convert both timestamps to seconds
				if (statusCheck.lastEdit != false) {
					var timeEdit = new Date();
					timeEdit.setFullYear(statusCheck.lastEdit[0], statusCheck.lastEdit[1] - 1, statusCheck.lastEdit[2]);
					timeEdit.setHours(statusCheck.lastEdit[3]);
					timeEdit.setMinutes(statusCheck.lastEdit[4]);
					timeEdit.setSeconds(statusCheck.lastEdit[5]);
					var lastEdit = (timeEdit.getTime() / 1000);
				} else { var lastEdit = 0; }
				if (statusCheck.lastAction != false) {
					var timeAction = new Date();
					timeAction.setFullYear(statusCheck.lastAction[0], statusCheck.lastAction[1] - 1, statusCheck.lastAction[2]);
					timeAction.setHours(statusCheck.lastAction[3]);
					timeAction.setMinutes(statusCheck.lastAction[4]);
					timeAction.setSeconds(statusCheck.lastAction[5]);
					var lastAction = (timeAction.getTime() / 1000);
				} else { var lastAction = 0; }
 
				var mostRecent = Math.max(lastAction, lastEdit);

				var currentTime = new Date();
				currentTime = ((currentTime.getTime() / 1000) + (currentTime.getTimezoneOffset() * 60));
				// build interface
                         
                                var seconds = currentTime - mostRecent;
                                var minutes = seconds / 60;
                                var hours = minutes / 60;                                
                                var days = hours / 24;
                                var toDisplay;
                                if(days > 1.0) {
                                  toDisplay = days.toFixed(0) + " days";
                                } else if(hours > 1.0) {
                                  toDisplay = hours.toFixed(0) + " hours";
                                } else if(minutes > 1.0) {
                                  toDisplay = minutes.toFixed(0) + " minutes";
                                } else {
                                  toDisplay = seconds + " seconds";
                                }

				statusCheck.runCheck('4', toDisplay);
				break;
 
			case '4':
					statusCheck.interface.win_bg		= '#bbddbb';
					statusCheck.interface.win_bd		= '#99cc99';
 
					statusCheck.interface.win_content	= '<div style="width: 100px; margin: auto; margin-top: 2px; text-align: center; font-size: 1.15em; color: #111111;">Idle ' + value + '</div><div style="width: 100px; margin: auto; margin-top: 7px; text-align: center; font-size: 0.85em;">StatusCheck</div>';

 				statusCheck.interface.win_alpha 	= 0.95;
				statusCheck.interface.win_cursor	= 'pointer';
				statusCheck.interface.win_func		= function() { statusCheck.interface.fade(0.3); };
				statusCheck.interface.applyAll();
				break;
		}
	}
}
 
 
 
// -- run program
function launchstatusCheck() {
	// lib proto
	wa_window.prototype = new wa_document;
	wa_element.prototype = new wa_document;
 
	// init object
	var obj_statusCheck = new statusCheck;
	obj_statusCheck.launch();
 
	return true;
}
 
importScript('User:Ale_jrb/Scripts/waLib.js');
$(launchstatusCheck);