diff options
Diffstat (limited to 'chimere/static/jme/utils/useractivity.js')
| -rw-r--r-- | chimere/static/jme/utils/useractivity.js | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/chimere/static/jme/utils/useractivity.js b/chimere/static/jme/utils/useractivity.js new file mode 100644 index 0000000..862996d --- /dev/null +++ b/chimere/static/jme/utils/useractivity.js @@ -0,0 +1,108 @@ +(function($){ + /** + * helps you to detect user activity/userinactivity in an html-area + * + * usage: + * + * $('div.my-element') + * .bind('useractive', function(e){ + * // user is active in this area + * }) + * .bind('userinactive', function(e){ + * // user is inactive in this area + * }) + * ; + * + * more advanced usage: + * + * $('div.my-element') + * .bind('useractive', function(e){ + * // user is active in this area + * }) + * .bind('userinactive', {idletime: 1500}, function(e){ + * // user is inactive in this area + * }) + * ; + */ + if(!$.support.opacity && !$.opacityRemoveFix){ + var oldStyle = $.style; + $.style = function(elem, name, value){ + var ret = oldStyle(elem, name, value); + if(name === 'opacity' && value == 1){ + elem.style.filter = (elem.style.filter || '').replace('alpha(opacity=100)', ''); + } + return ret; + }; + $.opacityRemoveFix = true; + } + var activity = { + add: function(elem, cfg, name){ + var data = $.data(elem, 'jmeuseractivity') || $.data(elem, 'jmeuseractivity', {idletime: 2500, idle: true, trigger: {}}), + jElm = $(elem), + setInactive = function(){ + if(!data.idle){ + data.idle = true; + if ( data.trigger.userinactive ) { + jElm.trigger('userinactive'); + } + } + }, + setActive = function(e){ + if(!e || (e.type === 'mousemove' && e.pageX === x && e.pageY === y)){return;} + if(e.type === 'mousemove'){ + x = e.pageX; + y = e.pageY; + } + if(data.idleTimer){ + clearTimeout(data.idleTimer); + } + data.idleTimer = setTimeout(setInactive, data.idletime); + if(data.idle){ + data.idle = false; + if( data.trigger.useractive ){ + jElm.trigger('useractive'); + } + } + }, + x, y + ; + + data.idletime = (cfg || {}).idletime || data.idletime; + if(cfg && 'idle' in cfg){ + data.idle = cfg.idle; + } + data.trigger[name] = true; + + if( !data.bound ){ + jElm + .bind('mouseleave.jmeuseractivity', setInactive) + .bind('mousemove.jmeuseractivity focusin.jmeuseractivity mouseenter.jmeuseractivity keydown.jmeuseractivity keyup.jmeuseractivity mousedown.jmeuseractivity', setActive) + ; + data.bound = true; + } + if(!data.idle){ + setActive({type: 'initunidled'}); + } + }, + remove: function(elem, name){ + var data = $.data(elem, 'jmeuseractivity') || $.data(elem, 'jmeuseractivity', {idletime: 2500, idle: true, trigger: {}}); + data.trigger[name] = false; + if(!data.trigger.useractive && !data.trigger.userinactive){ + $(elem).unbind('.jmeuseractivity'); + data.bound = false; + } + } + }; + $.each(['useractive', 'userinactive'], function(i, name){ + $.event.special[name] = { + setup: function(cfg){ + activity.add(this, cfg, name); + }, + teardown: function(){ + activity.remove(this, name); + } + }; + }); + + +})(jQuery);
\ No newline at end of file |
