﻿
(function ($) {
    $.fn.idleTimer = function (settings) {
        var $this = $(this);

        var options = {
            timeout: settings.timeout || 30000,
            enabled: settings.enabled || true,
            events: settings.events || 'mousemove keydown DOMMouseScroll mousewheel mousedown',
            idle: settings.idle || false,
            onTimeout: settings.onTimeout || function () { },
            onActive: settings.onActive || function () { }
        };

        var obj = $.data($this, 'idleTimerObj') || new function () { };

        obj.olddate = obj.olddate || +new Date;

        if (typeof options.timeout == "number") {
            timeout = options.timeout;
        } else if (options.timeout === 'destroy') {
            stop(elem);
            return this;
        } else if (options.timeout === 'getElapsedTime') {
            return (+new Date) - obj.olddate;
        }

        var toggleIdleState = function (myelem) {
            if (typeof myelem == 'number') myelem = undefined;

            var obj = $.data(myelem || $this, 'idleTimerObj');
            obj.idle = !obj.idle;

            obj.olddate = +new Date;

            if (obj.idle) {
                options.onTimeout($this);
            } else {
                options.onActive($this);
            }

            var event = jQuery.Event($.data($this, 'idleTimer', obj.idle ? "idle" : "active") + '.idleTimer');

            event.stopPropagation();
            $($this).trigger(event);
        };

        stop = function (elem) {

            var obj = $.data(elem, 'idleTimerObj');
            obj.enabled = false;
            clearTimeout(obj.tId);
            $($this).unbind('.idleTimer');
        };

        handleUserEvent = function () {

            var obj = $.data($this, 'idleTimerObj');
            clearTimeout(obj.tId);
            if (obj.enabled) {

                if (obj.idle) {
                    toggleIdleState($this);
                }

                obj.tId = setTimeout(toggleIdleState, obj.timeout);
            }
        };


        $this.bind($.trim((options.events + ' ').split(' ').join('.idleTimer ')), handleUserEvent);

        obj.idle = options.idle;
        obj.enabled = options.enabled;
        obj.timeout = options.timeout;

        obj.tId = setTimeout(toggleIdleState, obj.timeout);

        $.data($this, 'idleTimer', "active");
        $.data($this, 'idleTimerObj', obj);
    }
})(jQuery);
