/* (Manage)Sieve Filters */ if (window.rcmail) { rcmail.addEventListener('init', function(evt) { // add managesieve-create command to message_commands array, // so it's state will be updated on message selection/unselection if (rcmail.env.task == 'mail') { if (rcmail.env.action != 'show') rcmail.env.message_commands.push('managesieve-create'); else rcmail.enable_command('managesieve-create', true); } else { var tab = $('').attr('id', 'settingstabpluginmanagesieve').addClass('tablink filter'), button = $('').attr('href', rcmail.env.comm_path+'&_action=plugin.managesieve') .attr('title', rcmail.gettext('managesieve.managefilters')) .html(rcmail.gettext('managesieve.filters')) .appendTo(tab); // add tab rcmail.add_element(tab, 'tabs'); } if (rcmail.env.task == 'mail' || rcmail.env.action.indexOf('plugin.managesieve') != -1) { // Create layer for form tips if (!rcmail.env.framed) { rcmail.env.ms_tip_layer = $('
'); rcmail.env.ms_tip_layer.appendTo(document.body); } } // register commands rcmail.register_command('plugin.managesieve-save', function() { rcmail.managesieve_save() }); rcmail.register_command('plugin.managesieve-act', function() { rcmail.managesieve_act() }); rcmail.register_command('plugin.managesieve-add', function() { rcmail.managesieve_add() }); rcmail.register_command('plugin.managesieve-del', function() { rcmail.managesieve_del() }); rcmail.register_command('plugin.managesieve-move', function() { rcmail.managesieve_move() }); rcmail.register_command('plugin.managesieve-setadd', function() { rcmail.managesieve_setadd() }); rcmail.register_command('plugin.managesieve-setdel', function() { rcmail.managesieve_setdel() }); rcmail.register_command('plugin.managesieve-setact', function() { rcmail.managesieve_setact() }); rcmail.register_command('plugin.managesieve-setget', function() { rcmail.managesieve_setget() }); if (rcmail.env.action == 'plugin.managesieve' || rcmail.env.action == 'plugin.managesieve-save') { if (rcmail.gui_objects.sieveform) { rcmail.enable_command('plugin.managesieve-save', true); // small resize for header element $('select[name="_header[]"]', rcmail.gui_objects.sieveform).each(function() { if (this.value == '...') this.style.width = '40px'; }); // resize dialog window if (rcmail.env.action == 'plugin.managesieve' && rcmail.env.task == 'mail') { parent.rcmail.managesieve_dialog_resize(rcmail.gui_objects.sieveform); } $('input[type="text"]:first', rcmail.gui_objects.sieveform).focus(); } else { rcmail.enable_command('plugin.managesieve-add', 'plugin.managesieve-setadd', !rcmail.env.sieveconnerror); } var i, p = rcmail, setcnt, set = rcmail.env.currentset; if (rcmail.gui_objects.filterslist) { rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist, {multiselect:false, draggable:true, keyboard:false}); rcmail.filters_list.addEventListener('select', function(e) { p.managesieve_select(e); }); rcmail.filters_list.addEventListener('dragstart', function(e) { p.managesieve_dragstart(e); }); rcmail.filters_list.addEventListener('dragend', function(e) { p.managesieve_dragend(e); }); rcmail.filters_list.row_init = function (row) { row.obj.onmouseover = function() { p.managesieve_focus_filter(row); }; row.obj.onmouseout = function() { p.managesieve_unfocus_filter(row); }; }; rcmail.filters_list.init(); rcmail.filters_list.focus(); } if (rcmail.gui_objects.filtersetslist) { rcmail.filtersets_list = new rcube_list_widget(rcmail.gui_objects.filtersetslist, {multiselect:false, draggable:false, keyboard:false}); rcmail.filtersets_list.addEventListener('select', function(e) { p.managesieve_setselect(e); }); rcmail.filtersets_list.init(); rcmail.filtersets_list.focus(); if (set != null) { set = rcmail.managesieve_setid(set); rcmail.filtersets_list.shift_start = set; rcmail.filtersets_list.highlight_row(set, false); } setcnt = rcmail.filtersets_list.rowcount; rcmail.enable_command('plugin.managesieve-set', true); rcmail.enable_command('plugin.managesieve-setact', 'plugin.managesieve-setget', setcnt); rcmail.enable_command('plugin.managesieve-setdel', setcnt > 1); // Fix dragging filters over sets list $('tr', rcmail.gui_objects.filtersetslist).each(function (i, e) { p.managesieve_fixdragend(e); }); } } if (rcmail.gui_objects.sieveform && rcmail.env.rule_disabled) $('#disabled').attr('checked', true); }); }; /*********************************************************/ /********* Managesieve UI methods *********/ /*********************************************************/ rcube_webmail.prototype.managesieve_add = function() { this.load_managesieveframe(); this.filters_list.clear_selection(); }; rcube_webmail.prototype.managesieve_del = function() { var id = this.filters_list.get_single_selection(); if (confirm(this.get_label('managesieve.filterdeleteconfirm'))) { var lock = this.set_busy(true, 'loading'); this.http_post('plugin.managesieve', '_act=delete&_fid='+this.filters_list.rows[id].uid, lock); } }; rcube_webmail.prototype.managesieve_act = function() { var id = this.filters_list.get_single_selection(), lock = this.set_busy(true, 'loading'); this.http_post('plugin.managesieve', '_act=act&_fid='+this.filters_list.rows[id].uid, lock); }; // Filter selection rcube_webmail.prototype.managesieve_select = function(list) { var id = list.get_single_selection(); if (id != null) this.load_managesieveframe(list.rows[id].uid); }; // Set selection rcube_webmail.prototype.managesieve_setselect = function(list) { this.show_contentframe(false); this.filters_list.clear(true); this.enable_command('plugin.managesieve-setdel', list.rowcount > 1); this.enable_command( 'plugin.managesieve-setact', 'plugin.managesieve-setget', true); var id = list.get_single_selection(); if (id != null) this.managesieve_list(this.env.filtersets[id]); }; rcube_webmail.prototype.managesieve_rowid = function(id) { var i, rows = this.filters_list.rows; for (i=0; i o.id) rows[i].uid = rows[i].uid-1; } break; // Update filter row case 'update': var i, row = $('#rcmrow'+o.id); if (o.name) $('td', row).html(o.name); if (o.disabled) row.addClass('disabled'); else row.removeClass('disabled'); $('#disabled', $('iframe').contents()).prop('checked', o.disabled); break; // Add filter row to the list case 'add': var list = this.filters_list, row = $(''); $('td', row).html(o.name); row.attr('id', 'rcmrow'+o.id); if (o.disabled) row.addClass('disabled'); list.insert_row(row.get(0)); list.highlight_row(o.id); this.enable_command('plugin.managesieve-del', 'plugin.managesieve-act', true); break; // Filling rules list case 'list': var i, tr, td, el, list = this.filters_list; if (o.clear) list.clear(); for (i in o.list) { el = o.list[i]; tr = document.createElement('TR'); td = document.createElement('TD'); td.innerHTML = el.name; td.className = 'name'; tr.id = 'rcmrow' + el.id; if (el['class']) tr.className = el['class']; tr.appendChild(td); list.insert_row(tr); } if (o.set) list.highlight_row(o.set); else this.enable_command('plugin.managesieve-del', 'plugin.managesieve-act', false); break; // Sactivate/deactivate set case 'setact': var id = this.managesieve_setid(o.name), row = $('#rcmrow' + id); if (o.active) { if (o.all) $('tr', this.gui_objects.filtersetslist).addClass('disabled'); row.removeClass('disabled'); } else row.addClass('disabled'); break; // Delete set row case 'setdel': var id = this.managesieve_setid(o.name); this.filtersets_list.remove_row(id); this.filters_list.clear(); this.show_contentframe(false); this.enable_command('plugin.managesieve-setdel', 'plugin.managesieve-setact', 'plugin.managesieve-setget', false); delete this.env.filtersets[id]; break; // Create set row case 'setadd': var id = 'S' + new Date().getTime(), list = this.filtersets_list, row = $(''); $('td', row).html(o.name); row.attr('id', 'rcmrow'+id); this.env.filtersets[id] = o.name; list.insert_row(row.get(0)); // move row into its position on the list if (o.index != list.rowcount-1) { row.detach(); var elem = $('tr:visible', list.list).get(o.index); row.insertBefore(elem); } list.select(id); // Fix dragging filters over sets list this.managesieve_fixdragend(row); break; } this.set_busy(false); }; // load filter frame rcube_webmail.prototype.load_managesieveframe = function(id) { var has_id = typeof(id) != 'undefined' && id != null; this.enable_command('plugin.managesieve-act', 'plugin.managesieve-del', has_id); if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) { target = window.frames[this.env.contentframe]; var msgid = this.set_busy(true, 'loading'); target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1' +(id ? '&_fid='+id : '')+'&_unlock='+msgid; } }; // load filter frame rcube_webmail.prototype.managesieve_dragstart = function(list) { var id = this.filters_list.get_single_selection(); this.drag_active = true; this.drag_filter = id; }; rcube_webmail.prototype.managesieve_dragend = function(e) { if (this.drag_active) { if (this.drag_filter_target) { var lock = this.set_busy(true, 'loading'); this.show_contentframe(false); this.http_post('plugin.managesieve', '_act=move&_fid='+this.drag_filter +'&_to='+this.drag_filter_target, lock); } this.drag_active = false; } }; // Fixes filters dragging over sets list // @TODO: to be removed after implementing copying filters rcube_webmail.prototype.managesieve_fixdragend = function(elem) { var p = this; $(elem).bind('mouseup' + ((bw.iphone || bw.ipad) ? ' touchend' : ''), function(e) { if (p.drag_active) p.filters_list.drag_mouse_up(e); }); }; rcube_webmail.prototype.managesieve_focus_filter = function(row) { var id = row.id.replace(/^rcmrow/, ''); if (this.drag_active && id != this.drag_filter) { this.drag_filter_target = id; $(row.obj).addClass(id < this.drag_filter ? 'filtermoveup' : 'filtermovedown'); } }; rcube_webmail.prototype.managesieve_unfocus_filter = function(row) { if (this.drag_active) { $(row.obj).removeClass('filtermoveup filtermovedown'); this.drag_filter_target = null; } }; /*********************************************************/ /********* Filter Form methods *********/ /*********************************************************/ // Form submition rcube_webmail.prototype.managesieve_save = function() { if (parent.rcmail && parent.rcmail.filters_list && this.gui_objects.sieveform.name != 'filtersetform') { var id = parent.rcmail.filters_list.get_single_selection(); if (id != null) this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid; } this.gui_objects.sieveform.submit(); }; // Operations on filters form rcube_webmail.prototype.managesieve_ruleadd = function(id) { this.http_post('plugin.managesieve', '_act=ruleadd&_rid='+id); }; rcube_webmail.prototype.managesieve_rulefill = function(content, id, after) { if (content != '') { // create new element var div = document.getElementById('rules'), row = document.createElement('div'); this.managesieve_insertrow(div, row, after); // fill row after inserting (for IE) row.setAttribute('id', 'rulerow'+id); row.className = 'rulerow'; row.innerHTML = content; this.managesieve_formbuttons(div); } }; rcube_webmail.prototype.managesieve_ruledel = function(id) { if ($('#ruledel'+id).hasClass('disabled')) return; if (confirm(this.get_label('managesieve.ruledeleteconfirm'))) { var row = document.getElementById('rulerow'+id); row.parentNode.removeChild(row); this.managesieve_formbuttons(document.getElementById('rules')); } }; rcube_webmail.prototype.managesieve_actionadd = function(id) { this.http_post('plugin.managesieve', '_act=actionadd&_aid='+id); }; rcube_webmail.prototype.managesieve_actionfill = function(content, id, after) { if (content != '') { var div = document.getElementById('actions'), row = document.createElement('div'); this.managesieve_insertrow(div, row, after); // fill row after inserting (for IE) row.className = 'actionrow'; row.setAttribute('id', 'actionrow'+id); row.innerHTML = content; this.managesieve_formbuttons(div); } }; rcube_webmail.prototype.managesieve_actiondel = function(id) { if ($('#actiondel'+id).hasClass('disabled')) return; if (confirm(this.get_label('managesieve.actiondeleteconfirm'))) { var row = document.getElementById('actionrow'+id); row.parentNode.removeChild(row); this.managesieve_formbuttons(document.getElementById('actions')); } }; // insert rule/action row in specified place on the list rcube_webmail.prototype.managesieve_insertrow = function(div, row, after) { for (var i=0; i0 || buttons.length>1) { $(button).removeClass('disabled'); } else { $(button).addClass('disabled'); } } }; function rule_header_select(id) { var obj = document.getElementById('header' + id), size = document.getElementById('rule_size' + id), op = document.getElementById('rule_op' + id), target = document.getElementById('rule_target' + id), header = document.getElementById('custom_header' + id), mod = document.getElementById('rule_mod' + id), trans = document.getElementById('rule_trans' + id), comp = document.getElementById('rule_comp' + id); if (obj.value == 'size') { size.style.display = 'inline'; op.style.display = 'none'; target.style.display = 'none'; header.style.display = 'none'; mod.style.display = 'none'; trans.style.display = 'none'; comp.style.display = 'none'; } else { header.style.display = obj.value != '...' ? 'none' : 'inline'; size.style.display = 'none'; op.style.display = 'inline'; comp.style.display = ''; rule_op_select(id); mod.style.display = obj.value == 'body' ? 'none' : 'block'; trans.style.display = obj.value == 'body' ? 'block' : 'none'; } obj.style.width = obj.value == '...' ? '40px' : ''; }; function rule_op_select(id) { var obj = document.getElementById('rule_op' + id), target = document.getElementById('rule_target' + id); target.style.display = obj.value == 'exists' || obj.value == 'notexists' ? 'none' : 'inline'; }; function rule_trans_select(id) { var obj = document.getElementById('rule_trans_op' + id), target = document.getElementById('rule_trans_type' + id); target.style.display = obj.value != 'content' ? 'none' : 'inline'; }; function rule_mod_select(id) { var obj = document.getElementById('rule_mod_op' + id), target = document.getElementById('rule_mod_type' + id); target.style.display = obj.value != 'address' && obj.value != 'envelope' ? 'none' : 'inline'; }; function rule_join_radio(value) { $('#rules').css('display', value == 'any' ? 'none' : 'block'); }; function rule_adv_switch(id, elem) { var elem = $(elem), enabled = elem.hasClass('hide'), adv = $('#rule_advanced'+id); if (enabled) { adv.hide(); elem.removeClass('hide').addClass('show'); } else { adv.show(); elem.removeClass('show').addClass('hide'); } } function action_type_select(id) { var obj = document.getElementById('action_type' + id), enabled = {}, elems = { mailbox: document.getElementById('action_mailbox' + id), target: document.getElementById('action_target' + id), target_area: document.getElementById('action_target_area' + id), flags: document.getElementById('action_flags' + id), vacation: document.getElementById('action_vacation' + id) }; if (obj.value == 'fileinto' || obj.value == 'fileinto_copy') { enabled.mailbox = 1; } else if (obj.value == 'redirect' || obj.value == 'redirect_copy') { enabled.target = 1; } else if (obj.value.match(/^reject|ereject$/)) { enabled.target_area = 1; } else if (obj.value.match(/^(add|set|remove)flag$/)) { enabled.flags = 1; } else if (obj.value == 'vacation') { enabled.vacation = 1; } for (var x in elems) { elems[x].style.display = !enabled[x] ? 'none' : 'inline'; } }; // Register onmouse(leave/enter) events for tips on specified form element rcube_webmail.prototype.managesieve_tip_register = function(tips) { var n, framed = parent.rcmail, tip = framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer; for (var n in tips) { $('#'+tips[n][0]) .bind('mouseenter', {str: tips[n][1]}, function(e) { var offset = $(this).offset(), left = offset.left, top = offset.top - 12; if (framed) { offset = $((rcmail.env.task == 'mail' ? '#sievefilterform > iframe' : '#filter-box'), parent.document).offset(); top += offset.top; left += offset.left; } tip.html(e.data.str) top -= tip.height(); tip.css({left: left, top: top}).show(); }) .bind('mouseleave', function(e) { tip.hide(); }); } }; /*********************************************************/ /********* Mail UI methods *********/ /*********************************************************/ rcube_webmail.prototype.managesieve_create = function() { if (!rcmail.env.sieve_headers || !rcmail.env.sieve_headers.length) return; var i, html, buttons = {}, dialog = $("#sievefilterform"); // create dialog window if (!dialog.length) { dialog = $('
'); $('body').append(dialog); } // build dialog window content html = '
'+this.gettext('managesieve.usedata')+'
    '; for (i in rcmail.env.sieve_headers) html += '
  • ' +' '+rcmail.env.sieve_headers[i][1]+'
  • '; html += '
'; dialog.html(html); // [Next Step] button action buttons[this.gettext('managesieve.nextstep')] = function () { // check if there's at least one checkbox checked var hdrs = $('input[name="headers[]"]:checked', dialog); if (!hdrs.length) { alert(rcmail.gettext('managesieve.nodata')); return; } // build frame URL var url = rcmail.get_task_url('mail'); url = rcmail.add_url(url, '_action', 'plugin.managesieve'); url = rcmail.add_url(url, '_framed', 1); hdrs.map(function() { var val = rcmail.env.sieve_headers[this.value]; url = rcmail.add_url(url, 'r['+this.value+']', val[0]+':'+val[1]); }); // load form in the iframe var frame = $('