]> git.donarmstrong.com Git - roundcube.git/blob - program/steps/settings/manage_folders.inc
Imported Upstream version 0.3
[roundcube.git] / program / steps / settings / manage_folders.inc
1 <?php
2
3 /*
4  +-----------------------------------------------------------------------+
5  | program/steps/settings/manage_folders.inc                             |
6  |                                                                       |
7  | This file is part of the RoundCube Webmail client                     |
8  | Copyright (C) 2005-2009, RoundCube Dev. - Switzerland                 |
9  | Licensed under the GNU GPL                                            |
10  |                                                                       |
11  | PURPOSE:                                                              |
12  |   Provide functionality to create/delete/rename folders               |
13  |                                                                       |
14  +-----------------------------------------------------------------------+
15  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
16  +-----------------------------------------------------------------------+
17
18  $Id: manage_folders.inc 2505 2009-05-20 09:55:15Z alec $
19
20 */
21
22 // WARNING: folder names in UI are encoded with RCMAIL_CHARSET
23
24 // init IMAP connection
25 $RCMAIL->imap_init(true);
26
27 // subscribe to one or more mailboxes
28 if ($RCMAIL->action=='subscribe')
29   {
30   if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST, false, 'UTF7-IMAP'))
31     $IMAP->subscribe(array($mbox));
32   }
33
34 // unsubscribe one or more mailboxes
35 else if ($RCMAIL->action=='unsubscribe')
36   {
37   if ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST, false, 'UTF7-IMAP'))
38     $IMAP->unsubscribe(array($mbox));
39   }
40
41 // create a new mailbox
42 else if ($RCMAIL->action=='create-folder')
43   {
44   if (!empty($_POST['_name']))
45     {
46     $name = trim(get_input_value('_name', RCUBE_INPUT_POST, FALSE, 'UTF7-IMAP'));
47     $create = $IMAP->create_mailbox($name, TRUE);
48     }
49   
50   if ($create && $OUTPUT->ajax_call)
51     {
52     $delimiter = $IMAP->get_hierarchy_delimiter();
53     $folderlist = $IMAP->list_unsubscribed();
54     $index = array_search($create, $folderlist);
55     $before = $index !== false && isset($folderlist[$index+1]) ? rcube_charset_convert($folderlist[$index+1], 'UTF7-IMAP') : false;
56     
57     $create = rcube_charset_convert($create, 'UTF7-IMAP');
58     $foldersplit = explode($delimiter, $create);
59     $display_create = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', substr_count($create, $delimiter)) . $foldersplit[count($foldersplit)-1];
60
61     $OUTPUT->command('add_folder_row', $create, $display_create, false, $before);
62     }
63   else if (!$create)
64     {
65     $OUTPUT->show_message('errorsaving', 'error');
66     }
67   }
68
69 // rename a mailbox
70 else if ($RCMAIL->action=='rename-folder')
71   {
72   if (!empty($_POST['_folder_oldname']) && !empty($_POST['_folder_newname']))
73     {
74     $name_utf8 = trim(get_input_value('_folder_newname', RCUBE_INPUT_POST));
75     $oldname_utf8 = get_input_value('_folder_oldname', RCUBE_INPUT_POST);
76     $name = rcube_charset_convert($name_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
77     $oldname = rcube_charset_convert($oldname_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
78
79     $rename = $IMAP->rename_mailbox($oldname, $name);
80     }
81
82   if ($rename && $OUTPUT->ajax_call)
83     {
84     $folderlist = $IMAP->list_unsubscribed();
85     $delimiter = $IMAP->get_hierarchy_delimiter();
86
87     $regexp = '/^' . preg_quote($rename . $delimiter, '/') . '/';
88
89     // subfolders
90     for ($x=sizeof($folderlist)-1; $x>=0; $x--)
91       {
92       if (preg_match($regexp, $folderlist[$x]))
93         {
94         $oldfolder = $oldname . $delimiter . preg_replace($regexp, '', $folderlist[$x]);
95         $foldersplit = explode($delimiter, $folderlist[$x]);
96         $level = count($foldersplit) - 1;
97         $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) 
98           . rcube_charset_convert($foldersplit[$level], 'UTF7-IMAP');
99
100         $before = isset($folderlist[$x+1]) ? rcube_charset_convert($folderlist[$x+1], 'UTF7-IMAP') : false;
101         
102         $OUTPUT->command('replace_folder_row', rcube_charset_convert($oldfolder, 'UTF7-IMAP'),
103           rcube_charset_convert($folderlist[$x], 'UTF7-IMAP'), $display_rename, $before);
104         }
105       }
106
107     $foldersplit = explode($delimiter, $rename);
108     $level = count($foldersplit) - 1;
109     $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF7-IMAP');
110     $index = array_search($rename, $folderlist);
111     $before = $index !== false && isset($folderlist[$index+1]) ? rcube_charset_convert($folderlist[$index+1], 'UTF7-IMAP') : false;
112
113     $OUTPUT->command('replace_folder_row', $oldname_utf8, rcube_charset_convert($rename, 'UTF7-IMAP'), $display_rename, $before);
114     $OUTPUT->command('reset_folder_rename');
115     }
116   else if (!$rename && $OUTPUT->ajax_call)
117     {
118     $OUTPUT->command('reset_folder_rename');
119     $OUTPUT->show_message('errorsaving', 'error');
120     }
121   else if (!$rename)
122     $OUTPUT->show_message('errorsaving', 'error');
123   }
124
125 // delete an existing IMAP mailbox
126 else if ($RCMAIL->action=='delete-folder')
127   {
128   $a_mboxes = $IMAP->list_unsubscribed();
129   $delimiter = $IMAP->get_hierarchy_delimiter();
130   
131   $mboxes_utf8 = get_input_value('_mboxes', RCUBE_INPUT_POST);
132   $mboxes = rcube_charset_convert($mboxes_utf8, RCMAIL_CHARSET, 'UTF7-IMAP');
133
134   if ($mboxes)
135     $deleted = $IMAP->delete_mailbox(array($mboxes));
136
137   if ($OUTPUT->ajax_call && $deleted)
138     {
139     $OUTPUT->command('remove_folder_row', $mboxes_utf8);
140     foreach ($a_mboxes as $mbox)
141       {
142       if (preg_match('/^'. preg_quote($mboxes.$delimiter, '/') .'/', $mbox))
143         {
144         $OUTPUT->command('remove_folder_row', rcube_charset_convert($mbox, 'UTF7-IMAP'));
145         }
146       }
147     $OUTPUT->show_message('folderdeleted', 'confirmation');
148     }
149   else if (!$deleted)
150     {
151     $OUTPUT->show_message('errorsaving', 'error');
152     }
153   }
154
155 if ($OUTPUT->ajax_call)
156   $OUTPUT->send();
157
158
159 // build table with all folders listed by server
160 function rcube_subscription_form($attrib)
161   {
162   global $IMAP, $CONFIG, $OUTPUT;
163
164   list($form_start, $form_end) = get_form_tags($attrib, 'folders');
165   unset($attrib['form']);
166   
167   if (!$attrib['id'])
168     $attrib['id'] = 'rcmSubscriptionlist';
169
170   $table = new html_table();
171
172   // add table header
173   $table->add_header('name', rcube_label('foldername'));
174   $table->add_header('msgcount', rcube_label('messagecount'));
175   $table->add_header('subscribed', rcube_label('subscribed'));
176   $table->add_header('rename', '&nbsp;');
177   $table->add_header('delete', '&nbsp;');
178
179
180   // get folders from server
181   $IMAP->clear_cache('mailboxes');
182
183   $a_unsubscribed = $IMAP->list_unsubscribed();
184   $a_subscribed = $IMAP->list_mailboxes();
185   $delimiter = $IMAP->get_hierarchy_delimiter();
186   $a_js_folders = $seen_folders = $list_folders = array();
187
188   // pre-process folders list
189   foreach ($a_unsubscribed as $i => $folder) {
190     $foldersplit = explode($delimiter, $folder);
191     $name = rcube_charset_convert(array_pop($foldersplit), 'UTF7-IMAP');
192     $parent_folder = join($delimiter, $foldersplit);
193     $level = count($foldersplit);
194
195     // add any necessary "virtual" parent folders
196     if ($parent_folder && !$seen[$parent_folder]) {
197       for ($i=1; $i<=$level; $i++) {
198         $ancestor_folder = join($delimiter, array_slice($foldersplit, 0, $i));
199         if ($ancestor_folder && !$seen[$ancestor_folder]++) {
200           $ancestor_name = rcube_charset_convert($foldersplit[$i-1], 'UTF7-IMAP');
201           $list_folders[] = array('id' => $ancestor_folder, 'name' => $ancestor_name, 'level' => $i-1, 'virtual' => true);
202         }
203       }
204     }
205     
206     $list_folders[] = array('id' => $folder, 'name' => $name, 'level' => $level);
207     $seen[$folder]++;
208   }
209
210   $checkbox_subscribe = new html_checkbox(array(
211     'name' => '_subscribed[]',
212     'onclick' => JS_OBJECT_NAME.".command(this.checked?'subscribe':'unsubscribe',this.value)",
213   ));
214   
215   if (!empty($attrib['deleteicon']))
216     $del_button = html::img(array('src' => $CONFIG['skin_path'] . $attrib['deleteicon'], 'alt' => rcube_label('delete')));
217   else
218     $del_button = rcube_label('delete');
219
220   if (!empty($attrib['renameicon']))
221     $edit_button = html::img(array('src' => $CONFIG['skin_path'] . $attrib['renameicon'], 'alt' => rcube_label('rename')));
222   else
223     $edit_button = rcube_label('rename');
224     
225   // create list of available folders
226   foreach ($list_folders as $i => $folder) {
227     $idx = $i + 1;
228     $subscribed = in_array($folder['id'], $a_subscribed);
229     $protected = ($CONFIG['protect_default_folders'] == true && in_array($folder['id'], $CONFIG['default_imap_folders']));
230     $classes = array($i%2 ? 'even' : 'odd');
231     $folder_js = JQ($folder['id']);
232     $display_folder = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $folder['level']) . ($protected ? rcmail_localize_foldername($folder['id']) : $folder['name']);
233     $folder_utf8 = rcube_charset_convert($folder['id'], 'UTF7-IMAP');
234     
235     if ($folder['virtual'])
236       $classes[] = 'virtual';
237     
238     $table->add_row(array('id' => 'rcmrow'.$idx, 'class' => join(' ', $classes)));
239     
240     $table->add('name', Q($display_folder));
241     $table->add('msgcount', ($folder['virtual'] ? '' : $IMAP->messagecount($folder['id'])));
242     $table->add('subscribed', ($protected || $folder['virtual']) ? ($subscribed ? '&nbsp;&#x2022;' : '&nbsp;') :
243         $checkbox_subscribe->show(($subscribed ? $folder_utf8 : ''), array('value' => $folder_utf8)));
244     
245     // add rename and delete buttons
246     if (!$protected && !$folder['virtual']) {
247       $table->add('rename', html::a(array('href' => "#rename", 'title' => rcube_label('renamefolder')), $edit_button));
248       $table->add('delete', html::a(array('href' => "#delete", 'title' => rcube_label('deletefolder')), $del_button));
249     }
250     else {
251       $table->add('rename', '&nbsp;');
252       $table->add('delete', '&nbsp;');
253     }
254     
255     $a_js_folders['rcmrow'.$idx] = array($folder_utf8, $display_folder, $protected || $folder['virtual']);
256   }
257
258   rcmail::get_instance()->plugins->exec_hook('manage_folders', array('table'=>$table));
259
260   $OUTPUT->add_gui_object('subscriptionlist', $attrib['id']);
261   $OUTPUT->set_env('subscriptionrows', $a_js_folders);
262   $OUTPUT->set_env('defaultfolders', $CONFIG['default_imap_folders']);
263   $OUTPUT->set_env('delimiter', $delimiter);
264
265   return $form_start . $table->show($attrib) . $form_end;
266   }
267
268
269 function rcube_create_folder_form($attrib)
270   {
271   global $OUTPUT;
272   
273   list($form_start, $form_end) = get_form_tags($attrib, 'create-folder');
274   unset($attrib['form']);
275
276   if ($attrib['hintbox'])
277     $OUTPUT->add_gui_object('createfolderhint', $attrib['hintbox']);
278
279   // return the complete edit form as table
280   $out = "$form_start\n";
281
282   $input = new html_inputfield(array('name' => '_folder_name'));
283   $out .= $input->show();
284   
285   if (get_boolean($attrib['button']))
286     {
287     $button = new html_inputfield(array('type' => 'button',
288                                     'value' => rcube_label('create'),
289                                     'onclick' => JS_OBJECT_NAME.".command('create-folder',this.form)"));
290     $out .= $button->show();
291     }
292
293   $out .= "\n$form_end";
294
295   return $out;
296   }
297
298 function rcube_rename_folder_form($attrib)
299   {
300   global $CONFIG, $IMAP;
301
302   list($form_start, $form_end) = get_form_tags($attrib, 'rename-folder');
303   unset($attrib['form']);
304
305   // return the complete edit form as table
306   $out = "$form_start\n";
307
308   $a_unsubscribed = $IMAP->list_unsubscribed();
309   $select_folder = new html_select(array('name' => '_folder_oldname', 'id' => 'rcmfd_oldfolder'));
310
311   foreach ($a_unsubscribed as $i => $folder)
312     {
313     if ($CONFIG['protect_default_folders'] == TRUE && in_array($folder,$CONFIG['default_imap_folders'])) 
314       continue;
315
316     $select_folder->add($folder);
317     }
318
319   $out .= $select_folder->show();
320
321   $out .= " to ";
322   $inputtwo = new html_inputfield(array('name' => '_folder_newname'));
323   $out .= $inputtwo->show();
324
325   if (get_boolean($attrib['button']))
326     {
327     $button = new html_inputfield(array('type' => 'button',
328                                     'value' => rcube_label('rename'),
329                                     'onclick' => JS_OBJECT_NAME.".command('rename-folder',this.form)"));
330     $out .= $button->show();
331     }
332
333   $out .= "\n$form_end";
334   
335   return $out;
336   }
337
338 $OUTPUT->set_pagetitle(rcube_label('folders'));
339 $OUTPUT->include_script('list.js');
340
341 // register UI objects
342 $OUTPUT->add_handlers(array(
343   'foldersubscription' => 'rcube_subscription_form',
344   'createfolder' => 'rcube_create_folder_form',
345   'renamefolder' => 'rcube_rename_folder_form'
346 ));
347
348 // add some labels to client
349 $OUTPUT->add_label('deletefolderconfirm','addsubfolderhint','forbiddencharacter','folderdeleting','folderrenaming','foldercreating','foldermoving');
350
351 $OUTPUT->send('managefolders');
352 ?>