You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
582 lines
19 KiB
JavaScript
582 lines
19 KiB
JavaScript
/* Sieve Filters (tab) */
|
|
|
|
if (window.rcmail) {
|
|
rcmail.addEventListener('init', function(evt) {
|
|
|
|
var tab = $('<span>').attr('id', 'settingstabpluginmanagesieve').addClass('tablink');
|
|
var button = $('<a>').attr('href', rcmail.env.comm_path+'&_action=plugin.managesieve')
|
|
.attr('title', rcmail.gettext('managesieve.managefilters'))
|
|
.html(rcmail.gettext('managesieve.filters'))
|
|
.appendTo(tab);
|
|
|
|
// add button and register commands
|
|
rcmail.add_element(tab, 'tabs');
|
|
rcmail.register_command('plugin.managesieve-save', function() { rcmail.managesieve_save() }, true);
|
|
rcmail.register_command('plugin.managesieve-add', function() { rcmail.managesieve_add() }, true);
|
|
rcmail.register_command('plugin.managesieve-del', function() { rcmail.managesieve_del() }, true);
|
|
rcmail.register_command('plugin.managesieve-up', function() { rcmail.managesieve_up() }, true);
|
|
rcmail.register_command('plugin.managesieve-down', function() { rcmail.managesieve_down() }, true);
|
|
rcmail.register_command('plugin.managesieve-set', function() { rcmail.managesieve_set() }, true);
|
|
rcmail.register_command('plugin.managesieve-setadd', function() { rcmail.managesieve_setadd() }, true);
|
|
rcmail.register_command('plugin.managesieve-setdel', function() { rcmail.managesieve_setdel() }, true);
|
|
rcmail.register_command('plugin.managesieve-setact', function() { rcmail.managesieve_setact() }, true);
|
|
rcmail.register_command('plugin.managesieve-setget', function() { rcmail.managesieve_setget() }, true);
|
|
|
|
if (rcmail.env.action == 'plugin.managesieve') {
|
|
if (rcmail.gui_objects.sieveform) {
|
|
rcmail.enable_command('plugin.managesieve-save', true);
|
|
}
|
|
else {
|
|
rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up',
|
|
'plugin.managesieve-down', false);
|
|
rcmail.enable_command('plugin.managesieve-add', 'plugin.managesieve-setadd', !rcmail.env.sieveconnerror);
|
|
}
|
|
|
|
// Create layer for form tips
|
|
if (!rcmail.env.framed) {
|
|
rcmail.env.ms_tip_layer = $('<div id="managesieve-tip" class="popupmenu"></div>');
|
|
rcmail.env.ms_tip_layer.appendTo(document.body);
|
|
}
|
|
|
|
if (rcmail.gui_objects.filterslist) {
|
|
var p = rcmail;
|
|
rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist, {multiselect:false, draggable:false, keyboard:false});
|
|
rcmail.filters_list.addEventListener('select', function(o){ p.managesieve_select(o); });
|
|
rcmail.filters_list.init();
|
|
rcmail.filters_list.focus();
|
|
|
|
rcmail.enable_command('plugin.managesieve-set', true);
|
|
rcmail.enable_command('plugin.managesieve-setact', 'plugin.managesieve-setget', rcmail.gui_objects.filtersetslist.length);
|
|
rcmail.enable_command('plugin.managesieve-setdel', rcmail.gui_objects.filtersetslist.length > 1);
|
|
|
|
$('#'+rcmail.buttons['plugin.managesieve-setact'][0].id).attr('title', rcmail.gettext('managesieve.filterset'
|
|
+ (rcmail.gui_objects.filtersetslist.value == rcmail.env.active_set ? 'deact' : 'act')));
|
|
}
|
|
}
|
|
if (rcmail.gui_objects.sieveform && rcmail.env.rule_disabled)
|
|
$('#disabled').attr('checked', true);
|
|
});
|
|
};
|
|
|
|
/*********************************************************/
|
|
/********* Managesieve filters 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')))
|
|
this.http_request('plugin.managesieve',
|
|
'_act=delete&_fid='+this.filters_list.rows[id].uid, true);
|
|
};
|
|
|
|
rcube_webmail.prototype.managesieve_up = function()
|
|
{
|
|
var id = this.filters_list.get_single_selection();
|
|
this.http_request('plugin.managesieve',
|
|
'_act=up&_fid='+this.filters_list.rows[id].uid, true);
|
|
};
|
|
|
|
rcube_webmail.prototype.managesieve_down = function()
|
|
{
|
|
var id = this.filters_list.get_single_selection();
|
|
this.http_request('plugin.managesieve',
|
|
'_act=down&_fid='+this.filters_list.rows[id].uid, true);
|
|
};
|
|
|
|
rcube_webmail.prototype.managesieve_rowid = function(id)
|
|
{
|
|
var i, rows = this.filters_list.rows;
|
|
|
|
for (i=0; i<rows.length; i++)
|
|
if (rows[i] != null && rows[i].uid == id)
|
|
return i;
|
|
};
|
|
|
|
rcube_webmail.prototype.managesieve_updatelist = function(action, name, id, disabled)
|
|
{
|
|
this.set_busy(true);
|
|
|
|
switch (action) {
|
|
case 'delete':
|
|
this.filters_list.remove_row(this.managesieve_rowid(id));
|
|
this.filters_list.clear_selection();
|
|
this.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', 'plugin.managesieve-down', false);
|
|
this.show_contentframe(false);
|
|
|
|
// re-numbering filters
|
|
var i, rows = this.filters_list.rows;
|
|
for (i=0; i<rows.length; i++) {
|
|
if (rows[i] != null && rows[i].uid > id)
|
|
rows[i].uid = rows[i].uid-1;
|
|
}
|
|
break;
|
|
|
|
case 'down':
|
|
var from, fromstatus, status, rows = this.filters_list.rows;
|
|
|
|
// we need only to replace filter names...
|
|
for (var i=0; i<rows.length; i++) {
|
|
if (rows[i]==null) { // removed row
|
|
continue;
|
|
}
|
|
else if (rows[i].uid == id) {
|
|
from = rows[i].obj;
|
|
fromstatus = $(from).hasClass('disabled');
|
|
}
|
|
else if (rows[i].uid == id+1) {
|
|
name = rows[i].obj.cells[0].innerHTML;
|
|
status = $(rows[i].obj).hasClass('disabled');
|
|
rows[i].obj.cells[0].innerHTML = from.cells[0].innerHTML;
|
|
from.cells[0].innerHTML = name;
|
|
$(from)[status?'addClass':'removeClass']('disabled');
|
|
$(rows[i].obj)[fromstatus?'addClass':'removeClass']('disabled');
|
|
this.filters_list.highlight_row(i);
|
|
break;
|
|
}
|
|
}
|
|
// ... and disable/enable Down button
|
|
this.filters_listbuttons();
|
|
break;
|
|
|
|
case 'up':
|
|
var from, status, fromstatus, rows = this.filters_list.rows;
|
|
|
|
// we need only to replace filter names...
|
|
for (var i=0; i<rows.length; i++) {
|
|
if (rows[i] == null) { // removed row
|
|
continue;
|
|
}
|
|
else if (rows[i].uid == id-1) {
|
|
from = rows[i].obj;
|
|
fromstatus = $(from).hasClass('disabled');
|
|
this.filters_list.highlight_row(i);
|
|
}
|
|
else if (rows[i].uid == id) {
|
|
name = rows[i].obj.cells[0].innerHTML;
|
|
status = $(rows[i].obj).hasClass('disabled');
|
|
rows[i].obj.cells[0].innerHTML = from.cells[0].innerHTML;
|
|
from.cells[0].innerHTML = name;
|
|
$(from)[status?'addClass':'removeClass']('disabled');
|
|
$(rows[i].obj)[fromstatus?'addClass':'removeClass']('disabled');
|
|
break;
|
|
}
|
|
}
|
|
// ... and disable/enable Up button
|
|
this.filters_listbuttons();
|
|
break;
|
|
|
|
case 'update':
|
|
var rows = parent.rcmail.filters_list.rows;
|
|
for (var i=0; i<rows.length; i++)
|
|
if (rows[i] && rows[i].uid == id) {
|
|
rows[i].obj.cells[0].innerHTML = name;
|
|
if (disabled)
|
|
$(rows[i].obj).addClass('disabled');
|
|
else
|
|
$(rows[i].obj).removeClass('disabled');
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case 'add':
|
|
var row, new_row, td, list = parent.rcmail.filters_list;
|
|
|
|
if (!list)
|
|
break;
|
|
|
|
for (var i=0; i<list.rows.length; i++)
|
|
if (list.rows[i] != null && String(list.rows[i].obj.id).match(/^rcmrow/))
|
|
row = list.rows[i].obj;
|
|
|
|
if (row) {
|
|
new_row = parent.document.createElement('tr');
|
|
new_row.id = 'rcmrow'+id;
|
|
td = parent.document.createElement('td');
|
|
new_row.appendChild(td);
|
|
list.insert_row(new_row, false);
|
|
if (disabled)
|
|
$(new_row).addClass('disabled');
|
|
if (row.cells[0].className)
|
|
td.className = row.cells[0].className;
|
|
|
|
td.innerHTML = name;
|
|
list.highlight_row(id);
|
|
|
|
parent.rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', true);
|
|
}
|
|
else // refresh whole page
|
|
parent.rcmail.goto_url('plugin.managesieve');
|
|
break;
|
|
}
|
|
|
|
this.set_busy(false);
|
|
};
|
|
|
|
rcube_webmail.prototype.managesieve_select = function(list)
|
|
{
|
|
var id = list.get_single_selection();
|
|
if (id != null)
|
|
this.load_managesieveframe(list.rows[id].uid);
|
|
};
|
|
|
|
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();
|
|
};
|
|
|
|
// load filter frame
|
|
rcube_webmail.prototype.load_managesieveframe = function(id)
|
|
{
|
|
if (typeof(id) != 'undefined' && id != null) {
|
|
this.enable_command('plugin.managesieve-del', true);
|
|
this.filters_listbuttons();
|
|
}
|
|
else
|
|
this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
|
|
|
|
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&_fid='+id+'&_unlock='+msgid;
|
|
}
|
|
};
|
|
|
|
// enable/disable Up/Down buttons
|
|
rcube_webmail.prototype.filters_listbuttons = function()
|
|
{
|
|
var id = this.filters_list.get_single_selection(),
|
|
rows = this.filters_list.rows;
|
|
|
|
for (var i=0; i<rows.length; i++) {
|
|
if (rows[i] == null) { // removed row
|
|
}
|
|
else if (i == id) {
|
|
this.enable_command('plugin.managesieve-up', false);
|
|
break;
|
|
}
|
|
else {
|
|
this.enable_command('plugin.managesieve-up', true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (var i=rows.length-1; i>0; i--) {
|
|
if (rows[i] == null) { // removed row
|
|
}
|
|
else if (i == id) {
|
|
this.enable_command('plugin.managesieve-down', false);
|
|
break;
|
|
}
|
|
else {
|
|
this.enable_command('plugin.managesieve-down', true);
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
// 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 (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 (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; i<div.childNodes.length; i++) {
|
|
if (div.childNodes[i].id == (div.id == 'rules' ? 'rulerow' : 'actionrow') + after)
|
|
break;
|
|
}
|
|
|
|
if (div.childNodes[i+1])
|
|
div.insertBefore(row, div.childNodes[i+1]);
|
|
else
|
|
div.appendChild(row);
|
|
};
|
|
|
|
// update Delete buttons status
|
|
rcube_webmail.prototype.managesieve_formbuttons = function(div)
|
|
{
|
|
var i, button, buttons = [];
|
|
|
|
// count and get buttons
|
|
for (i=0; i<div.childNodes.length; i++) {
|
|
if (div.id == 'rules' && div.childNodes[i].id) {
|
|
if (/rulerow/.test(div.childNodes[i].id))
|
|
buttons.push('ruledel' + div.childNodes[i].id.replace(/rulerow/, ''));
|
|
}
|
|
else if (div.childNodes[i].id) {
|
|
if (/actionrow/.test(div.childNodes[i].id))
|
|
buttons.push( 'actiondel' + div.childNodes[i].id.replace(/actionrow/, ''));
|
|
}
|
|
}
|
|
|
|
for (i=0; i<buttons.length; i++) {
|
|
button = document.getElementById(buttons[i]);
|
|
if (i>0 || buttons.length>1) {
|
|
$(button).removeClass('disabled');
|
|
button.removeAttribute('disabled');
|
|
}
|
|
else {
|
|
$(button).addClass('disabled');
|
|
button.setAttribute('disabled', true);
|
|
}
|
|
}
|
|
};
|
|
|
|
// Set change
|
|
rcube_webmail.prototype.managesieve_set = function()
|
|
{
|
|
var script = $(this.gui_objects.filtersetslist).val();
|
|
location.href = this.env.comm_path+'&_action=plugin.managesieve&_set='+script;
|
|
};
|
|
|
|
// Script download
|
|
rcube_webmail.prototype.managesieve_setget = function()
|
|
{
|
|
var script = $(this.gui_objects.filtersetslist).val();
|
|
location.href = this.env.comm_path+'&_action=plugin.managesieve&_act=setget&_set='+script;
|
|
};
|
|
|
|
// Set activate
|
|
rcube_webmail.prototype.managesieve_setact = function()
|
|
{
|
|
if (!this.gui_objects.filtersetslist)
|
|
return false;
|
|
|
|
var script = this.gui_objects.filtersetslist.value,
|
|
action = (script == rcmail.env.active_set ? 'deact' : 'setact');
|
|
|
|
this.http_post('plugin.managesieve', '_act='+action+'&_set='+script);
|
|
};
|
|
|
|
// Set activate flag in sets list after set activation
|
|
rcube_webmail.prototype.managesieve_reset = function()
|
|
{
|
|
if (!this.gui_objects.filtersetslist)
|
|
return false;
|
|
|
|
var list = this.gui_objects.filtersetslist,
|
|
opts = list.getElementsByTagName('option'),
|
|
label = ' (' + this.get_label('managesieve.active') + ')',
|
|
regx = new RegExp(RegExp.escape(label)+'$');
|
|
|
|
for (var x=0; x<opts.length; x++) {
|
|
if (opts[x].value != rcmail.env.active_set && opts[x].innerHTML.match(regx))
|
|
opts[x].innerHTML = opts[x].innerHTML.replace(regx, '');
|
|
else if (opts[x].value == rcmail.env.active_set)
|
|
opts[x].innerHTML = opts[x].innerHTML + label;
|
|
}
|
|
|
|
// change title of setact button
|
|
$('#'+rcmail.buttons['plugin.managesieve-setact'][0].id).attr('title', rcmail.gettext('managesieve.filterset'
|
|
+ (list.value == rcmail.env.active_set ? 'deact' : 'act')));
|
|
};
|
|
|
|
// Set delete
|
|
rcube_webmail.prototype.managesieve_setdel = function()
|
|
{
|
|
if (!this.gui_objects.filtersetslist)
|
|
return false;
|
|
|
|
if (!confirm(this.get_label('managesieve.setdeleteconfirm')))
|
|
return false;
|
|
|
|
var script = this.gui_objects.filtersetslist.value;
|
|
this.http_post('plugin.managesieve', '_act=setdel&_set='+script);
|
|
};
|
|
|
|
// Set add
|
|
rcube_webmail.prototype.managesieve_setadd = function()
|
|
{
|
|
this.filters_list.clear_selection();
|
|
this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
|
|
|
|
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&_newset=1&_unlock='+msgid;
|
|
}
|
|
};
|
|
|
|
rcube_webmail.prototype.managesieve_reload = function(set)
|
|
{
|
|
this.env.reload_set = set;
|
|
window.setTimeout(function() {
|
|
location.href = rcmail.env.comm_path + '&_action=plugin.managesieve'
|
|
+ (rcmail.env.reload_set ? '&_set=' + rcmail.env.reload_set : '')
|
|
}, 500);
|
|
};
|
|
|
|
// Register onmouse(leave/enter) events for tips on specified form element
|
|
rcube_webmail.prototype.managesieve_tip_register = function(tips)
|
|
{
|
|
for (var n in tips) {
|
|
$('#'+tips[n][0])
|
|
.bind('mouseenter', {str: tips[n][1]},
|
|
function(e) {
|
|
var offset = $(this).offset(),
|
|
tip = rcmail.env.framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer,
|
|
left = offset.left,
|
|
top = offset.top - 12;
|
|
|
|
if (rcmail.env.framed) {
|
|
offset = $(parent.document.getElementById('filter-box')).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) {
|
|
var tip = parent.rcmail && parent.rcmail.env.ms_tip_layer ?
|
|
parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer;
|
|
tip.hide();
|
|
});
|
|
}
|
|
};
|
|
|
|
/*********************************************************/
|
|
/********* Other Managesieve UI methods *********/
|
|
/*********************************************************/
|
|
|
|
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);
|
|
|
|
if (obj.value == 'size') {
|
|
size.style.display = 'inline';
|
|
op.style.display = 'none';
|
|
target.style.display = 'none';
|
|
header.style.display = 'none';
|
|
}
|
|
else {
|
|
header.style.display = obj.value != '...' ? 'none' : 'inline';
|
|
size.style.display = 'none';
|
|
op.style.display = 'inline';
|
|
rule_op_select(id);
|
|
}
|
|
};
|
|
|
|
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_join_radio(value)
|
|
{
|
|
$('#rules').css('display', value == 'any' ? 'none' : 'block');
|
|
};
|
|
|
|
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';
|
|
}
|
|
};
|