2 get_decimal_size: function(size) {
5 var units = ['K', 'M', 'G', 'T', 'P'];
11 var size_pattern = new RegExp('^[\\d\\.]+(' + units.join('|') + ')?' + size_unit + '$');
13 if (size_pattern.test(size.toString())) {
14 // size is already formatted
17 size = parseInt(size, 10);
19 dec_size = size.toString() + ((size > 0 ) ? size_unit : '');
22 unit = units.shift(units);
25 dec_size = (Math.floor(size * 10) / 10).toFixed(1);
26 dec_size += unit + size_unit;
37 get_short_label: function(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);
48 pie_label_formatter: function (total, value) {
49 var percents = (100 * value / total).toFixed(1);
51 percents = percents.toString() + '%';
57 pie_track_formatter: function(e) {
58 return e.series.label;
64 {css_class: 'size', format_func: Units.get_decimal_size}
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);
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;
89 get_cookie: function(name) {
91 var values = document.cookie.split(';');
92 var cookie_val = null;
94 for (var i = 0; i < values.length; i++) {
96 while (value.charAt(0) == ' ') {
97 value = value.substr(1);
99 if (value.indexOf(name) == 0) {
100 cookie_val = value.substring(name.length, value.length);
116 most: 'clients_most',
120 to_view: 'jobs_to_view',
122 most_count: 'jobs_most_count'
125 total_bytes: 'jobs_total_bytes',
126 total_files: 'jobs_total_files'
129 size: 'database_size'
136 pie_summary: 'jobs_summary_graph'
138 update_all: function(statistics, txt) {
139 this.stats = statistics;
141 this.update_pie_jobstatus();
142 this.update_clients();
143 this.update_job_access();
145 this.update_jobtotals();
146 this.update_database();
149 update_clients: function() {
150 var clients = this.stats.clients_occupancy;
151 var most_occuped_client = this.noval;
153 for (client in clients) {
154 if (occupancy < clients[client]) {
155 most_occuped_client = client;
156 occupancy = clients[client];
160 if (occupancy === -1) {
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;
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);
182 update_jobs: function() {
183 var jobs = this.stats.jobs_occupancy;
184 var most_occuped_job = this.noval;
187 if (occupancy < jobs[job]) {
188 most_occuped_job = job;
189 occupancy = jobs[job];
193 if (occupancy === -1) {
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;
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;
205 update_database: function() {
206 document.getElementById(this.ids.database.size).textContent = Units.get_decimal_size(this.stats.dbsize);
208 update_pools: function() {
209 var pools = this.stats.pools_occupancy;
210 var most_occuped_pool = this.noval;
212 for (pool in pools) {
213 if (occupancy < pools[pool]) {
214 most_occuped_pool = pool;
215 occupancy = pools[pool];
219 if (occupancy === -1) {
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;
228 update_pie_jobstatus: function() {
229 if (PanelWindow.currentWindowId === 'dashboard') {
230 if (this.pie != null) {
231 this.pie.pie.destroy();
233 this.pie = new GraphPieClass(this.stats.jobs_summary, this.ids.pie_summary);
241 add_user: 'add_user',
242 add_user_btn: 'add_user_btn',
248 rel_chpwd_btn: 'chpwd_btn'
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();
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();
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();
281 userValidator: function(user) {
282 user = user.replace(/\s/g, '');
284 alert(this.txt.enter_login);
287 var valid = this.validators.user_pattern.test(user);
288 if (valid === false) {
289 alert(this.txt.invalid_login);
294 pwdValidator: function(pwd) {
295 var valid = pwd.length > 4;
296 if (valid === false) {
297 alert(this.txt.invalid_pwd);
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) {
307 if (this.pwdValidator(pwd) === false) {
311 $(this.ids.create_user.add_user).hide();
312 this.action_callback('newuser', user, pwd);
315 rmUser: function(user) {
316 this.action_callback('rmuser', user);
318 showChangePwd: function(el) {
319 $$('a[rel=\'' + this.ids.change_pwd.rel_chpwd_btn + '\']').invoke('show');
321 $$('span[rel=\'' + this.ids.change_pwd.rel_chpwd + '\']').invoke('hide');
322 $(el.nextElementSibling).show();
323 $(el.nextElementSibling).select('input')[0].focus();
325 changePwd: function(el, user) {
328 if (this.pwdValidator(pwd) === false) {
332 $(el.parentNode).hide();
333 $(el.parentNode.previousElementSibling).show();
334 this.action_callback('chpwd', user, pwd);
337 cancelAddUser: function() {
338 $(this.ids.create_user.add_user).hide();
340 cancelChangePwd: function(el) {
341 $(el.parentNode).hide();
342 $(el.parentNode.previousElementSibling).show();