]> git.donarmstrong.com Git - roundcube.git/blob - plugins/managesieve/managesieve.js
Imported Upstream version 0.3
[roundcube.git] / plugins / managesieve / managesieve.js
1 /* Sieve Filters (tab) */
2
3 if (window.rcmail) {
4   rcmail.addEventListener('init', function(evt) {
5     // <span id="settingstabdefault" class="tablink"><roundcube:button command="preferences" type="link" label="preferences" title="editpreferences" /></span>
6     var tab = $('<span>').attr('id', 'settingstabpluginmanagesieve').addClass('tablink');
7     
8     var button = $('<a>').attr('href', rcmail.env.comm_path+'&_action=plugin.managesieve')
9         .attr('title', rcmail.gettext('managesieve.managefilters'))
10         .html(rcmail.gettext('managesieve.filters'))
11         .bind('click', function(e){ return rcmail.command('plugin.managesieve', this) })
12         .appendTo(tab);
13
14     // add button and register commands
15     rcmail.add_element(tab, 'tabs');
16     rcmail.register_command('plugin.managesieve', function() { rcmail.goto_url('plugin.managesieve') }, true);
17     rcmail.register_command('plugin.managesieve-save', function() { rcmail.managesieve_save() }, true);
18     rcmail.register_command('plugin.managesieve-add', function() { rcmail.managesieve_add() }, true);
19     rcmail.register_command('plugin.managesieve-del', function() { rcmail.managesieve_del() }, true);
20     rcmail.register_command('plugin.managesieve-up', function() { rcmail.managesieve_up() }, true);
21     rcmail.register_command('plugin.managesieve-down', function() { rcmail.managesieve_down() }, true);
22
23     if (rcmail.env.action == 'plugin.managesieve')
24       {
25         if (rcmail.gui_objects.sieveform)
26           rcmail.enable_command('plugin.managesieve-save', true);
27         else {
28           rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', 'plugin.managesieve-down', false);
29           rcmail.enable_command('plugin.managesieve-add', !rcmail.env.sieveconnerror);
30         }
31         
32         if (rcmail.gui_objects.filterslist) {
33             var p = rcmail;
34             rcmail.filters_list = new rcube_list_widget(rcmail.gui_objects.filterslist, {multiselect:false, draggable:false, keyboard:false});
35             rcmail.filters_list.addEventListener('select', function(o){ p.managesieve_select(o); });
36             rcmail.filters_list.init();
37             rcmail.filters_list.focus();
38           }
39       }
40   });
41
42   /*********************************************************/
43   /*********     Managesieve filters methods       *********/
44   /*********************************************************/
45
46   rcube_webmail.prototype.managesieve_add = function()
47     {
48       this.load_managesieveframe();
49       this.filters_list.clear_selection();
50     };
51
52   rcube_webmail.prototype.managesieve_del = function()
53     {
54     var id = this.filters_list.get_single_selection();
55
56     if (confirm(this.get_label('managesieve.filterconfirmdelete')))
57       this.http_request('plugin.managesieve',
58             '_act=delete&_fid='+this.filters_list.rows[id].uid, true);
59     };
60
61   rcube_webmail.prototype.managesieve_up = function()
62     {
63     var id = this.filters_list.get_single_selection();
64     this.http_request('plugin.managesieve',
65             '_act=up&_fid='+this.filters_list.rows[id].uid, true);
66     };
67
68   rcube_webmail.prototype.managesieve_down = function()
69     {
70     var id = this.filters_list.get_single_selection();
71     this.http_request('plugin.managesieve',
72             '_act=down&_fid='+this.filters_list.rows[id].uid, true);
73     };
74
75   rcube_webmail.prototype.managesieve_rowid = function(id)
76     {
77     var rows = this.filters_list.rows;
78     
79     for (var i=0; i<rows.length; i++)
80       if (rows[i] != null && rows[i].uid == id)
81         return i;
82     }
83
84   rcube_webmail.prototype.managesieve_updatelist = function(action, name, id)
85     {
86     this.set_busy(true);
87
88     switch (action)
89       {
90       case 'delete':
91         this.filters_list.remove_row(this.managesieve_rowid(id));
92         this.filters_list.clear_selection();
93         this.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', 'plugin.managesieve-down', false);
94         this.show_contentframe(false);
95
96         // re-numbering filters
97         var rows = this.filters_list.rows;
98         for (var i=0; i<rows.length; i++)
99           {
100           if (rows[i] != null && rows[i].uid > id)
101             rows[i].uid = rows[i].uid-1;
102           }
103         break;
104
105       case 'down':
106         var rows = this.filters_list.rows;
107         var from;
108
109         // we need only to replace filter names...
110         for (var i=0; i<rows.length; i++)
111         {
112           if (rows[i]==null) { // removed row
113             continue;
114           } else if (rows[i].uid == id) {
115             from = rows[i].obj.cells[0];
116           } else if (rows[i].uid == id+1){
117             name = rows[i].obj.cells[0].innerHTML;
118             rows[i].obj.cells[0].innerHTML = from.innerHTML;
119             from.innerHTML = name;
120             this.filters_list.highlight_row(i);
121             break;
122           }
123         }
124         // ... and disable/enable Down button
125         this.filters_listbuttons();
126         break;
127
128       case 'up':
129         var rows = this.filters_list.rows;
130         var from;
131
132         // we need only to replace filter names...
133         for (var i=0; i<rows.length; i++)
134         {
135           if (rows[i]==null) { // removed row
136             continue;
137           } else if (rows[i].uid == id-1) {
138             from = rows[i].obj.cells[0];
139             this.filters_list.highlight_row(i);
140           } else if (rows[i].uid == id) {
141             name = rows[i].obj.cells[0].innerHTML;
142             rows[i].obj.cells[0].innerHTML = from.innerHTML;
143             from.innerHTML = name;
144             break;
145           }
146         }
147         // ... and disable/enable Up button
148         this.filters_listbuttons();
149         break;
150         
151       case 'update':
152         var rows = parent.rcmail.filters_list.rows;
153         for (var i=0; i<rows.length; i++)
154           if (rows[i] && rows[i].uid == id)
155             {
156             rows[i].obj.cells[0].innerHTML = name;
157             break;
158             }
159         break;
160       
161       case 'add':
162         var row, new_row, td;
163         var list = parent.rcmail.filters_list;
164
165         if (!list)
166           break;
167
168         for (var i=0; i<list.rows.length; i++)
169           if (list.rows[i] != null && String(list.rows[i].obj.id).match(/^rcmrow/))
170             row = list.rows[i].obj;
171
172         if (row)
173           {
174             new_row = parent.document.createElement('tr');
175             new_row.id = 'rcmrow'+id;
176             td = parent.document.createElement('td');
177             new_row.appendChild(td);
178             list.insert_row(new_row, false);
179
180             if (row.cells[0].className)
181               td.className = row.cells[0].className;
182         
183             td.innerHTML = name;
184             list.highlight_row(id);
185
186             parent.rcmail.enable_command('plugin.managesieve-del', 'plugin.managesieve-up', true);
187           }
188         else // refresh whole page
189           parent.rcmail.goto_url('plugin.managesieve');
190         break;
191       }
192
193     this.set_busy(false);
194
195     };
196
197   rcube_webmail.prototype.managesieve_select = function(list)
198     {
199     var id = list.get_single_selection();
200     if (id != null)
201       this.load_managesieveframe(list.rows[id].uid);
202     };
203
204   rcube_webmail.prototype.managesieve_save = function()
205     {
206       if (parent.rcmail && parent.rcmail.filters_list)
207         {
208         var id = parent.rcmail.filters_list.get_single_selection();
209         if (id != null)
210           this.gui_objects.sieveform.elements['_fid'].value = parent.rcmail.filters_list.rows[id].uid;
211         }
212       this.gui_objects.sieveform.submit();
213     };
214
215   // load filter frame
216   rcube_webmail.prototype.load_managesieveframe = function(id)
217     {
218     if (typeof(id) != 'undefined' && id != null)
219       {
220       this.enable_command('plugin.managesieve-del', true);
221       this.filters_listbuttons();
222       }
223     else
224       this.enable_command('plugin.managesieve-up', 'plugin.managesieve-down', 'plugin.managesieve-del', false);
225
226     if (this.env.contentframe && window.frames && window.frames[this.env.contentframe])
227       {
228       target = window.frames[this.env.contentframe];
229       this.set_busy(true, 'loading');
230       target.location.href = this.env.comm_path+'&_action=plugin.managesieve&_framed=1&_fid='+id;
231       }
232     };
233
234   // enable/disable Up/Down buttons
235   rcube_webmail.prototype.filters_listbuttons = function()
236     {
237     var id = this.filters_list.get_single_selection();
238     var rows = this.filters_list.rows;
239
240     for (var i=0; i<rows.length; i++)
241       {
242       if (rows[i] == null) { // removed row
243         } else if (i == id) {
244           this.enable_command('plugin.managesieve-up', false);
245           break;
246         } else {
247           this.enable_command('plugin.managesieve-up', true);
248           break;
249         }
250       }
251
252     for (var i=rows.length-1; i>0; i--)
253       {
254         if (rows[i] == null) { // removed row
255         } else if (i == id) {
256           this.enable_command('plugin.managesieve-down', false);
257           break;
258         } else {
259           this.enable_command('plugin.managesieve-down', true);
260           break;
261         }
262       } 
263     };
264
265   // operations on filters form
266   rcube_webmail.prototype.managesieve_ruleadd = function(id)
267     {
268       this.http_post('plugin.managesieve', '_act=ruleadd&_rid='+id);
269     };
270
271   rcube_webmail.prototype.managesieve_rulefill = function(content, id, after)
272     {
273       if (content != '')
274         {
275         // create new element
276         var div = document.getElementById('rules');
277         var row = document.createElement('div');
278
279         this.managesieve_insertrow(div, row, after);
280         // fill row after inserting (for IE)
281         row.setAttribute('id', 'rulerow'+id);
282         row.className = 'rulerow';
283         row.innerHTML = content;
284
285         this.managesieve_formbuttons(div);
286         }
287     };
288
289   rcube_webmail.prototype.managesieve_ruledel = function(id)
290     {
291       if (confirm(this.get_label('managesieve.ruledeleteconfirm')))
292         {
293         var row = document.getElementById('rulerow'+id);
294         row.parentNode.removeChild(row);
295         this.managesieve_formbuttons(document.getElementById('rules'));
296         }
297     };
298
299   rcube_webmail.prototype.managesieve_actionadd = function(id)
300     {
301       this.http_post('plugin.managesieve', '_act=actionadd&_aid='+id);
302     };
303
304   rcube_webmail.prototype.managesieve_actionfill = function(content, id, after)
305     {
306       if (content != '')
307         {
308         var div = document.getElementById('actions');
309         var row = document.createElement('div');
310
311         this.managesieve_insertrow(div, row, after);
312         // fill row after inserting (for IE)
313         row.className = 'actionrow';
314         row.setAttribute('id', 'actionrow'+id);
315         row.innerHTML = content;
316
317         this.managesieve_formbuttons(div);
318         }
319     };
320
321   rcube_webmail.prototype.managesieve_actiondel = function(id)
322     {
323       if (confirm(this.get_label('managesieve.actiondeleteconfirm')))
324         {
325         var row = document.getElementById('actionrow'+id);
326         row.parentNode.removeChild(row);
327         this.managesieve_formbuttons(document.getElementById('actions'));
328         }
329     };
330
331   // insert rule/action row in specified place on the list
332   rcube_webmail.prototype.managesieve_insertrow = function(div, row, after)
333     {
334       for (var i=0; i<div.childNodes.length; i++)
335         {
336         if (div.childNodes[i].id == (div.id == 'rules' ? 'rulerow' : 'actionrow')  + after)
337           break;
338         }
339
340       if (div.childNodes[i+1])
341         div.insertBefore(row, div.childNodes[i+1]);
342       else
343         div.appendChild(row);
344     }
345
346   // update Delete buttons status
347   rcube_webmail.prototype.managesieve_formbuttons = function(div)
348     {
349       var buttons = new Array();
350       var i, j=0;
351       // count and get buttons
352       for (i=0; i<div.childNodes.length; i++)
353         {
354         if (div.id == 'rules' && div.childNodes[i].id)
355           {
356           if (/rulerow/.test(div.childNodes[i].id))
357             buttons.push('ruledel' + div.childNodes[i].id.replace(/rulerow/, ''));
358           }
359         else if (div.childNodes[i].id)
360           {
361           if (/actionrow/.test(div.childNodes[i].id))
362             buttons.push( 'actiondel' + div.childNodes[i].id.replace(/actionrow/, ''));
363           }
364         }
365
366       for (i=0; i<buttons.length; i++)
367         {
368         var button = document.getElementById(buttons[i]);
369         if (i>0 || buttons.length>1)
370           {
371           $(button).removeClass('disabled');
372           button.removeAttribute('disabled');
373           }
374         else
375           {
376           $(button).addClass('disabled');
377           button.setAttribute('disabled', true);
378           }
379         }
380     }
381 }