This is a demo for idle state notifier using prototype.js. Notifier is defined as a self containing class which fires state:active and state:idle custom events. You can read more about it in this post

let's see...
var Notifier = Class.create({
	
	_events: [[window, 'scroll'], [window, 'resize'], [document, 'mousemove'], [document, 'keydown']],
	_timer: null,
	_idleTime: null,
	
	initialize: function(time) {
		this.time = time;
		
		this.initObservers();
		this.setTimer();
	},
	
	initObservers: function() {
		this._events.each(function(e) {
			Event.observe(e[0], e[1], this.onInterrupt.bind(this))
		}.bind(this))
	},
	
	onInterrupt: function() {
		document.fire('state:active', { idleTime: new Date() - this._idleTime });
		this.setTimer();
	},
	
	setTimer: function() {
		clearTimeout(this._timer);
		this._idleTime = new Date();
		this._timer = setTimeout(function() {
			document.fire('state:idle');
		}, this.time)
	}
})

document.observe('dom:loaded', function() {
	
	new Notifier(2000);
	
	document.observe('state:idle', onIdle).observe('state:active', onActive);
	
	var p = $$('p')[0],
		info = $('info');
	
	function onIdle(e) {
		p.setOpacity(0.2);
		info.innerHTML = 'idled...'
	}
	function onActive(e) {
		p.setOpacity(1);
		info.innerHTML = 'active... after: ' + e.memo.idleTime + ' ms';
	}
})