]> git.donarmstrong.com Git - roundcube.git/blob - plugins/managesieve/managesieve.js
Imported Upstream version 0.5
[roundcube.git] / plugins / managesieve / managesieve.js
1 /* Sieve Filters (tab) */
2
3 if (window.rcmail) {
4   rcmail.addEventListener('init', function(evt) {
5
6     var tab = $('<span>').attr('id', 'settingstabpluginmanagesieve').addClass('tablink');
7     var button = $('<a>').attr('href', rcmail.env.comm_path+'&_action=plugin.managesieve')
8       .attr('title', rcmail.gettext('managesieve.managefilters'))
9       .html(rcmail.gettext('managesieve.filters'))
10       .bind('click', function(e){ return rcmail.command('plugin.managesieve', this) })
11       .appendTo(tab);
12
13     // add button and register commands
14     rcmail.add_element(tab, 'tabs');
15     rcmail.register_command('plugin.managesieve', function() { rcmail.goto_url('plugin.managesieve') }, true);
16     rcmail.register_command('plugin.managesieve-save', function() { rcmail.managesieve_save() }, true);
17     rcmail.register_command('plugin.managesieve-add', function() { rcmail.managesieve_add() }, true);
18     rcmail.register_command('plugin.managesieve-del', function() { rcmail.managesieve_del() }, true);
19     rcmail.register_command('plugin.managesieve-up', function() { rcmail.managesieve_up() }, true);
20     rcmail.register_command('plugin.managesieve-down', function() { rcmail.managesieve_down() }, true);
21     rcmail.register_command('plugin.managesieve-set', function() { rcmail.managesieve_set() }, true);
22     rcmail.register_command('plugin.managesieve-setadd', function() { rcmail.managesieve_setadd() }, true);
23     rcmail.register_command('plugin.managesieve-setdel', function() { rcmail.managesieve_setdel() }, true);
24     rcmail.register_command('plugin.managesieve-setact', function() { rcmail.managesieve_setact() }, true);
25     rcmail.register_command('plugin.managesieve-setget', function() { rcmail.managesieve_setget() }, true);
26
27     if (rcmail.env.action == 'plugin.managesieve') {
28       if (rcmail.gui_objects.sieveform) {
29         rcmail.enable_command('plugin.managesieve-save', true);
30       }
31       else {
32         rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up',
33           'plugin.managesieve-down', false);
34         rcmail.enable_command('plugin.managesieve-add', 'plugin.managesieve-setadd', !rcmail.env.sieveconnerror);
35       }
36
37       // Create layer for form tips
38       if (!rcmail.env.framed) {
39         rcmail.env.ms_tip_layer = $('<div id="managesieve-tip" class="popupmenu"></div>');
40         rcmail.env.ms_tip_layer.appendTo(document.body);
41       }
42
43       if (rcmail.gui_objects.filterslist) {
44         var p = rcmail;
45         rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist, {multiselect:false, draggable:false, keyboard:false});
46         rcmail.filters_list.addEventListener('select', function(o){ p.managesieve_select(o); });
47         rcmail.filters_list.init();
48         rcmail.filters_list.focus();
49
50         rcmail.enable_command('plugin.managesieve-set', true);
51         rcmail.enable_command('plugin.managesieve-setact', 'plugin.managesieve-setget', rcmail.gui_objects.filtersetslist.length);
52         rcmail.enable_command('plugin.managesieve-setdel', rcmail.gui_objects.filtersetslist.length > 1);
53
54         $('#'+rcmail.buttons['plugin.managesieve-setact'][0].id).attr('title', rcmail.gettext('managesieve.filterset'
55           + (rcmail.gui_objects.filtersetslist.value == rcmail.env.active_set ? 'deact' : 'act')));
56       }
57     }
58     if (rcmail.gui_objects.sieveform && rcmail.env.rule_disabled)
59       $('#disabled').attr('checked', true);
60   });
61 };
62
63 /*********************************************************/
64 /*********     Managesieve filters methods       *********/
65 /*********************************************************/
66
67 rcube_webmail.prototype.managesieve_add = function()
68 {
69   this.load_managesieveframe();
70   this.filters_list.clear_selection();
71 };
72
73 rcube_webmail.prototype.managesieve_del = function()
74 {
75   var id = this.filters_list.get_single_selection();
76   if (confirm(this.get_label('managesieve.filterdeleteconfirm')))
77     this.http_request('plugin.managesieve',
78       '_act=delete&_fid='+this.filters_list.rows[id].uid, true);
79 };
80
81 rcube_webmail.prototype.managesieve_up = function()
82 {
83   var id = this.filters_list.get_single_selection();
84   this.http_request('plugin.managesieve',
85     '_act=up&_fid='+this.filters_list.rows[id].uid, true);
86 };
87
88 rcube_webmail.prototype.managesieve_down = function()
89 {
90   var id = this.filters_list.get_single_selection();
91   this.http_request('plugin.managesieve',
92     '_act=down&_fid='+this.filters_list.rows[id].uid, true);
93 };
94
95 rcube_webmail.prototype.managesieve_rowid = function(id)
96 {
97   var i, rows = this.filters_list.rows;
98
99   for (i=0; i<rows.length; i++)
100     if (rows[i] != null && rows[i].uid == id)
101       return i;
102 }
103
104 rcube_webmail.prototype.managesieve_updatelist = function(action, name, id, disabled)
105 {
106   this.set_busy(true);
107
108   switch (action) {
109     case 'delete':
110       this.filters_list.remove_row(this.managesieve_rowid(id));
111       this.filters_list.clear_selection();
112       this.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', 'plugin.managesieve-down', false);
113       this.show_contentframe(false);
114
115       // re-numbering filters
116       var i, rows = this.filters_list.rows;
117       for (i=0; i<rows.length; i++) {
118         if (rows[i] != null && rows[i].uid > id)
119           rows[i].uid = rows[i].uid-1;
120       }
121       break;
122
123     case 'down':
124       var from, fromstatus, status, rows = this.filters_list.rows;
125
126       // we need only to replace filter names...
127       for (var i=0; i<rows.length; i++) {
128         if (rows[i]==null) { // removed row
129           continue;
130         }
131         else if (rows[i].uid == id) {
132           from = rows[i].obj;
133           fromstatus = $(from).hasClass('disabled');
134         }
135         else if (rows[i].uid == id+1) {
136           name = rows[i].obj.cells[0].innerHTML;
137           status = $(rows[i].obj).hasClass('disabled');
138           rows[i].obj.cells[0].innerHTML = from.cells[0].innerHTML;
139           from.cells[0].innerHTML = name;
140           $(from)[status?'addClass':'removeClass']('disabled');
141           $(rows[i].obj)[fromstatus?'addClass':'removeClass']('disabled');
142           this.filters_list.highlight_row(i);
143           break;
144         }
145       }
146       // ... and disable/enable Down button
147       this.filters_listbuttons();
148       break;
149
150     case 'up':
151       var from, status, fromstatus, rows = this.filters_list.rows;
152
153       // we need only to replace filter names...
154       for (var i=0; i<rows.length; i++) {
155         if (rows[i] == null) { // removed row
156           continue;
157         }
158         else if (rows[i].uid == id-1) {
159           from = rows[i].obj;
160           fromstatus = $(from).hasClass('disabled');
161           this.filters_list.highlight_row(i);
162         }
163         else if (rows[i].uid == id) {
164           name = rows[i].obj.cells[0].innerHTML;
165           status = $(rows[i].obj).hasClass('disabled');
166           rows[i].obj.cells[0].innerHTML = from.cells[0].innerHTML;
167           from.cells[0].innerHTML = name;
168           $(from)[status?'addClass':'removeClass']('disabled');
169           $(rows[i].obj)[fromstatus?'addClass':'removeClass']('disabled');
170           break;
171         }
172       }
173       // ... and disable/enable Up button
174       this.filters_listbuttons();
175       break;
176
177     case 'update':
178       var rows = parent.rcmail.filters_list.rows;
179       for (var i=0; i<rows.length; i++)
180         if (rows[i] && rows[i].uid == id) {
181           rows[i].obj.cells[0].innerHTML = name;
182           if (disabled)
183             $(rows[i].obj).addClass('disabled');
184           else
185             $(rows[i].obj).removeClass('disabled');
186           break;
187         }
188       break;
189
190     case 'add':
191       var row, new_row, td, list = parent.rcmail.filters_list;
192
193       if (!list)
194         break;
195
196       for (var i=0; i<list.rows.length; i++)
197         if (list.rows[i] != null && String(list.rows[i].obj.id).match(/^rcmrow/))
198           row = list.rows[i].obj;
199
200       if (row) {
201         new_row = parent.document.createElement('tr');
202         new_row.id = 'rcmrow'+id;
203         td = parent.document.createElement('td');
204         new_row.appendChild(td);
205         list.insert_row(new_row, false);
206         if (disabled)
207           $(new_row).addClass('disabled');
208           if (row.cells[0].className)
209             td.className = row.cells[0].className;
210
211            td.innerHTML = name;
212         list.highlight_row(id);
213
214         parent.rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', true);
215       }
216       else // refresh whole page
217         parent.rcmail.goto_url('plugin.managesieve');
218       break;
219   }
220
221   this.set_busy(false);
222 };
223
224 rcube_webmail.prototype.managesieve_select = function(list)
225 {
226   var id = list.get_single_selection();
227   if (id != null)
228     this.load_managesieveframe(list.rows[id].uid);
229 };
230
231 rcube_webmail.prototype.managesieve_save = function()
232 {
233   if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') {
234     var id = parent.rcmail.filters_list.get_single_selection();
235     if (id != null)
236       this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid;
237   }
238   this.gui_objects.sieveform.submit();
239 };
240
241 // load filter frame
242 rcube_webmail.prototype.load_managesieveframe = function(id)
243 {
244   if (typeof(id) != 'undefined' && id != null) {
245     this.enable_command('plugin.managesieve-del', true);
246     this.filters_listbuttons();
247   }
248   else
249     this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
250
251   if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
252     target = window.frames[this.env.contentframe];
253     var msgid = this.set_busy(true, 'loading');
254     target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1&_fid='+id+'&_unlock='+msgid;
255   }
256 };
257
258 // enable/disable Up/Down buttons
259 rcube_webmail.prototype.filters_listbuttons = function()
260 {
261   var id = this.filters_list.get_single_selection(),
262     rows = this.filters_list.rows;
263
264   for (var i=0; i<rows.length; i++) {
265     if (rows[i] == null) { // removed row
266     }
267     else if (i == id) {
268       this.enable_command('plugin.managesieve-up', false);
269       break;
270     }
271     else {
272       this.enable_command('plugin.managesieve-up', true);
273       break;
274     }
275   }
276
277   for (var i=rows.length-1; i>0; i--) {
278     if (rows[i] == null) { // removed row
279     }
280     else if (i == id) {
281       this.enable_command('plugin.managesieve-down', false);
282       break;
283     }
284     else {
285       this.enable_command('plugin.managesieve-down', true);
286       break;
287     }
288   } 
289 };
290
291 // operations on filters form
292 rcube_webmail.prototype.managesieve_ruleadd = function(id)
293 {
294   this.http_post('plugin.managesieve', '_act=ruleadd&_rid='+id);
295 };
296
297 rcube_webmail.prototype.managesieve_rulefill = function(content, id, after)
298 {
299   if (content != '') {
300     // create new element
301     var div = document.getElementById('rules'),
302       row = document.createElement('div');
303
304     this.managesieve_insertrow(div, row, after);
305     // fill row after inserting (for IE)
306     row.setAttribute('id', 'rulerow'+id);
307     row.className = 'rulerow';
308     row.innerHTML = content;
309
310     this.managesieve_formbuttons(div);
311   }
312 };
313
314 rcube_webmail.prototype.managesieve_ruledel = function(id)
315 {
316   if (confirm(this.get_label('managesieve.ruledeleteconfirm'))) {
317     var row = document.getElementById('rulerow'+id);
318     row.parentNode.removeChild(row);
319     this.managesieve_formbuttons(document.getElementById('rules'));
320   }
321 };
322
323 rcube_webmail.prototype.managesieve_actionadd = function(id)
324 {
325   this.http_post('plugin.managesieve', '_act=actionadd&_aid='+id);
326 };
327
328 rcube_webmail.prototype.managesieve_actionfill = function(content, id, after)
329 {
330   if (content != '') {
331     var div = document.getElementById('actions'),
332       row = document.createElement('div');
333
334     this.managesieve_insertrow(div, row, after);
335     // fill row after inserting (for IE)
336     row.className = 'actionrow';
337     row.setAttribute('id', 'actionrow'+id);
338     row.innerHTML = content;
339
340     this.managesieve_formbuttons(div);
341   }
342 };
343
344 rcube_webmail.prototype.managesieve_actiondel = function(id)
345 {
346   if (confirm(this.get_label('managesieve.actiondeleteconfirm'))) {
347     var row = document.getElementById('actionrow'+id);
348     row.parentNode.removeChild(row);
349     this.managesieve_formbuttons(document.getElementById('actions'));
350   }
351 };
352
353 // insert rule/action row in specified place on the list
354 rcube_webmail.prototype.managesieve_insertrow = function(div, row, after)
355 {
356   for (var i=0; i<div.childNodes.length; i++) {
357     if (div.childNodes[i].id == (div.id == 'rules' ? 'rulerow' : 'actionrow')  + after)
358       break;
359   }
360
361   if (div.childNodes[i+1])
362     div.insertBefore(row, div.childNodes[i+1]);
363   else
364     div.appendChild(row);
365 };
366
367 // update Delete buttons status
368 rcube_webmail.prototype.managesieve_formbuttons = function(div)
369 {
370   var i, button, buttons = [];
371
372   // count and get buttons
373   for (i=0; i<div.childNodes.length; i++) {
374     if (div.id == 'rules' && div.childNodes[i].id) {
375       if (/rulerow/.test(div.childNodes[i].id))
376         buttons.push('ruledel' + div.childNodes[i].id.replace(/rulerow/, ''));
377     }
378     else if (div.childNodes[i].id) {
379       if (/actionrow/.test(div.childNodes[i].id))
380         buttons.push( 'actiondel' + div.childNodes[i].id.replace(/actionrow/, ''));
381     }
382   }
383
384   for (i=0; i<buttons.length; i++) {
385     button = document.getElementById(buttons[i]);
386     if (i>0 || buttons.length>1) {
387       $(button).removeClass('disabled');
388       button.removeAttribute('disabled');
389     }
390     else {
391       $(button).addClass('disabled');
392       button.setAttribute('disabled', true);
393     }
394   }
395 };
396
397 // Set change
398 rcube_webmail.prototype.managesieve_set = function()
399 {
400   var script = $(this.gui_objects.filtersetslist).val();
401   location.href = this.env.comm_path+'&_action=plugin.managesieve&_set='+script;
402 };
403
404 // Script download
405 rcube_webmail.prototype.managesieve_setget = function()
406 {
407   var script = $(this.gui_objects.filtersetslist).val();
408   location.href = this.env.comm_path+'&_action=plugin.managesieve&_act=setget&_set='+script;
409 };
410
411 // Set activate
412 rcube_webmail.prototype.managesieve_setact = function()
413 {
414   if (!this.gui_objects.filtersetslist)
415     return false;
416
417   var script = this.gui_objects.filtersetslist.value,
418     action = (script == rcmail.env.active_set ? 'deact' : 'setact');
419
420   this.http_post('plugin.managesieve', '_act='+action+'&_set='+script);
421 };
422
423 // Set activate flag in sets list after set activation
424 rcube_webmail.prototype.managesieve_reset = function()
425 {
426   if (!this.gui_objects.filtersetslist)
427     return false;
428
429   var list = this.gui_objects.filtersetslist,
430     opts = list.getElementsByTagName('option'),
431     label = ' (' + this.get_label('managesieve.active') + ')',
432     regx = new RegExp(RegExp.escape(label)+'$');
433
434   for (var x=0; x<opts.length; x++) {
435     if (opts[x].value != rcmail.env.active_set && opts[x].innerHTML.match(regx))
436       opts[x].innerHTML = opts[x].innerHTML.replace(regx, '');
437     else if (opts[x].value == rcmail.env.active_set)
438       opts[x].innerHTML = opts[x].innerHTML + label;
439   }
440
441   // change title of setact button
442   $('#'+rcmail.buttons['plugin.managesieve-setact'][0].id).attr('title', rcmail.gettext('managesieve.filterset'
443     + (list.value == rcmail.env.active_set ? 'deact' : 'act')));
444 };
445
446 // Set delete
447 rcube_webmail.prototype.managesieve_setdel = function()
448 {
449   if (!this.gui_objects.filtersetslist)
450     return false;
451
452   if (!confirm(this.get_label('managesieve.setdeleteconfirm')))
453     return false;
454
455   var script = this.gui_objects.filtersetslist.value;
456   this.http_post('plugin.managesieve', '_act=setdel&_set='+script);
457 };
458
459 // Set add
460 rcube_webmail.prototype.managesieve_setadd = function()
461 {
462   this.filters_list.clear_selection();
463   this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
464
465   if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
466     target = window.frames[this.env.contentframe];
467     var msgid = this.set_busy(true, 'loading');
468     target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1&_newset=1&_unlock='+msgid;
469   }
470 };
471
472 rcube_webmail.prototype.managesieve_reload = function(set)
473 {
474   this.env.reload_set = set;
475   window.setTimeout(function() {
476     location.href = rcmail.env.comm_path + '&_action=plugin.managesieve'
477       + (rcmail.env.reload_set ? '&_set=' + rcmail.env.reload_set : '')
478   }, 500);
479 };
480
481 // Register onmouse(leave/enter) events for tips on specified form element
482 rcube_webmail.prototype.managesieve_tip_register = function(tips)
483 {
484   for (var n in tips) {
485     $('#'+tips[n][0])
486       .bind('mouseenter', {str: tips[n][1]},
487         function(e) {
488           var offset = $(this).offset(),
489             tip = rcmail.env.framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer,
490             left = offset.left,
491             top = offset.top - 12;
492
493           if (rcmail.env.framed) {
494             offset = $(parent.document.getElementById('filter-box')).offset();
495             top  += offset.top;
496             left += offset.left;
497           }
498
499           tip.html(e.data.str)
500           top -= tip.height();
501           
502           tip.css({left: left, top: top}).show();
503         })
504       .bind('mouseleave',
505         function(e) {
506           var tip = parent.rcmail && parent.rcmail.env.ms_tip_layer ? 
507             parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer;
508           tip.hide();
509       });
510   }
511 };