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