﻿/* 
* jQuery idleTimer plugin 
* version 0.8.092209 
* by Paul Irish.  
*   http://github.com/paulirish/yui-misc/tree/ 
* MIT license  
* adapted from YUI idle timer by nzakas: 
*   http://github.com/nzakas/yui-misc/   
* Copyright (c) 2009 Nicholas C. Zakas 
*  
* Permission is hereby granted, free of charge, to any person obtaining a copy 
* of this software and associated documentation files (the "Software"), to deal 
* in the Software without restriction, including without limitation the rights 
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
* copies of the Software, and to permit persons to whom the Software is 
* furnished to do so, subject to the following conditions: 
*  
* The above copyright notice and this permission notice shall be included in 
* all copies or substantial portions of the Software. 
*  
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 
* THE SOFTWARE. 
*/
(function($) {
    $.idleTimer = function f(newTimeout) {
        //$.idleTimer.tId = -1     
        //timeout ID     
        var idle = false,
        //indicates if the user is idle        
enabled = true,
        //indicates if the idle timer is enabled        
timeout = 30000,
        //the amount of time (ms) before the user is considered idle        
events = 'mousemove keydown DOMMouseScroll mousewheel mousedown',
        // activity is one of these events      
        //f.olddate = undefined, 
        // olddate used for getElapsedTime. stored on the function            
        /* (intentionally not documented)     
        * Toggles the idle state and fires an appropriate event.     
        * @return {void}     
        */
toggleIdleState = function() {
    //toggle the state        
    idle = !idle;
    // reset timeout counter        
    f.olddate = +new Date;
    //fire appropriate event        
    $(document).trigger($.data(document, 'idleTimer', idle ? "idle" : "active") + '.idleTimer');
},
        /**     
        * 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($.idleTimer.tId);
    //detach the event handlers        
    $(document).unbind('.idleTimer');
},
        /* (intentionally not documented)     
        * Handles a user event indicating that the user isn't idle.     
        * @param {Event} event A DOM2-normalized event object.     
        * @return {void}     
        */
handleUserEvent = function() {
    //clear any existing timeout        
    clearTimeout($.idleTimer.tId);
    //if the idle timer is enabled        
    if (enabled) {
        //if it's idle, that means the user is no longer idle            
        if (idle) {
            toggleIdleState();
        }
        //set a new timeout            
        $.idleTimer.tId = setTimeout(toggleIdleState, timeout);
    }
};
        /**     
        * 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 $.idleTimer     
        * @static     
        */
        f.olddate = f.olddate || +new Date;
        //assign a new timeout if necessary    
        if (typeof newTimeout == "number") {
            timeout = newTimeout;
        } else if (newTimeout === 'destroy') {
            stop();
            return this;
        } else if (newTimeout === 'getElapsedTime') {
            return (+new Date) - f.olddate;
        }
        //assign appropriate event handlers    
        $(document).bind($.trim((events + ' ').split(' ').join('.idleTimer ')), handleUserEvent);
        //set a timeout to toggle state    
        $.idleTimer.tId = setTimeout(toggleIdleState, timeout);
        // assume the user is active for the first x seconds.    
        $.data(document, 'idleTimer', "active");
    }; // end of $.idleTimer()      
})(jQuery);