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