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'))
10 .bind('click', function(e){ return rcmail.command('plugin.managesieve', this) })
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);
27 if (rcmail.env.action == 'plugin.managesieve') {
28 if (rcmail.gui_objects.sieveform) {
29 rcmail.enable_command('plugin.managesieve-save', true);
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);
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);
43 if (rcmail.gui_objects.filterslist) {
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();
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);
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')));
58 if (rcmail.gui_objects.sieveform && rcmail.env.rule_disabled)
59 $('#disabled').attr('checked', true);
63 /*********************************************************/
64 /********* Managesieve filters methods *********/
65 /*********************************************************/
67 rcube_webmail.prototype.managesieve_add = function()
69 this.load_managesieveframe();
70 this.filters_list.clear_selection();
73 rcube_webmail.prototype.managesieve_del = function()
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);
81 rcube_webmail.prototype.managesieve_up = function()
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);
88 rcube_webmail.prototype.managesieve_down = function()
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);
95 rcube_webmail.prototype.managesieve_rowid = function(id)
97 var i, rows = this.filters_list.rows;
99 for (i=0; i<rows.length; i++)
100 if (rows[i] != null && rows[i].uid == id)
104 rcube_webmail.prototype.managesieve_updatelist = function(action, name, id, disabled)
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);
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;
124 var from, fromstatus, status, rows = this.filters_list.rows;
126 // we need only to replace filter names...
127 for (var i=0; i<rows.length; i++) {
128 if (rows[i]==null) { // removed row
131 else if (rows[i].uid == id) {
133 fromstatus = $(from).hasClass('disabled');
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);
146 // ... and disable/enable Down button
147 this.filters_listbuttons();
151 var from, status, fromstatus, rows = this.filters_list.rows;
153 // we need only to replace filter names...
154 for (var i=0; i<rows.length; i++) {
155 if (rows[i] == null) { // removed row
158 else if (rows[i].uid == id-1) {
160 fromstatus = $(from).hasClass('disabled');
161 this.filters_list.highlight_row(i);
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');
173 // ... and disable/enable Up button
174 this.filters_listbuttons();
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;
183 $(rows[i].obj).addClass('disabled');
185 $(rows[i].obj).removeClass('disabled');
191 var row, new_row, td, list = parent.rcmail.filters_list;
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;
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);
207 $(new_row).addClass('disabled');
208 if (row.cells[0].className)
209 td.className = row.cells[0].className;
212 list.highlight_row(id);
214 parent.rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', true);
216 else // refresh whole page
217 parent.rcmail.goto_url('plugin.managesieve');
221 this.set_busy(false);
224 rcube_webmail.prototype.managesieve_select = function(list)
226 var id = list.get_single_selection();
228 this.load_managesieveframe(list.rows[id].uid);
231 rcube_webmail.prototype.managesieve_save = function()
233 if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') {
234 var id = parent.rcmail.filters_list.get_single_selection();
236 this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid;
238 this.gui_objects.sieveform.submit();
242 rcube_webmail.prototype.load_managesieveframe = function(id)
244 if (typeof(id) != 'undefined' && id != null) {
245 this.enable_command('plugin.managesieve-del', true);
246 this.filters_listbuttons();
249 this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
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;
258 // enable/disable Up/Down buttons
259 rcube_webmail.prototype.filters_listbuttons = function()
261 var id = this.filters_list.get_single_selection(),
262 rows = this.filters_list.rows;
264 for (var i=0; i<rows.length; i++) {
265 if (rows[i] == null) { // removed row
268 this.enable_command('plugin.managesieve-up', false);
272 this.enable_command('plugin.managesieve-up', true);
277 for (var i=rows.length-1; i>0; i--) {
278 if (rows[i] == null) { // removed row
281 this.enable_command('plugin.managesieve-down', false);
285 this.enable_command('plugin.managesieve-down', true);
291 // operations on filters form
292 rcube_webmail.prototype.managesieve_ruleadd = function(id)
294 this.http_post('plugin.managesieve', '_act=ruleadd&_rid='+id);
297 rcube_webmail.prototype.managesieve_rulefill = function(content, id, after)
300 // create new element
301 var div = document.getElementById('rules'),
302 row = document.createElement('div');
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;
310 this.managesieve_formbuttons(div);
314 rcube_webmail.prototype.managesieve_ruledel = function(id)
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'));
323 rcube_webmail.prototype.managesieve_actionadd = function(id)
325 this.http_post('plugin.managesieve', '_act=actionadd&_aid='+id);
328 rcube_webmail.prototype.managesieve_actionfill = function(content, id, after)
331 var div = document.getElementById('actions'),
332 row = document.createElement('div');
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;
340 this.managesieve_formbuttons(div);
344 rcube_webmail.prototype.managesieve_actiondel = function(id)
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'));
353 // insert rule/action row in specified place on the list
354 rcube_webmail.prototype.managesieve_insertrow = function(div, row, after)
356 for (var i=0; i<div.childNodes.length; i++) {
357 if (div.childNodes[i].id == (div.id == 'rules' ? 'rulerow' : 'actionrow') + after)
361 if (div.childNodes[i+1])
362 div.insertBefore(row, div.childNodes[i+1]);
364 div.appendChild(row);
367 // update Delete buttons status
368 rcube_webmail.prototype.managesieve_formbuttons = function(div)
370 var i, button, buttons = [];
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/, ''));
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/, ''));
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');
391 $(button).addClass('disabled');
392 button.setAttribute('disabled', true);
398 rcube_webmail.prototype.managesieve_set = function()
400 var script = $(this.gui_objects.filtersetslist).val();
401 location.href = this.env.comm_path+'&_action=plugin.managesieve&_set='+script;
405 rcube_webmail.prototype.managesieve_setget = function()
407 var script = $(this.gui_objects.filtersetslist).val();
408 location.href = this.env.comm_path+'&_action=plugin.managesieve&_act=setget&_set='+script;
412 rcube_webmail.prototype.managesieve_setact = function()
414 if (!this.gui_objects.filtersetslist)
417 var script = this.gui_objects.filtersetslist.value,
418 action = (script == rcmail.env.active_set ? 'deact' : 'setact');
420 this.http_post('plugin.managesieve', '_act='+action+'&_set='+script);
423 // Set activate flag in sets list after set activation
424 rcube_webmail.prototype.managesieve_reset = function()
426 if (!this.gui_objects.filtersetslist)
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)+'$');
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;
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')));
447 rcube_webmail.prototype.managesieve_setdel = function()
449 if (!this.gui_objects.filtersetslist)
452 if (!confirm(this.get_label('managesieve.setdeleteconfirm')))
455 var script = this.gui_objects.filtersetslist.value;
456 this.http_post('plugin.managesieve', '_act=setdel&_set='+script);
460 rcube_webmail.prototype.managesieve_setadd = function()
462 this.filters_list.clear_selection();
463 this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
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;
472 rcube_webmail.prototype.managesieve_reload = function(set)
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 : '')
481 // Register onmouse(leave/enter) events for tips on specified form element
482 rcube_webmail.prototype.managesieve_tip_register = function(tips)
484 for (var n in tips) {
486 .bind('mouseenter', {str: tips[n][1]},
488 var offset = $(this).offset(),
489 tip = rcmail.env.framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer,
491 top = offset.top - 12;
493 if (rcmail.env.framed) {
494 offset = $(parent.document.getElementById('filter-box')).offset();
502 tip.css({left: left, top: top}).show();
506 var tip = parent.rcmail && parent.rcmail.env.ms_tip_layer ?
507 parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer;