alecpl
2009-10-06 ffeab7fe7e0ccf1d458d6a863600359c38769950
commit | author | age
a393c3 1 /* Sieve Filters (tab) */
A 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       {
91a35e 174         new_row = parent.document.createElement('tr');
a393c3 175         new_row.id = 'rcmrow'+id;
91a35e 176             td = parent.document.createElement('td');
a393c3 177             new_row.appendChild(td);
A 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 }