3 {format: 'second', value: 1},
4 {format: 'minute', value: 60},
5 {format: 'hour', value: 60},
6 {format: 'day', value: 24}
8 units: ['K', 'M', 'G', 'T', 'P'],
9 get_decimal_size: function(size) {
12 var units = Units.units.slice(0);
18 var size_pattern = new RegExp('^[\\d\\.]+(' + units.join('|') + ')?' + size_unit + '$');
20 if (size_pattern.test(size.toString())) {
21 // size is already formatted
24 size = parseInt(size, 10);
26 dec_size = size.toString() + ((size > 0 ) ? size_unit : '');
29 unit = units.shift(units);
32 dec_size = (Math.floor(size * 10) / 10).toFixed(1);
33 dec_size += unit + size_unit;
38 format_time_period: function(time_seconds, format) {
41 for (var i = 0; i < this.formats.length; i++) {
42 if (this.formats[i].format != format) {
43 reminder = time_seconds % this.formats[i].value;
45 time_seconds /= this.formats[i].value;
46 f = this.formats[i].format;
52 var ret = {value: time_seconds, format: f};
61 get_short_label: function(txt) {
63 var cut = ((this.limits.label - 2) / 2);
64 if (txt.length > this.limits.label) {
65 short_txt = txt.substr(0, cut) + '..' + txt.substr(-cut);
72 pie_label_formatter: function (total, value) {
73 var percents = (100 * value / total).toFixed(1);
75 percents = percents.toString() + '%';
81 pie_track_formatter: function(e) {
82 return e.series.label;
88 {css_class: 'size', format_func: Units.get_decimal_size}
90 set_formatters: function() {
91 var elements, formatter, txt;
92 for (var i = 0; i < this.formatter.length; i++) {
93 elements = document.getElementsByClassName(this.formatter[i].css_class);
94 formatter = this.formatter[i].format_func;
95 for (var i = 0; i < elements.length; i++) {
96 txt = elements[i].firstChild;
97 if (txt.nodeType === 3) {
98 txt.nodeValue = formatter(txt.nodeValue);
106 default_exipration_time: 31536000000, // 1 year in miliseconds
107 set_cookie: function(name, value, expiration) {
108 var date = new Date();
109 date.setTime(date.getTime() + this.default_exipration_time);
110 var expires = 'expires=' + date.toUTCString();
111 document.cookie = name + '=' + value + '; ' + expires;
113 get_cookie: function(name) {
115 var values = document.cookie.split(';');
116 var cookie_val = null;
118 for (var i = 0; i < values.length; i++) {
120 while (value.charAt(0) == ' ') {
121 value = value.substr(1);
123 if (value.indexOf(name) == 0) {
124 cookie_val = value.substring(name.length, value.length);
140 most: 'clients_most',
144 to_view: 'jobs_to_view',
146 most_count: 'jobs_most_count'
149 total_bytes: 'jobs_total_bytes',
150 total_files: 'jobs_total_files'
153 type: 'database_type',
154 size: 'database_size'
161 pie_summary: 'jobs_summary_graph'
168 update_all: function(statistics, txt) {
169 this.stats = statistics;
171 this.update_pie_jobstatus();
172 this.update_clients();
173 this.update_job_access();
175 this.update_jobtotals();
176 this.update_database();
179 update_clients: function() {
180 var clients = this.stats.clients_occupancy;
181 var most_occuped_client = this.noval;
183 for (client in clients) {
184 if (occupancy < clients[client]) {
185 most_occuped_client = client;
186 occupancy = clients[client];
190 if (occupancy === -1) {
194 document.getElementById(this.ids.clients.no).textContent = Object.keys(this.stats.clients).length;
195 document.getElementById(this.ids.clients.most).setAttribute('title', most_occuped_client);
196 document.getElementById(this.ids.clients.most).textContent = Strings.get_short_label(most_occuped_client);
197 document.getElementById(this.ids.clients.jobs).textContent = occupancy;
199 update_job_access: function() {
200 var jobs_combobox= document.getElementById(this.ids.jobs.to_view);
201 jobs_combobox.innerHTML = '';
202 var last_jobs = this.stats.jobs.slice(0, 100);
203 for (var i = 0; i < last_jobs.length; i++) {
204 var opt = document.createElement('OPTION');
205 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 + ')';
206 var label = document.createTextNode(txt);
207 opt.value = last_jobs[i].jobid;
208 opt.appendChild(label);
209 jobs_combobox.appendChild(opt);
212 update_jobs: function() {
213 var jobs = this.stats.jobs_occupancy;
214 var most_occuped_job = this.noval;
217 if (occupancy < jobs[job]) {
218 most_occuped_job = job;
219 occupancy = jobs[job];
223 if (occupancy === -1) {
227 document.getElementById(this.ids.jobs.most).setAttribute('title',most_occuped_job);
228 document.getElementById(this.ids.jobs.most).textContent = Strings.get_short_label(most_occuped_job);
229 document.getElementById(this.ids.jobs.most_count).textContent = occupancy;
231 update_jobtotals: function() {
232 document.getElementById(this.ids.jobtotals.total_bytes).textContent = Units.get_decimal_size(this.stats.jobtotals.bytes);
233 document.getElementById(this.ids.jobtotals.total_files).textContent = this.stats.jobtotals.files || 0;
235 update_database: function() {
236 document.getElementById(this.ids.database.type).textContent = this.dbtype[this.stats.dbsize.dbtype];
237 document.getElementById(this.ids.database.size).textContent = Units.get_decimal_size(this.stats.dbsize.dbsize);
239 update_pools: function() {
240 var pools = this.stats.pools_occupancy;
241 var most_occuped_pool = this.noval;
243 for (pool in pools) {
244 if (occupancy < pools[pool]) {
245 most_occuped_pool = pool;
246 occupancy = pools[pool];
250 if (occupancy === -1) {
254 document.getElementById(this.ids.pools.no).textContent = Object.keys(this.stats.pools).length;
255 document.getElementById(this.ids.pools.most).setAttribute('title', most_occuped_pool);
256 document.getElementById(this.ids.pools.most).textContent = Strings.get_short_label(most_occuped_pool);
257 document.getElementById(this.ids.pools.jobs).textContent = occupancy;
259 update_pie_jobstatus: function() {
260 if (PanelWindow.currentWindowId === 'dashboard') {
261 if (this.pie != null) {
262 this.pie.pie.destroy();
264 this.pie = new GraphPieClass(this.stats.jobs_summary, this.ids.pie_summary);
272 add_user: 'add_user',
273 add_user_btn: 'add_user_btn',
279 rel_chpwd_btn: 'chpwd_btn'
288 setEvents: function() {
289 document.getElementById(this.ids.create_user.add_user_btn).addEventListener('click', function(e) {
290 $('#' + this.ids.create_user.add_user).show();
291 $('#' + this.ids.create_user.newuser).focus();
293 document.getElementById(this.ids.create_user.newuser).addEventListener('keydown', function(e) {
294 var target = e.target || e.srcElement;
295 if (e.keyCode == 13) {
296 $(target.parentNode.getElementsByTagName('A')[0]).click();
297 } else if (e.keyCode == 27) {
298 this.cancelAddUser();
302 document.getElementById(this.ids.create_user.newpwd).addEventListener('keydown', function(e) {
303 var target = e.target || e.srcElement;
304 if (e.keyCode == 13) {
305 $(target.nextElementSibling).click();
306 } else if (e.keyCode == 27) {
307 this.cancelAddUser();
312 userValidator: function(user) {
313 user = user.replace(/\s/g, '');
315 alert(this.txt.enter_login);
318 var valid = this.validators.user_pattern.test(user);
319 if (valid === false) {
320 alert(this.txt.invalid_login);
325 pwdValidator: function(pwd) {
326 var valid = pwd.length > 4;
327 if (valid === false) {
328 alert(this.txt.invalid_pwd);
332 addUser: function() {
333 var user = document.getElementById(this.ids.create_user.newuser).value;
334 var pwd = document.getElementById(this.ids.create_user.newpwd).value;
335 if (this.userValidator(user) === false) {
338 if (this.pwdValidator(pwd) === false) {
342 $('#' + this.ids.create_user.add_user).hide();
343 this.action_callback('newuser', user, pwd);
346 rmUser: function(user) {
347 this.action_callback('rmuser', user);
349 showChangePwd: function(el) {
350 $('a[rel=\'' + this.ids.change_pwd.rel_chpwd_btn + '\']').show();
352 $('span[rel=\'' + this.ids.change_pwd.rel_chpwd + '\']').hide();
353 $(el.nextElementSibling).show();
354 $(el.nextElementSibling).select('input')[0].focus();
356 changePwd: function(el, user) {
359 if (this.pwdValidator(pwd) === false) {
363 $(el.parentNode).hide();
364 $(el.parentNode.previousElementSibling).show();
365 this.action_callback('chpwd', user, pwd);
368 cancelAddUser: function() {
369 $('#' + this.ids.create_user.add_user).hide();
371 cancelChangePwd: function(el) {
372 $(el.parentNode).hide();
373 $(el.parentNode.previousElementSibling).show();
378 function openElementOnCursor(e, element, offsetX, offsetY) {
385 var x = (e.clientX + offsetX).toString();
386 var y = (e.clientY + offsetY + window.pageYOffset).toString();
387 $('#' + element).css({
388 position: 'absolute',
393 $('#' + element).show();
397 function get_random_string(allowed, len) {
398 var random_string = "";
399 for(var i = 0; i < len; i++) {
400 random_string += allowed.charAt(Math.floor(Math.random() * allowed.length));
402 return random_string;