]> git.sur5r.net Git - bacula/bacula/blob - gui/baculum/protected/JavaScript/misc.js
Update ReleaseNotes + ChangeLog
[bacula/bacula] / gui / baculum / protected / JavaScript / misc.js
1 var Units = {
2         get_decimal_size: function(size) {
3                 var dec_size;
4                 var size_unit = 'B';
5                 var units = ['K', 'M', 'G', 'T', 'P'];
6
7                 if (size === null) {
8                         size = 0;
9                 }
10
11                 var size_pattern = new RegExp('^[\\d\\.]+(' + units.join('|') + ')?' + size_unit + '$');
12
13                 if (size_pattern.test(size.toString())) {
14                         // size is already formatted
15                         dec_size = size;
16                 } else {
17                         size = parseInt(size, 10);
18                         var unit;
19                         dec_size = size.toString() + ((size > 0 ) ? size_unit : '');
20                         while(size >= 1000) {
21                                 size /= 1000;
22                                 unit = units.shift(units);
23                         }
24                         if (unit) {
25                                 dec_size = (Math.floor(size * 10) / 10).toFixed(1);
26                                 dec_size += unit + size_unit;
27                         }
28                 }
29                 return dec_size;
30         }
31 }
32
33 var Strings = {
34         limits: {
35                 label: 15
36         },
37         get_short_label: function(txt) {
38                 var short_txt = txt;
39                 var cut = ((this.limits.label - 2) / 2);
40                 if (txt.length > this.limits.label) {
41                         short_txt = txt.substr(0, cut) + '..' + txt.substr(-cut);
42                 }
43                 return short_txt;
44         }
45 }
46
47 var PieGraph  = {
48         pie_label_formatter: function (total, value) {
49                 var percents =  (100 * value / total).toFixed(1);
50                 if (percents >= 1) {
51                         percents = percents.toString() + '%';
52                 } else {
53                         percents = '';
54                 }
55                 return percents;
56         },
57         pie_track_formatter: function(e) {
58                 return e.series.label;
59         }
60 }
61
62 var Formatters = {
63         formatter: [
64                 {css_class: 'size', format_func: Units.get_decimal_size}
65         ],
66         set_formatters: function() {
67                 var elements, formatter, txt;
68                 for (var i = 0; i < this.formatter.length; i++) {
69                         elements = document.getElementsByClassName(this.formatter[i].css_class);
70                         formatter = this.formatter[i].format_func;
71                         for (var i = 0; i < elements.length; i++) {
72                                 txt = elements[i].firstChild;
73                                 if (txt.nodeType === 3) {
74                                         txt.nodeValue = formatter(txt.nodeValue);
75                                 }
76                         }
77                 }
78         }
79 }
80
81 var Cookies = {
82         default_exipration_time: 31536000000, // 1 year in miliseconds
83         set_cookie: function(name, value, expiration) {
84                 var date = new Date();
85                 date.setTime(date.getTime() + this.default_exipration_time);
86                 var expires = 'expires=' + date.toUTCString();
87                 document.cookie = name + '=' + value + '; ' + expires;
88         },
89         get_cookie: function(name) {
90                 name += '=';
91                 var values = document.cookie.split(';');
92                 var cookie_val = null;
93                 var value;
94                 for (var i = 0; i < values.length; i++) {
95                         value = values[i];
96                         while (value.charAt(0) == ' ') {
97                                 value = value.substr(1);
98                         }
99                         if (value.indexOf(name) == 0) {
100                                 cookie_val = value.substring(name.length, value.length);
101                                 break;
102                         }
103                 }
104                 return cookie_val;
105         }
106 }
107
108 var Dashboard = {
109         stats: null,
110         txt: null,
111         pie: null,
112         noval: '-',
113         ids: {
114                 clients: {
115                         no: 'clients_no',
116                         most: 'clients_most',
117                         jobs: 'clients_jobs'
118                 },
119                 jobs: {
120                         to_view: 'jobs_to_view',
121                         most: 'jobs_most',
122                         most_count: 'jobs_most_count'
123                 },
124                 jobtotals: {
125                         total_bytes: 'jobs_total_bytes',
126                         total_files: 'jobs_total_files'
127                 },
128                 database: {
129                         size: 'database_size'
130                 },
131                 pools: {
132                         no: 'pools_no',
133                         most: 'pools_most',
134                         jobs: 'pools_jobs'
135                 },
136                 pie_summary: 'jobs_summary_graph'
137         },
138         update_all: function(statistics, txt) {
139                 this.stats = statistics;
140                 this.txt = txt;
141                 this.update_pie_jobstatus();
142                 this.update_clients();
143                 this.update_job_access();
144                 this.update_jobs();
145                 this.update_jobtotals();
146                 this.update_database();
147                 this.update_pools();
148         },
149         update_clients: function() {
150                 var clients = this.stats.clients_occupancy;
151                 var most_occuped_client = this.noval;
152                 var occupancy = -1;
153                 for (client in clients) {
154                         if (occupancy < clients[client]) {
155                                 most_occuped_client = client;
156                                 occupancy = clients[client];
157                         }
158                 }
159
160                 if (occupancy === -1) {
161                         occupancy = 0;
162                 }
163
164                 document.getElementById(this.ids.clients.no).textContent = Object.keys(this.stats.clients).length;
165                 document.getElementById(this.ids.clients.most).setAttribute('title', most_occuped_client);
166                 document.getElementById(this.ids.clients.most).textContent = Strings.get_short_label(most_occuped_client);
167                 document.getElementById(this.ids.clients.jobs).textContent = occupancy;
168         },
169         update_job_access: function() {
170                 var jobs_combobox= document.getElementById(this.ids.jobs.to_view);
171                 jobs_combobox.innerHTML = '';
172                 var last_jobs = this.stats.jobs.slice(0, 100);
173                 for (var i = 0; i < last_jobs.length; i++) {
174                         var opt = document.createElement('OPTION');
175                         var txt = '[' + last_jobs[i].jobid + '] ' + last_jobs[i].name + ' (' + this.txt.level + ': ' + last_jobs[i].level + ' ' + this.txt.status + ': ' + last_jobs[i].jobstatus + ' ' + this.txt.starttime + ': ' + last_jobs[i].starttime + ')';
176                         var label = document.createTextNode(txt);
177                         opt.value = last_jobs[i].jobid;
178                         opt.appendChild(label);
179                         jobs_combobox.appendChild(opt);
180                 }
181         },
182         update_jobs: function() {
183                 var jobs = this.stats.jobs_occupancy;
184                 var most_occuped_job = this.noval;
185                 var occupancy = -1;
186                 for (job in jobs) {
187                         if (occupancy < jobs[job]) {
188                                 most_occuped_job = job;
189                                 occupancy = jobs[job];
190                         }
191                 }
192
193                 if (occupancy === -1) {
194                         occupancy = 0;
195                 }
196
197                 document.getElementById(this.ids.jobs.most).setAttribute('title',most_occuped_job);
198                 document.getElementById(this.ids.jobs.most).textContent = Strings.get_short_label(most_occuped_job);
199                 document.getElementById(this.ids.jobs.most_count).textContent = occupancy;
200         },
201         update_jobtotals: function() {
202                 document.getElementById(this.ids.jobtotals.total_bytes).textContent = Units.get_decimal_size(this.stats.jobtotals.bytes);
203                 document.getElementById(this.ids.jobtotals.total_files).textContent = this.stats.jobtotals.files || 0;
204         },
205         update_database: function() {
206                 document.getElementById(this.ids.database.size).textContent = Units.get_decimal_size(this.stats.dbsize);
207         },
208         update_pools: function() {
209                 var pools = this.stats.pools_occupancy;
210                 var most_occuped_pool = this.noval;
211                 var occupancy = -1;
212                 for (pool in pools) {
213                         if (occupancy < pools[pool]) {
214                                 most_occuped_pool = pool;
215                                 occupancy = pools[pool];
216                         }
217                 }
218
219                 if (occupancy === -1) {
220                         occupancy = 0;
221                 }
222
223                 document.getElementById(this.ids.pools.no).textContent = Object.keys(this.stats.pools).length;
224                 document.getElementById(this.ids.pools.most).setAttribute('title', most_occuped_pool);
225                 document.getElementById(this.ids.pools.most).textContent = Strings.get_short_label(most_occuped_pool);
226                 document.getElementById(this.ids.pools.jobs).textContent = occupancy;
227         },
228         update_pie_jobstatus: function() {
229                 if (PanelWindow.currentWindowId === 'dashboard') {
230                         if (this.pie != null) {
231                                 this.pie.pie.destroy();
232                         }
233                         this.pie = new GraphPieClass(this.stats.jobs_summary, this.ids.pie_summary);
234                 }
235         }
236 }
237
238 var Users = {
239         ids: {
240                 create_user: {
241                         add_user: 'add_user',
242                         add_user_btn: 'add_user_btn',
243                         newuser: 'newuser',
244                         newpwd: 'newpwd'
245                 },
246                 change_pwd: {
247                         rel_chpwd: 'chpwd',
248                         rel_chpwd_btn: 'chpwd_btn'
249                 }
250         },
251         validators: {
252                 user_pattern: null
253         },
254         init: function() {
255                 this.setEvents();
256         },
257         setEvents: function() {
258                 document.getElementById(this.ids.create_user.add_user_btn).addEventListener('click', function(e) {
259                         $(this.ids.create_user.add_user).show();
260                         $(this.ids.create_user.newuser).focus();
261                 }.bind(this));
262                 document.getElementById(this.ids.create_user.newuser).addEventListener('keydown', function(e) {
263                         var target = e.target || e.srcElement;
264                         if (e.keyCode == 13) {
265                                 $(target.parentNode.getElementsByTagName('A')[0]).click();
266                         } else if (e.keyCode == 27) {
267                                 this.cancelAddUser();
268                         }
269                         return false;
270                 }.bind(this));
271                 document.getElementById(this.ids.create_user.newpwd).addEventListener('keydown', function(e) {
272                         var target = e.target || e.srcElement;
273                         if (e.keyCode == 13) {
274                                 $(target.nextElementSibling).click();
275                         } else if (e.keyCode == 27) {
276                                 this.cancelAddUser();
277                         }
278                         return false;
279                 }.bind(this));
280         },
281         userValidator: function(user) {
282                 user = user.replace(/\s/g, '');
283                 if (user == '') {
284                         alert(this.txt.enter_login);
285                         return false;
286                 }
287                 var valid =  this.validators.user_pattern.test(user);
288                 if (valid === false) {
289                         alert(this.txt.invalid_login);
290                         return false;
291                 }
292                 return true;
293         },
294         pwdValidator: function(pwd) {
295                 var valid = pwd.length > 4;
296                 if (valid === false) {
297                         alert(this.txt.invalid_pwd);
298                 }
299                 return valid;
300         },
301         addUser: function() {
302                 var user = document.getElementById(this.ids.create_user.newuser).value;
303                 var pwd = document.getElementById(this.ids.create_user.newpwd).value;
304                 if (this.userValidator(user) === false) {
305                         return false;
306                 }
307                 if (this.pwdValidator(pwd) === false) {
308                         return false;
309                 }
310
311                 $(this.ids.create_user.add_user).hide();
312                 this.action_callback('newuser', user, pwd);
313                 return true;
314         },
315         rmUser: function(user) {
316                 this.action_callback('rmuser', user);
317         },
318         showChangePwd: function(el) {
319                 $$('a[rel=\'' + this.ids.change_pwd.rel_chpwd_btn + '\']').invoke('show');
320                 $(el).hide();
321                 $$('span[rel=\'' + this.ids.change_pwd.rel_chpwd + '\']').invoke('hide');
322                 $(el.nextElementSibling).show();
323                 $(el.nextElementSibling).select('input')[0].focus();
324         },
325         changePwd: function(el, user) {
326                 var pwd = el.value;
327
328                 if (this.pwdValidator(pwd) === false) {
329                         return false;
330                 }
331
332                 $(el.parentNode).hide();
333                 $(el.parentNode.previousElementSibling).show();
334                 this.action_callback('chpwd', user, pwd);
335                 return true;
336         },
337         cancelAddUser: function() {
338                 $(this.ids.create_user.add_user).hide();
339         },
340         cancelChangePwd: function(el) {
341                 $(el.parentNode).hide();
342                 $(el.parentNode.previousElementSibling).show();
343         }
344
345 }