Dotclear

source: admin/preferences.php @ 500:f88db2e809f4

Revision 500:f88db2e809f4, 19.2 KB checked in by kozlika, 13 years ago (diff)

First step for #1247. Il faudra revenir sur les pages media.php, permissions.php, plugins/antispam/index.php (la couleur on verra après ; pour l'instant c'est très voyant, très pratique pour bosser et aussi très gai, na !)

Dans ce commit aussi : réorganisation de la feuille de style pour s'y retrouver plus facilement.

Line 
1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Dotclear 2.
5#
6# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
12
13require dirname(__FILE__).'/../inc/admin/prepend.php';
14
15dcPage::check('usage,contentadmin');
16
17$page_title = __('My preferences');
18
19$user_name = $core->auth->getInfo('user_name');
20$user_firstname = $core->auth->getInfo('user_firstname');
21$user_displayname = $core->auth->getInfo('user_displayname');
22$user_email = $core->auth->getInfo('user_email');
23$user_url = $core->auth->getInfo('user_url');
24$user_lang = $core->auth->getInfo('user_lang');
25$user_tz = $core->auth->getInfo('user_tz');
26$user_post_status = $core->auth->getInfo('user_post_status');
27
28$user_options = $core->auth->getOptions();
29
30$core->auth->user_prefs->addWorkspace('dashboard');
31$user_dm_doclinks = $core->auth->user_prefs->dashboard->doclinks;
32$user_dm_dcnews = $core->auth->user_prefs->dashboard->dcnews;
33$user_dm_quickentry = $core->auth->user_prefs->dashboard->quickentry;
34
35$core->auth->user_prefs->addWorkspace('accessibility');
36$user_acc_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop;
37
38$core->auth->user_prefs->addWorkspace('interface');
39$user_ui_enhanceduploader = $core->auth->user_prefs->interface->enhanceduploader;
40if ($core->auth->isSuperAdmin()) {
41     $user_ui_hide_std_favicon = $core->auth->user_prefs->interface->hide_std_favicon;
42}
43
44$default_tab = !empty($_GET['tab']) ? html::escapeHTML($_GET['tab']) : 'user-profile';
45
46if (!empty($_GET['append']) || !empty($_GET['removed']) || !empty($_GET['neworder']) || !empty($_GET['replaced'])) {
47     $default_tab = 'user-favorites';
48} elseif (!empty($_GET['updated'])) {
49     $default_tab = 'user-options';
50}
51if (($default_tab != 'user-profile') && ($default_tab != 'user-options') && ($default_tab != 'user-favorites')) {
52     $default_tab = 'user-profile';
53}
54
55foreach ($core->getFormaters() as $v) {
56     $formaters_combo[$v] = $v;
57}
58
59foreach ($core->blog->getAllPostStatus() as $k => $v) {
60     $status_combo[$v] = $k;
61}
62
63# Language codes
64$langs = l10n::getISOcodes(1,1);
65foreach ($langs as $k => $v) {
66     $lang_avail = $v == 'en' || is_dir(DC_L10N_ROOT.'/'.$v);
67     $lang_combo[] = new formSelectOption($k,$v,$lang_avail ? 'avail10n' : '');
68}
69
70# Add or update user
71if (isset($_POST['user_name']))
72{
73     try
74     {
75          $pwd_check = !empty($_POST['cur_pwd']) && $core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['cur_pwd']));
76         
77          if ($core->auth->allowPassChange() && !$pwd_check && $user_email != $_POST['user_email']) {
78               throw new Exception(__('If you want to change your email or password you must provide your current password.'));
79          }
80         
81          $cur = $core->con->openCursor($core->prefix.'user');
82         
83          $cur->user_name = $user_name = $_POST['user_name'];
84          $cur->user_firstname = $user_firstname = $_POST['user_firstname'];
85          $cur->user_displayname = $user_displayname = $_POST['user_displayname'];
86          $cur->user_email = $user_email = $_POST['user_email'];
87          $cur->user_url = $user_url = $_POST['user_url'];
88          $cur->user_lang = $user_lang = $_POST['user_lang'];
89          $cur->user_tz = $user_tz = $_POST['user_tz'];
90
91          $cur->user_options = new ArrayObject($user_options);
92         
93          if ($core->auth->allowPassChange() && !empty($_POST['new_pwd']))
94          {
95               if (!$pwd_check) {
96                    throw new Exception(__('If you want to change your email or password you must provide your current password.'));
97               }
98               
99               if ($_POST['new_pwd'] != $_POST['new_pwd_c']) {
100                    throw new Exception(__("Passwords don't match"));
101               }
102               
103               $cur->user_pwd = $_POST['new_pwd'];
104          }
105         
106          # --BEHAVIOR-- adminBeforeUserUpdate
107          $core->callBehavior('adminBeforeUserProfileUpdate',$cur,$core->auth->userID());
108         
109          # Udate user
110          $core->updUser($core->auth->userID(),$cur);
111         
112          # --BEHAVIOR-- adminAfterUserUpdate
113          $core->callBehavior('adminAfterUserProfileUpdate',$cur,$core->auth->userID());
114         
115          http::redirect('preferences.php?upd=1');
116     }
117     catch (Exception $e)
118     {
119          $core->error->add($e->getMessage());
120     }
121}
122
123# Update user options
124if (isset($_POST['user_post_format'])) {
125     try
126     {
127          $cur = $core->con->openCursor($core->prefix.'user');
128         
129          $cur->user_name = $user_name;
130          $cur->user_firstname = $user_firstname;
131          $cur->user_displayname = $user_displayname;
132          $cur->user_email = $user_email;
133          $cur->user_url = $user_url;
134          $cur->user_lang = $user_lang;
135          $cur->user_tz = $user_tz;
136
137          $cur->user_post_status = $user_post_status = $_POST['user_post_status'];
138         
139          $user_options['edit_size'] = (integer) $_POST['user_edit_size'];
140          if ($user_options['edit_size'] < 1) {
141               $user_options['edit_size'] = 10;
142          }
143          $user_options['post_format'] = $_POST['user_post_format'];
144          $user_options['enable_wysiwyg'] = !empty($_POST['user_wysiwyg']);
145         
146          $cur->user_options = new ArrayObject($user_options);
147         
148          # --BEHAVIOR-- adminBeforeUserUpdate
149          $core->callBehavior('adminBeforeUserUpdate',$cur,$core->auth->userID());
150         
151          # Update user prefs
152          $core->auth->user_prefs->dashboard->put('doclinks',!empty($_POST['user_dm_doclinks']),'boolean');
153          $core->auth->user_prefs->dashboard->put('dcnews',!empty($_POST['user_dm_dcnews']),'boolean');
154          $core->auth->user_prefs->dashboard->put('quickentry',!empty($_POST['user_dm_quickentry']),'boolean');
155          $core->auth->user_prefs->accessibility->put('nodragdrop',!empty($_POST['user_acc_nodragdrop']),'boolean');
156          $core->auth->user_prefs->interface->put('enhanceduploader',!empty($_POST['user_ui_enhanceduploader']),'boolean');
157          if ($core->auth->isSuperAdmin()) {
158               # Applied to all users
159               $core->auth->user_prefs->interface->put('hide_std_favicon',!empty($_POST['user_ui_hide_std_favicon']),'boolean',null,true,true);
160          }
161         
162          # Udate user
163          $core->updUser($core->auth->userID(),$cur);
164         
165          # --BEHAVIOR-- adminAfterUserUpdate
166          $core->callBehavior('adminAfterUserUpdate',$cur,$core->auth->userID());
167         
168          http::redirect('preferences.php?updated=1');
169     }
170     catch (Exception $e)
171     {
172          $core->error->add($e->getMessage());
173     }
174}
175
176# Add selected favorites
177if (!empty($_POST['appendaction']) && !empty($_POST['append'])) {
178     $ws = $core->auth->user_prefs->addWorkspace('favorites');
179     $user_favs = $ws->DumpLocalPrefs();
180     $count = count($user_favs);
181     foreach ($_POST['append'] as $k => $v)
182     {
183          try {
184               $found = false;
185               foreach ($user_favs as $f) {
186                    $f = unserialize($f['value']);
187                    if ($f['name'] == $v) {
188                         $found = true;
189                         break;
190                    }
191               }
192               if (!$found) {
193                    $uid = sprintf("u%03s",$count);
194                    $fav = array('name' => $_fav[$v][0],'title' => $_fav[$v][1],'url' => $_fav[$v][2],'small-icon' => $_fav[$v][3],
195                         'large-icon' => $_fav[$v][4],'permissions' => $_fav[$v][5],'id' => $_fav[$v][6],'class' => $_fav[$v][7]);
196                    $core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
197                    $count++;
198               }
199          } catch (Exception $e) {
200               $core->error->add($e->getMessage());
201               break;
202          }
203     }
204     
205     if (!$core->error->flag()) {
206          http::redirect('preferences.php?append=1');
207     }
208}
209
210# Delete selected favorites
211if (!empty($_POST['removeaction']) && !empty($_POST['remove'])) {
212     $ws = $core->auth->user_prefs->addWorkspace('favorites');
213     foreach ($_POST['remove'] as $k => $v)
214     {
215          try {
216               $core->auth->user_prefs->favorites->drop($v);
217          } catch (Exception $e) {
218               $core->error->add($e->getMessage());
219               break;
220          }
221     }
222     // Update pref_id values
223     try {
224          $user_favs = $ws->DumpLocalPrefs();
225          $core->auth->user_prefs->favorites->dropAll();
226          $count = 0;
227          foreach ($user_favs as $k => $v)
228          {
229               $uid = sprintf("u%03s",$count);
230               $f = unserialize($v['value']);
231               $fav = array('name' => $f['name'],'title' => $f['title'],'url' => $f['url'],'small-icon' => $f['small-icon'],
232                    'large-icon' => $f['large-icon'],'permissions' => $f['permissions'],'id' => $f['id'],'class' => $f['class']);
233               $core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
234               $count++;
235          }
236     } catch (Exception $e) {
237          $core->error->add($e->getMessage());
238     }
239     
240     if (!$core->error->flag()) {
241          http::redirect('preferences.php?removed=1');
242     }
243}
244
245# Order favs
246$order = array();
247if (empty($_POST['favs_order']) && !empty($_POST['order'])) {
248     $order = $_POST['order'];
249     asort($order);
250     $order = array_keys($order);
251} elseif (!empty($_POST['favs_order'])) {
252     $order = explode(',',$_POST['favs_order']);
253}
254
255if (!empty($_POST['saveorder']) && !empty($order))
256{
257     try {
258          $ws = $core->auth->user_prefs->addWorkspace('favorites');
259          $user_favs = $ws->DumpLocalPrefs();
260          $core->auth->user_prefs->favorites->dropAll();
261          $count = 0;
262          foreach ($order as $i => $k) {
263               $uid = sprintf("u%03s",$count);
264               $f = unserialize($user_favs[$k]['value']);
265               $fav = array('name' => $f['name'],'title' => $f['title'],'url' => $f['url'],'small-icon' => $f['small-icon'],
266                    'large-icon' => $f['large-icon'],'permissions' => $f['permissions'],'id' => $f['id'],'class' => $f['class']);
267               $core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
268               $count++;
269          }
270     } catch (Exception $e) {
271          $core->error->add($e->getMessage());
272     }
273
274     if (!$core->error->flag()) {
275          http::redirect('preferences.php?&neworder=1');
276     }
277}
278
279# Replace default favorites by current set (super admin only)
280if (!empty($_POST['replace']) && $core->auth->isSuperAdmin()) {
281     try {
282          $ws = $core->auth->user_prefs->addWorkspace('favorites');
283          $user_favs = $ws->DumpLocalPrefs();
284          $core->auth->user_prefs->favorites->dropAll(true);
285          $count = 0;
286          foreach ($user_favs as $k => $v)
287          {
288               $uid = sprintf("g%03s",$count);
289               $f = unserialize($v['value']);
290               $fav = array('name' => $f['name'],'title' => $f['title'],'url' => $f['url'],'small-icon' => $f['small-icon'],
291                    'large-icon' => $f['large-icon'],'permissions' => $f['permissions'],'id' => $f['id'],'class' => $f['class']);
292               $core->auth->user_prefs->favorites->put($uid,serialize($fav),'string',null,null,true);
293               $count++;
294          }
295     } catch (Exception $e) {
296          $core->error->add($e->getMessage());
297     }
298
299     if (!$core->error->flag()) {
300          http::redirect('preferences.php?&replaced=1');
301     }
302}
303
304/* DISPLAY
305-------------------------------------------------------- */
306dcPage::open($page_title,
307     dcPage::jsLoad('js/_preferences.js').
308     ($user_acc_nodragdrop ? '' : dcPage::jsLoad('js/_preferences-dragdrop.js')).
309     dcPage::jsLoad('js/jquery/jquery-ui-1.8.12.custom.min.js').
310     dcPage::jsPageTabs($default_tab).
311     dcPage::jsConfirmClose('user-form').
312     
313     # --BEHAVIOR-- adminPreferencesHeaders
314     $core->callBehavior('adminPreferencesHeaders')
315);
316
317if (!empty($_GET['upd'])) {
318          echo '<p class="message">'.__('Personal information has been successfully updated.').'</p>';
319}
320if (!empty($_GET['updated'])) {
321          echo '<p class="message">'.__('Personal options has been successfully updated.').'</p>';
322}
323if (!empty($_GET['append'])) {
324          echo '<p class="message">'.__('Favorites have been successfully added.').'</p>';
325}
326if (!empty($_GET['neworder'])) {
327     echo '<p class="message">'.__('Favorites have been successfully updated.').'</p>';
328}
329if (!empty($_GET['removed'])) {
330          echo '<p class="message">'.__('Favorites have been successfully removed.').'</p>';
331}
332if (!empty($_GET['replaced'])) {
333          echo '<p class="message">'.__('Default favorites have been successfully updated.').'</p>';
334}
335
336echo '<h2 class="page-title">'.$page_title.'</h2>';
337
338# User profile
339echo '<div class="multi-part" id="user-profile" title="'.__('My profile').'">';
340
341echo
342'<form action="preferences.php" method="post" id="user-form">'.
343'<fieldset><legend>'.__('My profile').'</legend>'.
344'<div class="two-cols">'.
345'<div class="col">'.
346'<p><label for="user_name">'.__('Last Name:').
347form::field('user_name',20,255,html::escapeHTML($user_name)).'</label></p>'.
348
349'<p><label for="user_firstname">'.__('First Name:').
350form::field('user_firstname',20,255,html::escapeHTML($user_firstname)).'</label></p>'.
351
352'<p><label for="user_displayname">'.__('Display name:').
353form::field('user_displayname',20,255,html::escapeHTML($user_displayname)).'</label></p>'.
354
355'<p><label for="user_email">'.__('Email:').
356form::field('user_email',20,255,html::escapeHTML($user_email)).'</label></p>'.
357
358'<p><label for="user_url">'.__('URL:').
359form::field('user_url',30,255,html::escapeHTML($user_url)).'</label></p>'.
360
361'</div>'.
362
363'<div class="col">'.
364
365'<p><label for="user_lang">'.__('User language:').
366form::combo('user_lang',$lang_combo,$user_lang,'l10n').'</label></p>'.
367
368'<p><label for="user_tz">'.__('User timezone:').
369form::combo('user_tz',dt::getZones(true,true),$user_tz).'</label></p>'.
370
371'</div>'.
372'</div>'.
373'<br class="clear" />'. //Opera sucks
374'</fieldset>';
375
376if ($core->auth->allowPassChange())
377{
378     echo
379     '<fieldset>'.
380     '<legend>'.__('Change your password').'</legend>'.
381     
382     '<p><label for="new_pwd">'.__('New password:').
383     form::password('new_pwd',20,255).'</label></p>'.
384     
385     '<p><label for="new_pwd_c">'.__('Confirm password:').
386     form::password('new_pwd_c',20,255).'</label></p>'.
387     '</fieldset>'.
388     
389     '<fieldset>'.
390     '<p>'.__('If you want to change your email or password you must provide your current password.').'</p>'.
391     '<p><label for="cur_pwd">'.__('Your password:').
392     form::password('cur_pwd',20,255).'</label></p>'.
393     '</fieldset>';
394}
395
396echo
397'<p class="clear">'.
398$core->formNonce().
399'<input type="submit" accesskey="s" value="'.__('Save').'" /></p>'.
400'</form>';
401
402echo '</div>';
403
404# User options : some from actual user profile, dashboard modules, ...
405echo '<div class="multi-part" id="user-options" title="'.__('My options').'">';
406
407echo
408'<form action="preferences.php" method="post" id="opts-forms">'.
409'<fieldset><legend>'.__('My options').'</legend>'.
410
411'<p><label for="user_post_format">'.__('Preferred format:').
412form::combo('user_post_format',$formaters_combo,$user_options['post_format']).'</label></p>'.
413
414'<p><label for="user_post_status">'.__('Default entry status:').
415form::combo('user_post_status',$status_combo,$user_post_status).'</label></p>'.
416
417'<p><label for="user_edit_size">'.__('Entry edit field height:').
418form::field('user_edit_size',5,4,(integer) $user_options['edit_size']).'</label></p>'.
419
420'<p><label for="user_wysiwyg" class="classic">'.
421form::checkbox('user_wysiwyg',1,$user_options['enable_wysiwyg']).' '.
422__('Enable WYSIWYG mode').'</label></p>'.
423
424'<p><label for="user_ui_enhanceduploader" class="classic">'.
425form::checkbox('user_ui_enhanceduploader',1,$user_ui_enhanceduploader).' '.
426__('Activate enhanced uploader in media manager').'</label></p>';
427
428if ($core->auth->isSuperAdmin()) {
429     echo
430     '<p><label for="user_ui_hide_std_favicon" class="classic">'.
431     form::checkbox('user_ui_hide_std_favicon',1,$user_ui_hide_std_favicon).' '.
432     __('Do not use standard favicon').'</label></p>'.
433     '<p class="clear form-note info">'.__('This will be applied for all users').'</p>';
434}
435
436echo 
437'<br class="clear" />'. //Opera sucks
438'</fieldset>';
439
440echo
441'<fieldset><legend>'.__('Accessibility options').'</legend>'.
442
443'<p><label for="user_acc_nodragdrop" class="classic">'.
444form::checkbox('user_acc_nodragdrop',1,$user_acc_nodragdrop).' '.
445__('Disable javascript powered drag and drop for ordering items').'</label></p>'.
446
447'<p class="clear form-note info">'.__('Numeric fields will allow to type the elements\' ordering number.').'</p>'.
448'</fieldset>';
449
450echo
451'<fieldset><legend>'.__('Dashboard modules').'</legend>'.
452
453'<p><label for="user_dm_doclinks" class="classic">'.
454form::checkbox('user_dm_doclinks',1,$user_dm_doclinks).' '.
455__('Display documentation links').'</label></p>'.
456
457'<p><label for="user_dm_dcnews" class="classic">'.
458form::checkbox('user_dm_dcnews',1,$user_dm_dcnews).' '.
459__('Display Dotclear news').'</label></p>'.
460
461'<p><label for="user_dm_quickentry" class="classic">'.
462form::checkbox('user_dm_quickentry',1,$user_dm_quickentry).' '.
463__('Display quick entry form').'</label></p>'.
464
465'<br class="clear" />'. //Opera sucks
466'</fieldset>';
467
468# --BEHAVIOR-- adminPreferencesForm
469$core->callBehavior('adminPreferencesForm',$core);
470
471echo
472'<p class="clear">'.
473$core->formNonce().
474'<input type="submit" accesskey="s" value="'.__('Save').'" /></p>'.
475'</form>';
476
477echo '</div>';
478
479# User favorites
480echo '<div class="multi-part" id="user-favorites" title="'.__('My favorites').'">';
481$ws = $core->auth->user_prefs->addWorkspace('favorites');
482echo '<form action="preferences.php" method="post" id="favs-form">';
483echo '<div class="two-cols">';
484echo '<div class="col70">';
485echo '<fieldset id="my-favs"><legend>'.__('My favorites').'</legend>';
486
487$count = 0;
488foreach ($ws->dumpPrefs() as $k => $v) {
489     // User favorites only
490     if (!$v['global']) {
491          $fav = unserialize($v['value']);
492          if (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)) {
493               if ($count == 0) echo '<ul>';
494               $count++;
495               echo '<li id="fu-'.$k.'">'.
496                    '<img src="'.$fav['large-icon'].'" alt="" /> '.
497                    form::field(array('order['.$k.']'),2,3,$count,'position','',false,'title="'.sprintf(__('position of %s'),$fav['title']).'"').
498                    form::hidden(array('dynorder[]','dynorder-'.$k.''),$k).
499                    '<label for="fuk-'.$k.'">'.form::checkbox(array('remove[]','fuk-'.$k),$k).__($fav['title']).'</label>'.
500                    '</li>';
501          }
502     }
503}
504if ($count > 0) echo '</ul>';
505if ($count > 0) {
506     echo
507     '<div class="clear">'.
508     '<p>'.form::hidden('favs_order','').
509     $core->formNonce().
510     '<input type="submit" name="saveorder" value="'.__('Save order').'" /> '.
511
512     '<input type="submit" class="delete" name="removeaction" '.
513     'value="'.__('Delete selected favorites').'" '.
514     'onclick="return window.confirm(\''.html::escapeJS(
515          __('Are you sure you want to remove selected favorites?')).'\');" /></p>'.
516
517     ($core->auth->isSuperAdmin() ? 
518          '<hr />'.
519          '<p>'.__('If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation:').'</p>'.
520          '<p><input class="reset" type="submit" name="replace" value="'.__('Define as default favorites').'" />' : 
521          '').
522          '</p>'.
523     '</div>';
524} else {
525     echo
526     '<p>'.__('Currently no personal favorites.').'</p>';
527}
528
529echo '</fieldset>';
530
531echo '<div id="default-favs"><h3>'.__('Default favorites').'</h3>';
532echo '<p class="form-note info clear">'.__('Those favorites are displayed when My Favorites list is empty.').'</p>';
533$count = 0;
534foreach ($ws->dumpPrefs() as $k => $v) {
535     // Global favorites only
536     if ($v['global']) {
537          $fav = unserialize($v['value']);
538          if (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)) {
539               if ($count == 0) echo '<ul class="fav-list">';
540               $count++;
541               echo '<li id="fd-'.$k.'">'.
542               '<img src="'.$fav['small-icon'].'" alt="" /> '.__($fav['title']).'</li>';
543          }
544     }
545}   
546if ($count > 0) echo '</ul>';
547echo '</div>';
548echo '</div>';
549echo '<div class="col30" id="available-favs">';
550# Available favorites
551echo '<fieldset><legend>'.__('Available favorites').'</legend>';
552$count = 0;
553$array = $_fav;
554function cmp($a,$b) {
555    if (__($a[1]) == __($b[1])) {
556        return 0;
557    }
558    return (__($a[1]) < __($b[1])) ? -1 : 1;
559}
560$array=$array->getArrayCopy();
561uasort($array,'cmp');
562foreach ($array as $k => $fav) {
563     if (($fav[5] == '*') || $core->auth->check($fav[5],$core->blog->id)) {
564          if ($count == 0) echo '<ul class="fav-list">';
565          $count++;
566          echo '<li id="fa-'.$fav[0].'">'.'<label for="fak-'.$fav[0].'">'.
567               form::checkbox(array('append[]','fak-'.$fav[0]),$k).
568               '<img src="'.$fav[3].'" alt="" /> '.'<span class="zoom"><img src="'.$fav[4].'" alt="" /></span>'.
569               __($fav[1]).'</label>'.'</li>';
570     }
571}   
572if ($count > 0) echo '</ul>';
573echo
574'<p>'.
575$core->formNonce().
576'<input type="submit" name="appendaction" value="'.__('Add to my favorites').'" /></p>';
577echo '</fieldset>';
578echo '</div>';
579echo '</div>'; # Two-cols
580echo '</form>';
581echo '</div>'; # user-favorites
582
583dcPage::helpBlock('core_user_pref');
584dcPage::close();
585?>
Note: See TracBrowser for help on using the repository browser.

Sites map