merged cont.
[opensuse:yast-rest-service.git] / webyast / public / javascripts / notifier.js
1 /*
2 #--
3 # Webyast Webservice framework
4 #
5 # Copyright (C) 2009, 2010 Novell, Inc. 
6 #   This library is free software; you can redistribute it and/or modify
7 # it only under the terms of version 2.1 of the GNU Lesser General Public
8 # License as published by the Free Software Foundation. 
9 #
10 #   This library is distributed in the hope that it will be useful, but WITHOUT
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
13 # details. 
14 #
15 #   You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software 
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 #++
19 */
20
21 var log = function(message) { 
22   if (typeof(console) != 'undefined' && typeof(console.log) == 'function'){ console.log(message); } else { return false }
23 }
24
25 function pageRefresh() { self.location = window.location.href; }
26
27 //TODO: call twice???
28 function stopNotifierPlugin(worker) {
29   var stop = { stop: function() { return this.timer }};
30   var activityTimer = jQuery.extend($.activity, stop);
31
32   if(activityTimer && worker) { 
33     worker.terminate();
34     clearInterval($.activity.stop()); 
35     //log("Stop JQuery activity check & terminate running worker!")
36   } 
37 }
38
39 function startNotifier(params, interval, inactive) {
40   killWorkerOnReload(Notifier(params));
41
42   $(document).ready(function() {
43     jQuery(function($){
44       $.activity.init({
45         interval: interval, 
46         inactive: inactive, 
47         intervalFn: function(){
48           //log("User is idle: " + Math.round((this.now() - this.defaults.lastActive)/1000) + ' sec');
49         },
50         inactiveFn: function(){
51           //log("User is inactive: " + Math.round((this.now() - this.defaults.lastActive)/1000)  + ' sec');
52           if(typeof(Worker) != 'defined') { killWorker(worker); }
53           $.activity.update();
54         }
55       });
56       
57     $(document).bind('click mousemove', function(){
58       if($.activity.isActive()) {
59         $.activity.update();
60       } else {
61         //log("User active start worker and reactivate activity check!");
62         Notifier(params);
63         $.activity.reActivate();
64       }
65       });
66     });
67   })
68 }
69
70 var Notifier = function(params) {
71   if(typeof(Worker) == 'undefined') {
72     //console.log("Web worker is not supported")
73     window.setInterval(function() { AJAXcall(params); },5000);
74   } else {
75     //console.log("Web worker is supported")
76     worker = new Worker("/javascripts/notifier.workers.js");
77     worker.postMessage(params);
78     
79     worker.onmessage = function(event) {
80       switch(event.data){
81         case '200':
82           //log("RELOAD is NEEDED: " + event.data);
83           stopNotifierPlugin(this);
84           $.modalDialog.info( {message: 'Data has been changed!'});
85           setTimeout('pageRefresh()', 1000)
86         break
87         case '304':
88           //log("CACHE is UP-TO-DATE: " + event.data); 
89         break
90         case '306':
91           //log("CACHE is not available: " + event.data); 
92           stopNotifierPlugin(worker);
93         break
94         default : 
95           //log("ERROR: unknown HTTP status: " + event.data);
96           stopNotifierPlugin(worker);
97         break
98       }
99     };
100
101     worker.onerror = function(error) {
102       //log(error);
103     };
104
105     return worker;
106   }
107 }
108
109 var AJAXcall = function(params) {
110   $.getJSON("/notifier?plugin="+params.module, function(data, status, jqXHR) {
111     data.NaN? data = data : data = data.toString();
112     switch(data){
113       case '200':
114         //log("RELOAD is NEEDED: " + data);
115         stopNotifierPlugin(worker);
116         $.modalDialog.info( {message: 'Data has been changed!'});
117         setTimeout('pageRefresh()', 1000)
118       break
119       case '304':
120         //log("CACHE is UP-TO-DATE: " + data); 
121         break
122       case '306':
123         //log("CACHE is not available: " + event.data); 
124         break
125       default : 
126         //log("ERROR: unknown HTTP status: " + data + typeof(data));
127       break
128     }
129   })
130 }
131
132 var killWorker = function(worker) {
133   if(worker && typeof(Worker) != 'undefined') {
134      stopNotifierPlugin(worker);
135   }
136 }
137
138 var killWorkerOnReload = function(worker, intervalID) {
139   $(function(){
140     window.onbeforeunload = function(){
141       if(worker && typeof(Worker) != 'undefined') {
142         stopNotifierPlugin(worker);
143       }
144     }
145   });
146 }