1 /* Sieve Filters (tab) */
4 rcmail.addEventListener('init', function(evt) {
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'))
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);
25 if (rcmail.env.action == 'plugin.managesieve') {
26 if (rcmail.gui_objects.sieveform) {
27 rcmail.enable_command('plugin.managesieve-save', true);
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);
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);
41 if (rcmail.gui_objects.filterslist) {
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();
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);
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')));
56 if (rcmail.gui_objects.sieveform && rcmail.env.rule_disabled)
57 $('#disabled').attr('checked', true);
61 /*********************************************************/
62 /********* Managesieve filters methods *********/
63 /*********************************************************/
65 rcube_webmail.prototype.managesieve_add = function()
67 this.load_managesieveframe();
68 this.filters_list.clear_selection();
71 rcube_webmail.prototype.managesieve_del = function()
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);
79 rcube_webmail.prototype.managesieve_up = function()
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);
86 rcube_webmail.prototype.managesieve_down = function()
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);
93 rcube_webmail.prototype.managesieve_rowid = function(id)
95 var i, rows = this.filters_list.rows;
97 for (i=0; i<rows.length; i++)
98 if (rows[i] != null && rows[i].uid == id)
102 rcube_webmail.prototype.managesieve_updatelist = function(action, name, id, disabled)
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);
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;
122 var from, fromstatus, status, rows = this.filters_list.rows;
124 // we need only to replace filter names...
125 for (var i=0; i<rows.length; i++) {
126 if (rows[i]==null) { // removed row
129 else if (rows[i].uid == id) {
131 fromstatus = $(from).hasClass('disabled');
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);
144 // ... and disable/enable Down button
145 this.filters_listbuttons();
149 var from, status, fromstatus, rows = this.filters_list.rows;
151 // we need only to replace filter names...
152 for (var i=0; i<rows.length; i++) {
153 if (rows[i] == null) { // removed row
156 else if (rows[i].uid == id-1) {
158 fromstatus = $(from).hasClass('disabled');
159 this.filters_list.highlight_row(i);
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');
171 // ... and disable/enable Up button
172 this.filters_listbuttons();
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;
181 $(rows[i].obj).addClass('disabled');
183 $(rows[i].obj).removeClass('disabled');
189 var row, new_row, td, list = parent.rcmail.filters_list;
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;
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);
205 $(new_row).addClass('disabled');
206 if (row.cells[0].className)
207 td.className = row.cells[0].className;
210 list.highlight_row(id);
212 parent.rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', true);
214 else // refresh whole page
215 parent.rcmail.goto_url('plugin.managesieve');
219 this.set_busy(false);
222 rcube_webmail.prototype.managesieve_select = function(list)
224 var id = list.get_single_selection();
226 this.load_managesieveframe(list.rows[id].uid);
229 rcube_webmail.prototype.managesieve_save = function()
231 if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') {
232 var id = parent.rcmail.filters_list.get_single_selection();
234 this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid;
236 this.gui_objects.sieveform.submit();
240 rcube_webmail.prototype.load_managesieveframe = function(id)
242 if (typeof(id) != 'undefined' && id != null) {
243 this.enable_command('plugin.managesieve-del', true);
244 this.filters_listbuttons();
247 this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
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;
256 // enable/disable Up/Down buttons
257 rcube_webmail.prototype.filters_listbuttons = function()
259 var id = this.filters_list.get_single_selection(),
260 rows = this.filters_list.rows;
262 for (var i=0; i<rows.length; i++) {
263 if (rows[i] == null) { // removed row
266 this.enable_command('plugin.managesieve-up', false);
270 this.enable_command('plugin.managesieve-up', true);
275 for (var i=rows.length-1; i>0; i--) {
276 if (rows[i] == null) { // removed row
279 this.enable_command('plugin.managesieve-down', false);
283 this.enable_command('plugin.managesieve-down', true);
289 // operations on filters form
290 rcube_webmail.prototype.managesieve_ruleadd = function(id)
292 this.http_post('plugin.managesieve', '_act=ruleadd&_rid='+id);
295 rcube_webmail.prototype.managesieve_rulefill = function(content, id, after)
298 // create new element
299 var div = document.getElementById('rules'),
300 row = document.createElement('div');
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;
308 this.managesieve_formbuttons(div);
312 rcube_webmail.prototype.managesieve_ruledel = function(id)
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'));
321 rcube_webmail.prototype.managesieve_actionadd = function(id)
323 this.http_post('plugin.managesieve', '_act=actionadd&_aid='+id);
326 rcube_webmail.prototype.managesieve_actionfill = function(content, id, after)
329 var div = document.getElementById('actions'),
330 row = document.createElement('div');
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;
338 this.managesieve_formbuttons(div);
342 rcube_webmail.prototype.managesieve_actiondel = function(id)
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'));
351 // insert rule/action row in specified place on the list
352 rcube_webmail.prototype.managesieve_insertrow = function(div, row, after)
354 for (var i=0; i<div.childNodes.length; i++) {
355 if (div.childNodes[i].id == (div.id == 'rules' ? 'rulerow' : 'actionrow') + after)
359 if (div.childNodes[i+1])
360 div.insertBefore(row, div.childNodes[i+1]);
362 div.appendChild(row);
365 // update Delete buttons status
366 rcube_webmail.prototype.managesieve_formbuttons = function(div)
368 var i, button, buttons = [];
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/, ''));
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/, ''));
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');
389 $(button).addClass('disabled');
390 button.setAttribute('disabled', true);
396 rcube_webmail.prototype.managesieve_set = function()
398 var script = $(this.gui_objects.filtersetslist).val();
399 location.href = this.env.comm_path+'&_action=plugin.managesieve&_set='+script;
403 rcube_webmail.prototype.managesieve_setget = function()
405 var script = $(this.gui_objects.filtersetslist).val();
406 location.href = this.env.comm_path+'&_action=plugin.managesieve&_act=setget&_set='+script;
410 rcube_webmail.prototype.managesieve_setact = function()
412 if (!this.gui_objects.filtersetslist)
415 var script = this.gui_objects.filtersetslist.value,
416 action = (script == rcmail.env.active_set ? 'deact' : 'setact');
418 this.http_post('plugin.managesieve', '_act='+action+'&_set='+script);
421 // Set activate flag in sets list after set activation
422 rcube_webmail.prototype.managesieve_reset = function()
424 if (!this.gui_objects.filtersetslist)
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)+'$');
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;
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')));
445 rcube_webmail.prototype.managesieve_setdel = function()
447 if (!this.gui_objects.filtersetslist)
450 if (!confirm(this.get_label('managesieve.setdeleteconfirm')))
453 var script = this.gui_objects.filtersetslist.value;
454 this.http_post('plugin.managesieve', '_act=setdel&_set='+script);
458 rcube_webmail.prototype.managesieve_setadd = function()
460 this.filters_list.clear_selection();
461 this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
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;
470 rcube_webmail.prototype.managesieve_reload = function(set)
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 : '')
479 // Register onmouse(leave/enter) events for tips on specified form element
480 rcube_webmail.prototype.managesieve_tip_register = function(tips)
482 for (var n in tips) {
484 .bind('mouseenter', {str: tips[n][1]},
486 var offset = $(this).offset(),
487 tip = rcmail.env.framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer,
489 top = offset.top - 12;
491 if (rcmail.env.framed) {
492 offset = $(parent.document.getElementById('filter-box')).offset();
500 tip.css({left: left, top: top}).show();
504 var tip = parent.rcmail && parent.rcmail.env.ms_tip_layer ?
505 parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer;