Skip to content

Commit

Permalink
Idle timer using YU3
Browse files Browse the repository at this point in the history
  • Loading branch information
Nicholas C. Zakas committed May 31, 2009
1 parent f650ae8 commit afb7a12
Show file tree
Hide file tree
Showing 2 changed files with 176 additions and 0 deletions.
37 changes: 37 additions & 0 deletions idle-timer/idle-timer.htm
@@ -0,0 +1,37 @@
<html>
<head>
<title>Idle Timer Example</title>
<script type="text/javascript" src="http://yui.yahooapis.com/combo?3.0.0pr2/build/yui-base/yui-base-min.js&3.0.0pr2/build/oop/oop-min.js&3.0.0pr2/build/event/event-min.js&3.0.0pr2/build/dom/dom-base-min.js&3.0.0pr2/build/dom/selector-min.js&3.0.0pr2/build/node/node-base-min.js"></script></head>
<script type="text/javascript" src="idle-timer.js"></script>
<body>
<h1>Idle Timer Example</h1>
<p>The idle timer is built on <a href="http://developer.yahoo.com/yui/3/">YUI 3</a> and provides two events: <code>idle</code> and <code>active</code>, which fire when the user's idle state has changed.</p>
<p>This example has an idle timeout of 10 seconds. When you move your mouse over the page or start typing, you're considered "active". The status at the top of the screen changes to indicate your current state.</p>
<div id="status" style="padding: 5px;">&nbsp;</div>
<form>
<label for="comment">Comment:</label><br />
<textarea rows="10" cols="30" id="comment" name="comment"></textarea><br />
<input type="submit" value="Submit" />
</form>


<script type="text/javascript">

YUI().use("*", function(Y){

Y.IdleTimer.subscribe("idle", function(){
Y.get("#status").set("innerHTML", "User is idle :(").set("style.backgroundColor", "silver");
});

Y.IdleTimer.subscribe("active", function(){
Y.get("#status").set("innerHTML", "User is active :D").set("style.backgroundColor", "yellow");
});

Y.IdleTimer.start(10000);
Y.IdleTimer.stop();

});

</script>
</body>
</html>
139 changes: 139 additions & 0 deletions idle-timer/idle-timer.js
@@ -0,0 +1,139 @@
/**
* Idle timer
* @module idletimer
*/
YUI.add("idle-timer", function(Y){

//-------------------------------------------------------------------------
// Private variables
//-------------------------------------------------------------------------

var idle = false, //indicates if the user is idle
tId = -1, //timeout ID
enabled = false, //indicates if the idle timer is enabled
timeout = 30000; //the amount of time (ms) before the user is considered idle

//-------------------------------------------------------------------------
// Private functions
//-------------------------------------------------------------------------

/** (intentionally not document)
* Handles a user event indicating that the user isn't idle.
* @param {Event} event A DOM2-normalized event object.
* @return {void}
*/
function handleUserEvent(){

//clear any existing timeout
clearTimeout(tId);

//if the idle timer is enabled
if (enabled){

//if it's idle, that means the user is no longer idle
if (idle){
toggleIdleState();
} else {
//set a new timeout
tId = setTimeout(toggleIdleState, timeout);
}
}
}

function toggleIdleState(){

//toggle the state
idle = !idle;

//fire appropriate event
Y.IdleTimer.fire(idle ? "idle" : "active");
}

//-------------------------------------------------------------------------
// Public interface
//-------------------------------------------------------------------------

/**
* Centralized control for determining when a user has become idle
* on the current page.
* @class IdleTimer
* @static
*/
Y.IdleTimer = {

/**
* Indicates if the idle timer is running or not.
* @return {Boolean} True if the idle timer is running, false if not.
* @method isRunning
* @static
*/
isRunning: function(){
return enabled;
},

/**
* Indicates if the user is idle or not.
* @return {Boolean} True if the user is idle, false if not.
* @method isIdle
* @static
*/
isIdle: function(){
return idle;
},

/**
* Starts the idle timer. This adds appropriate event handlers
* and starts the first timeout.
* @param {int} newTimeout (Optional) A new value for the timeout period in ms.
* @return {void}
* @method start
* @static
*/
start: function(newTimeout){

//set to enabled
enabled = true;

//set idle to false to begin with
idle = false;

//assign a new timeout if necessary
if (typeof newTimeout == "number"){
timeout = newTimeout;
}

//assign appropriate event handlers
Y.on("mousemove", handleUserEvent, document);
Y.on("keydown", handleUserEvent, document);

//set a timeout to toggle state
tId = setTimeout(toggleIdleState, timeout);
},

/**
* Stops the idle timer. This removes appropriate event handlers
* and cancels any pending timeouts.
* @return {void}
* @method stop
* @static
*/
stop: function(){

//set to disabled
enabled = false;

//clear any pending timeouts
clearTimeout(tId);

//detach the event handlers
Y.detach("mousemove", handleUserEvent, document);
Y.detach("keydown", handleUserEvent, document);
}

};

//inherit event functionality
Y.augment(Y.IdleTimer, Y.Event.Target);


}, "0.1", { requires: ["event", "event-custom"] });

0 comments on commit afb7a12

Please sign in to comment.