summaryrefslogtreecommitdiff
path: root/chimere/static/jme/utils/useractivity.js
diff options
context:
space:
mode:
Diffstat (limited to 'chimere/static/jme/utils/useractivity.js')
-rw-r--r--chimere/static/jme/utils/useractivity.js108
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