OSDN Git Service

http://japan.nucleuscms.org/bb/viewtopic.php?p=25447#25447
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / libs / ADMIN.php
1 <?php\r
2 /*\r
3  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
4  * Copyright (C) 2002-2009 The Nucleus Group\r
5  *\r
6  * This program is free software; you can redistribute it and/or\r
7  * modify it under the terms of the GNU General Public License\r
8  * as published by the Free Software Foundation; either version 2\r
9  * of the License, or (at your option) any later version.\r
10  * (see nucleus/documentation/index.html#license for more info)\r
11  */\r
12 /**\r
13  * The code for the Nucleus admin area\r
14  *\r
15  * @license http://nucleuscms.org/license.txt GNU General Public License\r
16  * @copyright Copyright (C) 2002-2009 The Nucleus Group\r
17  * @version $Id$\r
18  * @version $NucleusJP: ADMIN.php,v 1.21.2.4 2007/10/30 19:04:24 kmorimatsu Exp $\r
19  */\r
20 \r
21 if ( !function_exists('requestVar') ) exit;\r
22 require_once dirname(__FILE__) . '/showlist.php';\r
23 \r
24 /**\r
25  * Builds the admin area and executes admin actions\r
26  */\r
27 class ADMIN {\r
28 \r
29     /**\r
30      * @var string $action action currently being executed ($action=xxxx -> action_xxxx method)\r
31      */\r
32     var $action;\r
33 \r
34     /**\r
35      * Class constructor\r
36      */\r
37     function ADMIN() {\r
38 \r
39     }\r
40 \r
41     /**\r
42      * Executes an action\r
43      *\r
44      * @param string $action action to be performed\r
45      */\r
46     function action($action) {\r
47         global $CONF, $manager;\r
48 \r
49         // list of action aliases\r
50         $alias = array(\r
51             'login' => 'overview',\r
52             '' => 'overview'\r
53         );\r
54 \r
55         if (isset($alias[$action]))\r
56             $action = $alias[$action];\r
57 \r
58         $methodName = 'action_' . $action;\r
59 \r
60         $this->action = strtolower($action);\r
61 \r
62         // check ticket. All actions need a ticket, unless they are considered to be safe (a safe action\r
63         // is an action that requires user interaction before something is actually done)\r
64         // all safe actions are in this array:\r
65         $aActionsNotToCheck = array(\r
66             'showlogin',\r
67             'login',\r
68             'overview',\r
69             'itemlist',\r
70             'blogcommentlist',\r
71             'bookmarklet',\r
72             'blogsettings',\r
73             'banlist',\r
74             'deleteblog',\r
75             'editmembersettings',\r
76             'browseownitems',\r
77             'browseowncomments',\r
78             'createitem',\r
79             'itemedit',\r
80             'itemmove',\r
81             'categoryedit',\r
82             'categorydelete',\r
83             'manage',\r
84             'actionlog',\r
85             'settingsedit',\r
86             'backupoverview',\r
87             'pluginlist',\r
88             'createnewlog',\r
89             'usermanagement',\r
90             'skinoverview',\r
91             'templateoverview',\r
92             'skinieoverview',\r
93             'itemcommentlist',\r
94             'commentedit',\r
95             'commentdelete',\r
96             'banlistnewfromitem',\r
97             'banlistdelete',\r
98             'itemdelete',\r
99             'manageteam',\r
100             'teamdelete',\r
101             'banlistnew',\r
102             'memberedit',\r
103             'memberdelete',\r
104             'pluginhelp',\r
105             'pluginoptions',\r
106             'plugindelete',\r
107             'skinedittype',\r
108             'skinremovetype',\r
109             'skindelete',\r
110             'skinedit',\r
111             'templateedit',\r
112             'templatedelete',\r
113             'activate',\r
114             'systemoverview'\r
115         );\r
116 /*\r
117         // the rest of the actions needs to be checked\r
118         $aActionsToCheck = array('additem', 'itemupdate', 'itemmoveto', 'categoryupdate', 'categorydeleteconfirm', 'itemdeleteconfirm', 'commentdeleteconfirm', 'teamdeleteconfirm', 'memberdeleteconfirm', 'templatedeleteconfirm', 'skindeleteconfirm', 'banlistdeleteconfirm', 'plugindeleteconfirm', 'batchitem', 'batchcomment', 'batchmember', 'batchcategory', 'batchteam', 'regfile', 'commentupdate', 'banlistadd', 'changemembersettings', 'clearactionlog', 'settingsupdate', 'blogsettingsupdate', 'categorynew', 'teamchangeadmin', 'teamaddmember', 'memberadd', 'addnewlog', 'addnewlog2', 'backupcreate', 'backuprestore', 'pluginup', 'plugindown', 'pluginupdate', 'pluginadd', 'pluginoptionsupdate', 'skinupdate', 'skinclone', 'skineditgeneral', 'templateclone', 'templatenew', 'templateupdate', 'skinieimport', 'skinieexport', 'skiniedoimport', 'skinnew', 'deleteblogconfirm', 'activatesetpwd');\r
119 */\r
120         if (!in_array($this->action, $aActionsNotToCheck))\r
121         {\r
122             if (!$manager->checkTicket())\r
123                 $this->error(_ERROR_BADTICKET);\r
124         }\r
125 \r
126         if (method_exists($this, $methodName))\r
127             call_user_func(array(&$this, $methodName));\r
128         else\r
129             $this->error(_BADACTION . htmlspecialchars(" ($action)"));\r
130 \r
131     }\r
132 \r
133     /**\r
134      * @todo document this\r
135      */\r
136     function action_showlogin() {\r
137         global $error;\r
138         $this->action_login($error);\r
139     }\r
140 \r
141     /**\r
142      * @todo document this\r
143      */\r
144     function action_login($msg = '', $passvars = 1) {\r
145         global $member;\r
146 \r
147         // skip to overview when allowed\r
148         if ($member->isLoggedIn() && $member->canLogin()) {\r
149             $this->action_overview();\r
150             exit;\r
151         }\r
152 \r
153         $this->pagehead();\r
154 \r
155         echo '<h2>', _LOGIN ,'</h2>';\r
156         if ($msg) echo _MESSAGE , ': ', htmlspecialchars($msg);\r
157         ?>\r
158 \r
159         <form action="index.php" method="post"><p>\r
160         <?php echo _LOGIN_NAME; ?> <br /><input name="login"  tabindex="10" />\r
161         <br />\r
162         <?php echo _LOGIN_PASSWORD; ?> <br /><input name="password"  tabindex="20" type="password" />\r
163         <br />\r
164         <input name="action" value="login" type="hidden" />\r
165         <br />\r
166         <input type="submit" value="<?php echo _LOGIN?>" tabindex="30" />\r
167         <br />\r
168         <small>\r
169             <input type="checkbox" value="1" name="shared" tabindex="40" id="shared" /><label for="shared"><?php echo _LOGIN_SHARED?></label>\r
170             <br /><a href="forgotpassword.html"><?php echo _LOGIN_FORGOT?></a>\r
171         </small>\r
172         <?php           // pass through vars\r
173 \r
174             $oldaction = postVar('oldaction');\r
175             if (  ($oldaction != 'logout')  && ($oldaction != 'login')  && $passvars ) {\r
176                 passRequestVars();\r
177             }\r
178 \r
179 \r
180         ?>\r
181         </p></form>\r
182         <?php       $this->pagefoot();\r
183     }\r
184 \r
185 \r
186     /**\r
187      * provides a screen with the overview of the actions available\r
188      * @todo document parameter\r
189      */\r
190     function action_overview($msg = '') {\r
191         global $member;\r
192 \r
193         $this->pagehead();\r
194 \r
195         if ($msg)\r
196             echo _MESSAGE , ': ', $msg;\r
197 \r
198         /* ---- add items ---- */\r
199         echo '<h2>' . _OVERVIEW_YRBLOGS . '</h2>';\r
200 \r
201         $showAll = requestVar('showall');\r
202 \r
203         if (($member->isAdmin()) && ($showAll == 'yes')) {\r
204             // Super-Admins have access to all blogs! (no add item support though)\r
205             $query =  'SELECT bnumber, bname, 1 as tadmin, burl, bshortname'\r
206                    . ' FROM ' . sql_table('blog')\r
207                    . ' ORDER BY bname';\r
208         } else {\r
209             $query =  'SELECT bnumber, bname, tadmin, burl, bshortname'\r
210                    . ' FROM ' . sql_table('blog') . ', ' . sql_table('team')\r
211                    . ' WHERE tblog=bnumber and tmember=' . $member->getID()\r
212                    . ' ORDER BY bname';\r
213         }\r
214         $template['content'] = 'bloglist';\r
215         $template['superadmin'] = $member->isAdmin();\r
216         $amount = showlist($query,'table',$template);\r
217 \r
218         if (($showAll != 'yes') && ($member->isAdmin())) {\r
219             $total = quickQuery('SELECT COUNT(*) as result FROM ' . sql_table('blog'));\r
220             if ($total > $amount)\r
221                 echo '<p><a href="index.php?action=overview&amp;showall=yes">' . _OVERVIEW_SHOWALL . '</a></p>';\r
222         }\r
223 \r
224         if ($amount == 0)\r
225             echo _OVERVIEW_NOBLOGS;\r
226 \r
227         if ($amount != 0) {\r
228             echo '<h2>' . _OVERVIEW_YRDRAFTS . '</h2>';\r
229             $query =  'SELECT ititle, inumber, bshortname'\r
230                    . ' FROM ' . sql_table('item'). ', ' . sql_table('blog')\r
231                    . ' WHERE iauthor='.$member->getID().' and iblog=bnumber and idraft=1';\r
232             $template['content'] = 'draftlist';\r
233             $amountdrafts = showlist($query, 'table', $template);\r
234             if ($amountdrafts == 0)\r
235                 echo _OVERVIEW_NODRAFTS;\r
236         }\r
237 \r
238         /* ---- user settings ---- */\r
239         echo '<h2>' . _OVERVIEW_YRSETTINGS . '</h2>';\r
240         echo '<ul>';\r
241         echo '<li><a href="index.php?action=editmembersettings">' . _OVERVIEW_EDITSETTINGS. '</a></li>';\r
242         echo '<li><a href="index.php?action=browseownitems">' . _OVERVIEW_BROWSEITEMS.'</a></li>';\r
243         echo '<li><a href="index.php?action=browseowncomments">'._OVERVIEW_BROWSECOMM.'</a></li>';\r
244         echo '</ul>';\r
245 \r
246         /* ---- general settings ---- */\r
247         if ($member->isAdmin()) {\r
248             echo '<h2>' . _OVERVIEW_MANAGEMENT. '</h2>';\r
249             echo '<ul>';\r
250             echo '<li><a href="index.php?action=manage">',_OVERVIEW_MANAGE,'</a></li>';\r
251             echo '</ul>';\r
252         }\r
253 \r
254 \r
255         $this->pagefoot();\r
256     }\r
257 \r
258     /**\r
259      * Returns a link to a weblog\r
260      * @param object BLOG\r
261      */\r
262     function bloglink(&$blog) {\r
263         return '<a href="'.htmlspecialchars($blog->getURL()).'" title="'._BLOGLIST_TT_VISIT.'">'. htmlspecialchars( $blog->getName() ) .'</a>';\r
264     }\r
265 \r
266     /**\r
267      * @todo document this\r
268      */\r
269     function action_manage($msg = '') {\r
270         global $member;\r
271 \r
272         $member->isAdmin() or $this->disallow();\r
273 \r
274         $this->pagehead();\r
275 \r
276         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';\r
277 \r
278         if ($msg)\r
279             echo '<p>' , _MESSAGE , ': ', $msg , '</p>';\r
280 \r
281 \r
282         echo '<h2>' . _MANAGE_GENERAL. '</h2>';\r
283 \r
284         echo '<ul>';\r
285         echo '<li><a href="index.php?action=createnewlog">'._OVERVIEW_NEWLOG.'</a></li>';\r
286         echo '<li><a href="index.php?action=settingsedit">'._OVERVIEW_SETTINGS.'</a></li>';\r
287         echo '<li><a href="index.php?action=usermanagement">'._OVERVIEW_MEMBERS.'</a></li>';\r
288         echo '<li><a href="index.php?action=actionlog">'._OVERVIEW_VIEWLOG.'</a></li>';\r
289         echo '</ul>';\r
290 \r
291         echo '<h2>' . _MANAGE_SKINS . '</h2>';\r
292         echo '<ul>';\r
293         echo '<li><a href="index.php?action=skinoverview">'._OVERVIEW_SKINS.'</a></li>';\r
294         echo '<li><a href="index.php?action=templateoverview">'._OVERVIEW_TEMPLATES.'</a></li>';\r
295         echo '<li><a href="index.php?action=skinieoverview">'._OVERVIEW_SKINIMPORT.'</a></li>';\r
296         echo '</ul>';\r
297 \r
298         echo '<h2>' . _MANAGE_EXTRA . '</h2>';\r
299         echo '<ul>';\r
300         echo '<li><a href="index.php?action=backupoverview">'._OVERVIEW_BACKUP.'</a></li>';\r
301         echo '<li><a href="index.php?action=pluginlist">'._OVERVIEW_PLUGINS.'</a></li>';\r
302         echo '</ul>';\r
303 \r
304         $this->pagefoot();\r
305     }\r
306 \r
307     /**\r
308      * @todo document this\r
309      */\r
310     function action_itemlist($blogid = '') {\r
311         global $member, $manager, $CONF;\r
312 \r
313         if ($blogid == '')\r
314             $blogid = intRequestVar('blogid');\r
315 \r
316         $member->teamRights($blogid) or $member->isAdmin() or $this->disallow();\r
317 \r
318         $this->pagehead();\r
319         $blog =& $manager->getBlog($blogid);\r
320 \r
321         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';\r
322         echo '<h2>' . _ITEMLIST_BLOG . ' ' . $this->bloglink($blog) . '</h2>';\r
323 \r
324         // start index\r
325         if (postVar('start'))\r
326             $start = intPostVar('start');\r
327         else\r
328             $start = 0;\r
329 \r
330         if ($start == 0)\r
331             echo '<p><a href="index.php?action=createitem&amp;blogid='.$blogid.'">',_ITEMLIST_ADDNEW,'</a></p>';\r
332 \r
333         // amount of items to show\r
334         if (postVar('amount'))\r
335             $amount = intPostVar('amount');\r
336         else {\r
337             $amount = intval($CONF['DefaultListSize']);\r
338             if ($amount < 1)\r
339                 $amount = 10;\r
340         }\r
341 \r
342         $search = postVar('search');    // search through items\r
343 \r
344         $query =  'SELECT bshortname, cname, mname, ititle, ibody, inumber, idraft, itime'\r
345                . ' FROM ' . sql_table('item') . ', ' . sql_table('blog') . ', ' . sql_table('member') . ', ' . sql_table('category')\r
346                . ' WHERE iblog=bnumber and iauthor=mnumber and icat=catid and iblog=' . $blogid;\r
347 \r
348         if ($search)\r
349             $query .= ' and ((ititle LIKE "%' . addslashes($search) . '%") or (ibody LIKE "%' . addslashes($search) . '%") or (imore LIKE "%' . addslashes($search) . '%"))';\r
350 \r
351         // non-blog-admins can only edit/delete their own items\r
352         if (!$member->blogAdminRights($blogid))\r
353             $query .= ' and iauthor=' . $member->getID();\r
354 \r
355 \r
356         $query .= ' ORDER BY itime DESC'\r
357                 . " LIMIT $start,$amount";\r
358 \r
359         $template['content'] = 'itemlist';\r
360         $template['now'] = $blog->getCorrectTime(time());\r
361 \r
362         $manager->loadClass("ENCAPSULATE");\r
363         $navList =& new NAVLIST('itemlist', $start, $amount, 0, 1000, $blogid, $search, 0);\r
364         $navList->showBatchList('item',$query,'table',$template);\r
365 \r
366 \r
367         $this->pagefoot();\r
368     }\r
369 \r
370     /**\r
371      * @todo document this\r
372      */\r
373     function action_batchitem() {\r
374         global $member, $manager;\r
375 \r
376         // check if logged in\r
377         $member->isLoggedIn() or $this->disallow();\r
378 \r
379         // more precise check will be done for each performed operation\r
380 \r
381         // get array of itemids from request\r
382         $selected = requestIntArray('batch');\r
383         $action = requestVar('batchaction');\r
384 \r
385         // Show error when no items were selected\r
386         if (!is_array($selected) || sizeof($selected) == 0)\r
387             $this->error(_BATCH_NOSELECTION);\r
388 \r
389         // On move: when no destination blog/category chosen, show choice now\r
390         $destCatid = intRequestVar('destcatid');\r
391         if (($action == 'move') && (!$manager->existsCategory($destCatid)))\r
392             $this->batchMoveSelectDestination('item',$selected);\r
393 \r
394         // On delete: check if confirmation has been given\r
395         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))\r
396             $this->batchAskDeleteConfirmation('item',$selected);\r
397 \r
398         $this->pagehead();\r
399 \r
400         echo '<a href="index.php?action=overview">(',_BACKHOME,')</a>';\r
401         echo '<h2>',_BATCH_ITEMS,'</h2>';\r
402         echo '<p>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b></p>';\r
403         echo '<ul>';\r
404 \r
405 \r
406         // walk over all itemids and perform action\r
407         foreach ($selected as $itemid) {\r
408             $itemid = intval($itemid);\r
409             echo '<li>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b> ',_BATCH_ONITEM,' <b>', $itemid, '</b>...';\r
410 \r
411             // perform action, display errors if needed\r
412             switch($action) {\r
413                 case 'delete':\r
414                     $error = $this->deleteOneItem($itemid);\r
415                     break;\r
416                 case 'move':\r
417                     $error = $this->moveOneItem($itemid, $destCatid);\r
418                     break;\r
419                 default:\r
420                     $error = _BATCH_UNKNOWN . htmlspecialchars($action);\r
421             }\r
422 \r
423             echo '<b>',($error ? $error : _BATCH_SUCCESS),'</b>';\r
424             echo '</li>';\r
425         }\r
426 \r
427         echo '</ul>';\r
428         echo '<b>',_BATCH_DONE,'</b>';\r
429 \r
430         $this->pagefoot();\r
431 \r
432 \r
433     }\r
434 \r
435     /**\r
436      * @todo document this\r
437      */\r
438     function action_batchcomment() {\r
439         global $member;\r
440 \r
441         // check if logged in\r
442         $member->isLoggedIn() or $this->disallow();\r
443 \r
444         // more precise check will be done for each performed operation\r
445 \r
446         // get array of itemids from request\r
447         $selected = requestIntArray('batch');\r
448         $action = requestVar('batchaction');\r
449 \r
450         // Show error when no items were selected\r
451         if (!is_array($selected) || sizeof($selected) == 0)\r
452             $this->error(_BATCH_NOSELECTION);\r
453 \r
454         // On delete: check if confirmation has been given\r
455         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))\r
456             $this->batchAskDeleteConfirmation('comment',$selected);\r
457 \r
458         $this->pagehead();\r
459 \r
460         echo '<a href="index.php?action=overview">(',_BACKHOME,')</a>';\r
461         echo '<h2>',_BATCH_COMMENTS,'</h2>';\r
462         echo '<p>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b></p>';\r
463         echo '<ul>';\r
464 \r
465         // walk over all itemids and perform action\r
466         foreach ($selected as $commentid) {\r
467             $commentid = intval($commentid);\r
468             echo '<li>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b> ',_BATCH_ONCOMMENT,' <b>', $commentid, '</b>...';\r
469 \r
470             // perform action, display errors if needed\r
471             switch($action) {\r
472                 case 'delete':\r
473                     $error = $this->deleteOneComment($commentid);\r
474                     break;\r
475                 default:\r
476                     $error = _BATCH_UNKNOWN . htmlspecialchars($action);\r
477             }\r
478 \r
479             echo '<b>',($error ? $error : _BATCH_SUCCESS),'</b>';\r
480             echo '</li>';\r
481         }\r
482 \r
483         echo '</ul>';\r
484         echo '<b>',_BATCH_DONE,'</b>';\r
485 \r
486         $this->pagefoot();\r
487 \r
488 \r
489     }\r
490 \r
491     /**\r
492      * @todo document this\r
493      */\r
494     function action_batchmember() {\r
495         global $member;\r
496 \r
497         // check if logged in and admin\r
498         ($member->isLoggedIn() && $member->isAdmin()) or $this->disallow();\r
499 \r
500         // get array of itemids from request\r
501         $selected = requestIntArray('batch');\r
502         $action = requestVar('batchaction');\r
503 \r
504         // Show error when no members selected\r
505         if (!is_array($selected) || sizeof($selected) == 0)\r
506             $this->error(_BATCH_NOSELECTION);\r
507 \r
508         // On delete: check if confirmation has been given\r
509         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))\r
510             $this->batchAskDeleteConfirmation('member',$selected);\r
511 \r
512         $this->pagehead();\r
513 \r
514         echo '<a href="index.php?action=usermanagement">(',_MEMBERS_BACKTOOVERVIEW,')</a>';\r
515         echo '<h2>',_BATCH_MEMBERS,'</h2>';\r
516         echo '<p>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b></p>';\r
517         echo '<ul>';\r
518 \r
519         // walk over all itemids and perform action\r
520         foreach ($selected as $memberid) {\r
521             $memberid = intval($memberid);\r
522             echo '<li>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b> ',_BATCH_ONMEMBER,' <b>', $memberid, '</b>...';\r
523 \r
524             // perform action, display errors if needed\r
525             switch($action) {\r
526                 case 'delete':\r
527                     $error = $this->deleteOneMember($memberid);\r
528                     break;\r
529                 case 'setadmin':\r
530                     // always succeeds\r
531                     sql_query('UPDATE ' . sql_table('member') . ' SET madmin=1 WHERE mnumber='.$memberid);\r
532                     $error = '';\r
533                     break;\r
534                 case 'unsetadmin':\r
535                     // there should always remain at least one super-admin\r
536                     $r = sql_query('SELECT * FROM '.sql_table('member'). ' WHERE madmin=1 and mcanlogin=1');\r
537                     if (sql_num_rows($r) < 2)\r
538                         $error = _ERROR_ATLEASTONEADMIN;\r
539                     else\r
540                         sql_query('UPDATE ' . sql_table('member') .' SET madmin=0 WHERE mnumber='.$memberid);\r
541                     break;\r
542                 default:\r
543                     $error = _BATCH_UNKNOWN . htmlspecialchars($action);\r
544             }\r
545 \r
546             echo '<b>',($error ? $error : _BATCH_SUCCESS),'</b>';\r
547             echo '</li>';\r
548         }\r
549 \r
550         echo '</ul>';\r
551         echo '<b>',_BATCH_DONE,'</b>';\r
552 \r
553         $this->pagefoot();\r
554 \r
555 \r
556     }\r
557 \r
558     /**\r
559      * @todo document this\r
560      */\r
561     function action_batchteam() {\r
562         global $member;\r
563 \r
564         $blogid = intRequestVar('blogid');\r
565 \r
566         // check if logged in and admin\r
567         ($member->isLoggedIn() && $member->blogAdminRights($blogid)) or $this->disallow();\r
568 \r
569         // get array of itemids from request\r
570         $selected = requestIntArray('batch');\r
571         $action = requestVar('batchaction');\r
572 \r
573         // Show error when no members selected\r
574         if (!is_array($selected) || sizeof($selected) == 0)\r
575             $this->error(_BATCH_NOSELECTION);\r
576 \r
577         // On delete: check if confirmation has been given\r
578         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))\r
579             $this->batchAskDeleteConfirmation('team',$selected);\r
580 \r
581         $this->pagehead();\r
582 \r
583         echo '<p><a href="index.php?action=manageteam&amp;blogid=',$blogid,'">(',_BACK,')</a></p>';\r
584 \r
585         echo '<h2>',_BATCH_TEAM,'</h2>';\r
586         echo '<p>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b></p>';\r
587         echo '<ul>';\r
588 \r
589         // walk over all itemids and perform action\r
590         foreach ($selected as $memberid) {\r
591             $memberid = intval($memberid);\r
592             echo '<li>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b> ',_BATCH_ONTEAM,' <b>', $memberid, '</b>...';\r
593 \r
594             // perform action, display errors if needed\r
595             switch($action) {\r
596                 case 'delete':\r
597                     $error = $this->deleteOneTeamMember($blogid, $memberid);\r
598                     break;\r
599                 case 'setadmin':\r
600                     // always succeeds\r
601                     sql_query('UPDATE '.sql_table('team').' SET tadmin=1 WHERE tblog='.$blogid.' and tmember='.$memberid);\r
602                     $error = '';\r
603                     break;\r
604                 case 'unsetadmin':\r
605                     // there should always remain at least one admin\r
606                     $r = sql_query('SELECT * FROM '.sql_table('team').' WHERE tadmin=1 and tblog='.$blogid);\r
607                     if (sql_num_rows($r) < 2)\r
608                         $error = _ERROR_ATLEASTONEBLOGADMIN;\r
609                     else\r
610                         sql_query('UPDATE '.sql_table('team').' SET tadmin=0 WHERE tblog='.$blogid.' and tmember='.$memberid);\r
611                     break;\r
612                 default:\r
613                     $error = _BATCH_UNKNOWN . htmlspecialchars($action);\r
614             }\r
615 \r
616             echo '<b>',($error ? $error : _BATCH_SUCCESS),'</b>';\r
617             echo '</li>';\r
618         }\r
619 \r
620         echo '</ul>';\r
621         echo '<b>',_BATCH_DONE,'</b>';\r
622 \r
623         $this->pagefoot();\r
624 \r
625 \r
626     }\r
627 \r
628     /**\r
629      * @todo document this\r
630      */\r
631     function action_batchcategory() {\r
632         global $member, $manager;\r
633 \r
634         // check if logged in\r
635         $member->isLoggedIn() or $this->disallow();\r
636 \r
637         // more precise check will be done for each performed operation\r
638 \r
639         // get array of itemids from request\r
640         $selected = requestIntArray('batch');\r
641         $action = requestVar('batchaction');\r
642 \r
643         // Show error when no items were selected\r
644         if (!is_array($selected) || sizeof($selected) == 0)\r
645             $this->error(_BATCH_NOSELECTION);\r
646 \r
647         // On move: when no destination blog chosen, show choice now\r
648         $destBlogId = intRequestVar('destblogid');\r
649         if (($action == 'move') && (!$manager->existsBlogID($destBlogId)))\r
650             $this->batchMoveCategorySelectDestination('category',$selected);\r
651 \r
652         // On delete: check if confirmation has been given\r
653         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))\r
654             $this->batchAskDeleteConfirmation('category',$selected);\r
655 \r
656         $this->pagehead();\r
657 \r
658         echo '<a href="index.php?action=overview">(',_BACKHOME,')</a>';\r
659         echo '<h2>',BATCH_CATEGORIES,'</h2>';\r
660         echo '<p>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b></p>';\r
661         echo '<ul>';\r
662 \r
663         // walk over all itemids and perform action\r
664         foreach ($selected as $catid) {\r
665             $catid = intval($catid);\r
666             echo '<li>',_BATCH_EXECUTING,' <b>',htmlspecialchars($action),'</b> ',_BATCH_ONCATEGORY,' <b>', $catid, '</b>...';\r
667 \r
668             // perform action, display errors if needed\r
669             switch($action) {\r
670                 case 'delete':\r
671                     $error = $this->deleteOneCategory($catid);\r
672                     break;\r
673                 case 'move':\r
674                     $error = $this->moveOneCategory($catid, $destBlogId);\r
675                     break;\r
676                 default:\r
677                     $error = _BATCH_UNKNOWN . htmlspecialchars($action);\r
678             }\r
679 \r
680             echo '<b>',($error ? _ERROR . ': '.$error : _BATCH_SUCCESS),'</b>';\r
681             echo '</li>';\r
682         }\r
683 \r
684         echo '</ul>';\r
685         echo '<b>',_BATCH_DONE,'</b>';\r
686 \r
687         $this->pagefoot();\r
688 \r
689     }\r
690 \r
691     /**\r
692      * @todo document this\r
693      */\r
694     function batchMoveSelectDestination($type, $ids) {\r
695         global $manager;\r
696         $this->pagehead();\r
697         ?>\r
698         <h2><?php echo _MOVE_TITLE?></h2>\r
699         <form method="post" action="index.php"><div>\r
700 \r
701             <input type="hidden" name="action" value="batch<?php echo $type?>" />\r
702             <input type="hidden" name="batchaction" value="move" />\r
703             <?php\r
704                 $manager->addTicketHidden();\r
705 \r
706                 // insert selected item numbers\r
707                 $idx = 0;\r
708                 foreach ($ids as $id)\r
709                     echo '<input type="hidden" name="batch[',($idx++),']" value="',intval($id),'" />';\r
710 \r
711                 // show blog/category selection list\r
712                 $this->selectBlogCategory('destcatid');\r
713 \r
714             ?>\r
715 \r
716 \r
717             <input type="submit" value="<?php echo _MOVE_BTN?>" onclick="return checkSubmit();" />\r
718 \r
719         </div></form>\r
720         <?php       $this->pagefoot();\r
721         exit;\r
722     }\r
723 \r
724     /**\r
725      * @todo document this\r
726      */\r
727     function batchMoveCategorySelectDestination($type, $ids) {\r
728         global $manager;\r
729         $this->pagehead();\r
730         ?>\r
731         <h2><?php echo _MOVECAT_TITLE?></h2>\r
732         <form method="post" action="index.php"><div>\r
733 \r
734             <input type="hidden" name="action" value="batch<?php echo $type?>" />\r
735             <input type="hidden" name="batchaction" value="move" />\r
736             <?php\r
737                 $manager->addTicketHidden();\r
738 \r
739                 // insert selected item numbers\r
740                 $idx = 0;\r
741                 foreach ($ids as $id)\r
742                     echo '<input type="hidden" name="batch[',($idx++),']" value="',intval($id),'" />';\r
743 \r
744                 // show blog/category selection list\r
745                 $this->selectBlog('destblogid');\r
746 \r
747             ?>\r
748 \r
749 \r
750             <input type="submit" value="<?php echo _MOVECAT_BTN?>" onclick="return checkSubmit();" />\r
751 \r
752         </div></form>\r
753         <?php       $this->pagefoot();\r
754         exit;\r
755     }\r
756 \r
757     /**\r
758      * @todo document this\r
759      */\r
760     function batchAskDeleteConfirmation($type, $ids) {\r
761         global $manager;\r
762 \r
763         $this->pagehead();\r
764         ?>\r
765         <h2><?php echo _BATCH_DELETE_CONFIRM?></h2>\r
766         <form method="post" action="index.php"><div>\r
767 \r
768             <input type="hidden" name="action" value="batch<?php echo $type?>" />\r
769             <?php $manager->addTicketHidden() ?>\r
770             <input type="hidden" name="batchaction" value="delete" />\r
771             <input type="hidden" name="confirmation" value="yes" />\r
772             <?php               // insert selected item numbers\r
773                 $idx = 0;\r
774                 foreach ($ids as $id)\r
775                     echo '<input type="hidden" name="batch[',($idx++),']" value="',intval($id),'" />';\r
776 \r
777                 // add hidden vars for team & comment\r
778                 if ($type == 'team')\r
779                 {\r
780                     echo '<input type="hidden" name="blogid" value="',intRequestVar('blogid'),'" />';\r
781                 }\r
782                 if ($type == 'comment')\r
783                 {\r
784                     echo '<input type="hidden" name="itemid" value="',intRequestVar('itemid'),'" />';\r
785                 }\r
786 \r
787             ?>\r
788 \r
789             <input type="submit" value="<?php echo _BATCH_DELETE_CONFIRM_BTN?>" onclick="return checkSubmit();" />\r
790 \r
791         </div></form>\r
792         <?php       $this->pagefoot();\r
793         exit;\r
794     }\r
795 \r
796 \r
797     /**\r
798      * Inserts a HTML select element with choices for all categories to which the current\r
799      * member has access\r
800      * @see function selectBlog\r
801      */\r
802     function selectBlogCategory($name, $selected = 0, $tabindex = 0, $showNewCat = 0, $iForcedBlogInclude = -1) {\r
803         ADMIN::selectBlog($name, 'category', $selected, $tabindex, $showNewCat, $iForcedBlogInclude);\r
804     }\r
805 \r
806     /**\r
807      * Inserts a HTML select element with choices for all blogs to which the user has access\r
808      *      mode = 'blog' => shows blognames and values are blogids\r
809      *      mode = 'category' => show category names and values are catids\r
810      *\r
811      * @param $iForcedBlogInclude\r
812      *      ID of a blog that always needs to be included, without checking if the\r
813      *      member is on the blog team (-1 = none)\r
814      * @todo document parameters\r
815      */\r
816     function selectBlog($name, $mode='blog', $selected = 0, $tabindex = 0, $showNewCat = 0, $iForcedBlogInclude = -1) {\r
817         global $member, $CONF;\r
818 \r
819         // 0. get IDs of blogs to which member can post items (+ forced blog)\r
820         $aBlogIds = array();\r
821         if ($iForcedBlogInclude != -1)\r
822             $aBlogIds[] = intval($iForcedBlogInclude);\r
823 \r
824         if (($member->isAdmin()) && ($CONF['ShowAllBlogs']))\r
825             $queryBlogs =  'SELECT bnumber FROM '.sql_table('blog').' ORDER BY bname';\r
826         else\r
827             $queryBlogs =  'SELECT bnumber FROM '.sql_table('blog').', '.sql_table('team').' WHERE tblog=bnumber and tmember=' . $member->getID();\r
828         $rblogids = sql_query($queryBlogs);\r
829         while ($o = sql_fetch_object($rblogids))\r
830             if ($o->bnumber != $iForcedBlogInclude)\r
831                 $aBlogIds[] = intval($o->bnumber);\r
832 \r
833         if (count($aBlogIds) == 0)\r
834             return;\r
835 \r
836         echo '<select name="',$name,'" tabindex="',$tabindex,'">';\r
837 \r
838         // 1. select blogs (we'll create optiongroups)\r
839         // (only select those blogs that have the user on the team)\r
840         $queryBlogs =  'SELECT bnumber, bname FROM '.sql_table('blog').' WHERE bnumber in ('.implode(',',$aBlogIds).') ORDER BY bname';\r
841         $blogs = sql_query($queryBlogs);\r
842         if ($mode == 'category') {\r
843             if (sql_num_rows($blogs) > 1)\r
844                 $multipleBlogs = 1;\r
845 \r
846             while ($oBlog = sql_fetch_object($blogs)) {\r
847                 if ($multipleBlogs)\r
848                     echo '<optgroup label="',htmlspecialchars($oBlog->bname),'">';\r
849 \r
850                 // show selection to create new category when allowed/wanted\r
851                 if ($showNewCat) {\r
852                     // check if allowed to do so\r
853                     if ($member->blogAdminRights($oBlog->bnumber))\r
854                         echo '<option value="newcat-',$oBlog->bnumber,'">',_ADD_NEWCAT,'</option>';\r
855                 }\r
856 \r
857                 // 2. for each category in that blog\r
858                 $categories = sql_query('SELECT cname, catid FROM '.sql_table('category').' WHERE cblog=' . $oBlog->bnumber . ' ORDER BY cname ASC');\r
859                 while ($oCat = sql_fetch_object($categories)) {\r
860                     if ($oCat->catid == $selected)\r
861                         $selectText = ' selected="selected" ';\r
862                     else\r
863                         $selectText = '';\r
864                     echo '<option value="',$oCat->catid,'" ', $selectText,'>',htmlspecialchars($oCat->cname),'</option>';\r
865                 }\r
866 \r
867                 if ($multipleBlogs)\r
868                     echo '</optgroup>';\r
869             }\r
870         } else {\r
871             // blog mode\r
872             while ($oBlog = sql_fetch_object($blogs)) {\r
873                 echo '<option value="',$oBlog->bnumber,'"';\r
874                 if ($oBlog->bnumber == $selected)\r
875                     echo ' selected="selected"';\r
876                 echo'>',htmlspecialchars($oBlog->bname),'</option>';\r
877             }\r
878         }\r
879         echo '</select>';\r
880 \r
881     }\r
882 \r
883     /**\r
884      * @todo document this\r
885      */\r
886     function action_browseownitems() {\r
887         global $member, $manager, $CONF;\r
888 \r
889         $this->pagehead();\r
890 \r
891         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';\r
892         echo '<h2>' . _ITEMLIST_YOUR. '</h2>';\r
893 \r
894         // start index\r
895         if (postVar('start'))\r
896             $start = intPostVar('start');\r
897         else\r
898             $start = 0;\r
899 \r
900         // amount of items to show\r
901         if (postVar('amount'))\r
902             $amount = intPostVar('amount');\r
903         else {\r
904             $amount = intval($CONF['DefaultListSize']);\r
905             if ($amount < 1)\r
906                 $amount = 10;\r
907         }\r
908 \r
909         $search = postVar('search');    // search through items\r
910 \r
911         $query =  'SELECT bshortname, cname, mname, ititle, ibody, idraft, inumber, itime'\r
912                . ' FROM '.sql_table('item').', '.sql_table('blog') . ', '.sql_table('member') . ', '.sql_table('category')\r
913                . ' WHERE iauthor='. $member->getID() .' and iauthor=mnumber and iblog=bnumber and icat=catid';\r
914 \r
915         if ($search)\r
916             $query .= ' and ((ititle LIKE "%' . addslashes($search) . '%") or (ibody LIKE "%' . addslashes($search) . '%") or (imore LIKE "%' . addslashes($search) . '%"))';\r
917 \r
918         $query .= ' ORDER BY itime DESC'\r
919                 . " LIMIT $start,$amount";\r
920 \r
921         $template['content'] = 'itemlist';\r
922         $template['now'] = time();\r
923 \r
924         $manager->loadClass("ENCAPSULATE");\r
925         $navList =& new NAVLIST('browseownitems', $start, $amount, 0, 1000, /*$blogid*/ 0, $search, 0);\r
926         $navList->showBatchList('item',$query,'table',$template);\r
927 \r
928         $this->pagefoot();\r
929 \r
930     }\r
931 \r
932     /**\r
933      * Show all the comments for a given item\r
934      * @param int $itemid\r
935      */\r
936     function action_itemcommentlist($itemid = '') {\r
937         global $member, $manager, $CONF;\r
938 \r
939         if ($itemid == '')\r
940             $itemid = intRequestVar('itemid');\r
941 \r
942         // only allow if user is allowed to alter item\r
943         $member->canAlterItem($itemid) or $this->disallow();\r
944 \r
945         $blogid = getBlogIdFromItemId($itemid);\r
946 \r
947         $this->pagehead();\r
948 \r
949         // start index\r
950         if (postVar('start'))\r
951             $start = intPostVar('start');\r
952         else\r
953             $start = 0;\r
954 \r
955         // amount of items to show\r
956         if (postVar('amount'))\r
957             $amount = intPostVar('amount');\r
958         else {\r
959             $amount = intval($CONF['DefaultListSize']);\r
960             if ($amount < 1)\r
961                 $amount = 10;\r
962         }\r
963 \r
964         $search = postVar('search');\r
965 \r
966         echo '<p>(<a href="index.php?action=itemlist&amp;blogid=',$blogid,'">',_BACKTOOVERVIEW,'</a>)</p>';\r
967         echo '<h2>',_COMMENTS,'</h2>';\r
968 \r
969         $query = 'SELECT cbody, cuser, cmail, cemail, mname, ctime, chost, cnumber, cip, citem FROM ' . sql_table('comment') . ' LEFT OUTER JOIN ' . sql_table('member') . ' ON mnumber = cmember WHERE citem = ' . $itemid;\r
970 \r
971         if ($search)\r
972             $query .= ' and cbody LIKE "%' . addslashes($search) . '%"';\r
973 \r
974         $query .= ' ORDER BY ctime ASC'\r
975                 . " LIMIT $start,$amount";\r
976 \r
977         $template['content'] = 'commentlist';\r
978         $template['canAddBan'] = $member->blogAdminRights(getBlogIDFromItemID($itemid));\r
979 \r
980         $manager->loadClass("ENCAPSULATE");\r
981         $navList =& new NAVLIST('itemcommentlist', $start, $amount, 0, 1000, 0, $search, $itemid);\r
982         $navList->showBatchList('comment',$query,'table',$template,_NOCOMMENTS);\r
983 \r
984         $this->pagefoot();\r
985     }\r
986 \r
987     /**\r
988      * Browse own comments\r
989      */\r
990     function action_browseowncomments() {\r
991         global $member, $manager, $CONF;\r
992 \r
993         // start index\r
994         if (postVar('start'))\r
995             $start = intPostVar('start');\r
996         else\r
997             $start = 0;\r
998 \r
999         // amount of items to show\r
1000         if (postVar('amount'))\r
1001             $amount = intPostVar('amount');\r
1002         else {\r
1003             $amount = intval($CONF['DefaultListSize']);\r
1004             if ($amount < 1)\r
1005                 $amount = 10;\r
1006         }\r
1007 \r
1008         $search = postVar('search');\r
1009 \r
1010 \r
1011         $query =  'SELECT cbody, cuser, cmail, mname, ctime, chost, cnumber, cip, citem FROM '.sql_table('comment').' LEFT OUTER JOIN '.sql_table('member').' ON mnumber=cmember WHERE cmember=' . $member->getID();\r
1012 \r
1013         if ($search)\r
1014             $query .= ' and cbody LIKE "%' . addslashes($search) . '%"';\r
1015 \r
1016         $query .= ' ORDER BY ctime DESC'\r
1017                 . " LIMIT $start,$amount";\r
1018 \r
1019         $this->pagehead();\r
1020 \r
1021         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';\r
1022         echo '<h2>', _COMMENTS_YOUR ,'</h2>';\r
1023 \r
1024         $template['content'] = 'commentlist';\r
1025         $template['canAddBan'] = 0; // doesn't make sense to allow banning yourself\r
1026 \r
1027         $manager->loadClass("ENCAPSULATE");\r
1028         $navList =& new NAVLIST('browseowncomments', $start, $amount, 0, 1000, 0, $search, 0);\r
1029         $navList->showBatchList('comment',$query,'table',$template,_NOCOMMENTS_YOUR);\r
1030 \r
1031         $this->pagefoot();\r
1032     }\r
1033 \r
1034     /**\r
1035      * Browse all comments for a weblog\r
1036      * @param int $blogid\r
1037      */\r
1038     function action_blogcommentlist($blogid = '')\r
1039     {\r
1040         global $member, $manager, $CONF;\r
1041 \r
1042         if ($blogid == '')\r
1043             $blogid = intRequestVar('blogid');\r
1044         else\r
1045             $blogid = intval($blogid);\r
1046 \r
1047         $member->teamRights($blogid) or $member->isAdmin() or $this->disallow();\r
1048 \r
1049         // start index\r
1050         if (postVar('start'))\r
1051             $start = intPostVar('start');\r
1052         else\r
1053             $start = 0;\r
1054 \r
1055         // amount of items to show\r
1056         if (postVar('amount'))\r
1057             $amount = intPostVar('amount');\r
1058         else {\r
1059             $amount = intval($CONF['DefaultListSize']);\r
1060             if ($amount < 1)\r
1061                 $amount = 10;\r
1062         }\r
1063 \r
1064         $search = postVar('search');        // search through comments\r
1065 \r
1066 \r
1067         $query =  'SELECT cbody, cuser, cemail, cmail, mname, ctime, chost, cnumber, cip, citem FROM '.sql_table('comment').' LEFT OUTER JOIN '.sql_table('member').' ON mnumber=cmember WHERE cblog=' . intval($blogid);\r
1068 \r
1069         if ($search != '')\r
1070             $query .= ' and cbody LIKE "%' . addslashes($search) . '%"';\r
1071 \r
1072 \r
1073         $query .= ' ORDER BY ctime DESC'\r
1074                 . " LIMIT $start,$amount";\r
1075 \r
1076 \r
1077         $blog =& $manager->getBlog($blogid);\r
1078 \r
1079         $this->pagehead();\r
1080 \r
1081         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';\r
1082         echo '<h2>', _COMMENTS_BLOG , ' ' , $this->bloglink($blog), '</h2>';\r
1083 \r
1084         $template['content'] = 'commentlist';\r
1085         $template['canAddBan'] = $member->blogAdminRights($blogid);\r
1086 \r
1087         $manager->loadClass("ENCAPSULATE");\r
1088         $navList =& new NAVLIST('blogcommentlist', $start, $amount, 0, 1000, $blogid, $search, 0);\r
1089         $navList->showBatchList('comment',$query,'table',$template, _NOCOMMENTS_BLOG);\r
1090 \r
1091         $this->pagefoot();\r
1092     }\r
1093 \r
1094     /**\r
1095      * Provide a page to item a new item to the given blog\r
1096      */\r
1097     function action_createitem() {\r
1098         global $member, $manager;\r
1099 \r
1100         $blogid = intRequestVar('blogid');\r
1101 \r
1102         // check if allowed\r
1103         $member->teamRights($blogid) or $this->disallow();\r
1104 \r
1105         $memberid = $member->getID();\r
1106 \r
1107         $blog =& $manager->getBlog($blogid);\r
1108 \r
1109         $this->pagehead();\r
1110 \r
1111         // generate the add-item form\r
1112         $formfactory =& new PAGEFACTORY($blogid);\r
1113         $formfactory->createAddForm('admin');\r
1114 \r
1115         $this->pagefoot();\r
1116     }\r
1117 \r
1118     /**\r
1119      * @todo document this\r
1120      */\r
1121     function action_itemedit() {\r
1122         global $member, $manager;\r
1123 \r
1124         $itemid = intRequestVar('itemid');\r
1125 \r
1126         // only allow if user is allowed to alter item\r
1127         $member->canAlterItem($itemid) or $this->disallow();\r
1128 \r
1129         $item =& $manager->getItem($itemid,1,1);\r
1130         $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));\r
1131 \r
1132         $manager->notify('PrepareItemForEdit', array('item' => &$item));\r
1133 \r
1134         if ($blog->convertBreaks()) {\r
1135             $item['body'] = removeBreaks($item['body']);\r
1136             $item['more'] = removeBreaks($item['more']);\r
1137         }\r
1138 \r
1139         // form to edit blog items\r
1140         $this->pagehead();\r
1141         $formfactory =& new PAGEFACTORY($blog->getID());\r
1142         $formfactory->createEditForm('admin',$item);\r
1143         $this->pagefoot();\r
1144     }\r
1145 \r
1146     /**\r
1147      * @todo document this\r
1148      */\r
1149     function action_itemupdate() {\r
1150         global $member, $manager, $CONF;\r
1151 \r
1152         $itemid = intRequestVar('itemid');\r
1153         $catid = postVar('catid');\r
1154 \r
1155         // only allow if user is allowed to alter item\r
1156         $member->canUpdateItem($itemid, $catid) or $this->disallow();\r
1157 \r
1158         $actiontype = postVar('actiontype');\r
1159 \r
1160         // delete actions are handled by itemdelete (which has confirmation)\r
1161         if ($actiontype == 'delete') {\r
1162             $this->action_itemdelete();\r
1163             return;\r
1164         }\r
1165 \r
1166         $body   = postVar('body');\r
1167         $title  = postVar('title');\r
1168         $more   = postVar('more');\r
1169         $closed = intPostVar('closed');\r
1170         $draftid = intPostVar('draftid');\r
1171 \r
1172         // default action = add now\r
1173         if (!$actiontype)\r
1174             $actiontype='addnow';\r
1175 \r
1176         // create new category if needed\r
1177         if (strstr($catid,'newcat')) {\r
1178             // get blogid\r
1179             list($blogid) = sscanf($catid,"newcat-%d");\r
1180 \r
1181             // create\r
1182             $blog =& $manager->getBlog($blogid);\r
1183             $catid = $blog->createNewCategory();\r
1184 \r
1185             // show error when sth goes wrong\r
1186             if (!$catid)\r
1187                 $this->doError(_ERROR_CATCREATEFAIL);\r
1188         }\r
1189 \r
1190         /*\r
1191             set some variables based on actiontype\r
1192 \r
1193             actiontypes:\r
1194                 draft items -> addnow, addfuture, adddraft, delete\r
1195                 non-draft items -> edit, changedate, delete\r
1196 \r
1197             variables set:\r
1198                 $timestamp: set to a nonzero value for future dates or date changes\r
1199                 $wasdraft: set to 1 when the item used to be a draft item\r
1200                 $publish: set to 1 when the edited item is not a draft\r
1201         */\r
1202         $blogid =  getBlogIDFromItemID($itemid);\r
1203         $blog   =& $manager->getBlog($blogid);\r
1204 \r
1205         $wasdrafts = array('adddraft', 'addfuture', 'addnow');\r
1206         $wasdraft  = in_array($actiontype, $wasdrafts) ? 1 : 0;\r
1207         $publish   = ($actiontype != 'adddraft' && $actiontype != 'backtodrafts') ? 1 : 0;\r
1208         if ($actiontype == 'addfuture' || $actiontype == 'changedate') {\r
1209             $timestamp = mktime(intPostVar('hour'), intPostVar('minutes'), 0, intPostVar('month'), intPostVar('day'), intPostVar('year'));\r
1210         } else {\r
1211             $timestamp =0;\r
1212         }\r
1213 \r
1214         // edit the item for real\r
1215         ITEM::update($itemid, $catid, $title, $body, $more, $closed, $wasdraft, $publish, $timestamp);\r
1216 \r
1217         $this->updateFuturePosted($blogid);\r
1218 \r
1219         if ($draftid > 0) {\r
1220             // delete permission is checked inside ITEM::delete()\r
1221             ITEM::delete($draftid);\r
1222         }\r
1223 \r
1224         // show category edit window when we created a new category\r
1225         // ($catid will then be a new category ID, while postVar('catid') will be 'newcat-x')\r
1226         if ($catid != intPostVar('catid')) {\r
1227             $this->action_categoryedit(\r
1228                 $catid,\r
1229                 $blog->getID(),\r
1230                 $CONF['AdminURL'] . 'index.php?action=itemlist&blogid=' . getBlogIDFromItemID($itemid)\r
1231             );\r
1232         } else {\r
1233             // TODO: set start item correctly for itemlist\r
1234             $this->action_itemlist(getBlogIDFromItemID($itemid));\r
1235         }\r
1236     }\r
1237 \r
1238     /**\r
1239      * @todo document this\r
1240      */\r
1241     function action_itemdelete() {\r
1242         global $member, $manager;\r
1243 \r
1244         $itemid = intRequestVar('itemid');\r
1245 \r
1246         // only allow if user is allowed to alter item\r
1247         $member->canAlterItem($itemid) or $this->disallow();\r
1248 \r
1249         if (!$manager->existsItem($itemid,1,1))\r
1250             $this->error(_ERROR_NOSUCHITEM);\r
1251 \r
1252         $item =& $manager->getItem($itemid,1,1);\r
1253         $title = htmlspecialchars(strip_tags($item['title']));\r
1254         $body = strip_tags($item['body']);\r
1255         $body = htmlspecialchars(shorten($body,300,'...'));\r
1256 \r
1257         $this->pagehead();\r
1258         ?>\r
1259             <h2><?php echo _DELETE_CONFIRM?></h2>\r
1260 \r
1261             <p><?php echo _CONFIRMTXT_ITEM?></p>\r
1262 \r
1263             <div class="note">\r
1264                 <b>"<?php echo  $title ?>"</b>\r
1265                 <br />\r
1266                 <?php echo $body?>\r
1267             </div>\r
1268 \r
1269             <form method="post" action="index.php"><div>\r
1270                 <input type="hidden" name="action" value="itemdeleteconfirm" />\r
1271                 <?php $manager->addTicketHidden() ?>\r
1272                 <input type="hidden" name="itemid" value="<?php echo  $itemid; ?>" />\r
1273                 <input type="submit" value="<?php echo _DELETE_CONFIRM_BTN?>"  tabindex="10" />\r
1274             </div></form>\r
1275         <?php\r
1276         $this->pagefoot();\r
1277     }\r
1278 \r
1279     /**\r
1280      * @todo document this\r
1281      */\r
1282     function action_itemdeleteconfirm() {\r
1283         global $member;\r
1284 \r
1285         $itemid = intRequestVar('itemid');\r
1286 \r
1287         // only allow if user is allowed to alter item\r
1288         $member->canAlterItem($itemid) or $this->disallow();\r
1289 \r
1290         // get blogid first\r
1291         $blogid = getBlogIdFromItemId($itemid);\r
1292 \r
1293         // delete item (note: some checks will be performed twice)\r
1294         $this->deleteOneItem($itemid);\r
1295 \r
1296         $this->action_itemlist($blogid);\r
1297     }\r
1298 \r
1299     /**\r
1300      * Deletes one item and returns error if something goes wrong\r
1301      * @param int $itemid\r
1302      */\r
1303     function deleteOneItem($itemid) {\r
1304         global $member, $manager;\r
1305 \r
1306         // only allow if user is allowed to alter item (also checks if itemid exists)\r
1307         if (!$member->canAlterItem($itemid))\r
1308             return _ERROR_DISALLOWED;\r
1309 \r
1310         // need to get blogid before the item is deleted\r
1311         $blogid = getBlogIDFromItemId($itemid);\r
1312 \r
1313         $manager->loadClass('ITEM');\r
1314         ITEM::delete($itemid);\r
1315 \r
1316         // update blog's futureposted\r
1317         $this->updateFuturePosted($blogid);\r
1318     }\r
1319 \r
1320     /**\r
1321      * Update a blog's future posted flag\r
1322      * @param int $blogid\r
1323      */\r
1324     function updateFuturePosted($blogid) {\r
1325         global $manager;\r
1326 \r
1327         $blog =& $manager->getBlog($blogid);\r
1328         $currenttime = $blog->getCorrectTime(time());\r
1329         $result = sql_query("SELECT * FROM ".sql_table('item').\r
1330             " WHERE iblog='".$blogid."' AND iposted=0 AND itime>".mysqldate($currenttime));\r
1331         if (sql_num_rows($result) > 0) {\r
1332                 $blog->setFuturePost();\r
1333         }\r
1334         else {\r
1335                 $blog->clearFuturePost();\r
1336         }\r
1337     }\r
1338 \r
1339     /**\r
1340      * @todo document this\r
1341      */\r
1342     function action_itemmove() {\r
1343         global $member, $manager;\r
1344 \r
1345         $itemid = intRequestVar('itemid');\r
1346 \r
1347         // only allow if user is allowed to alter item\r
1348         $member->canAlterItem($itemid) or $this->disallow();\r
1349 \r
1350         $item =& $manager->getItem($itemid,1,1);\r
1351 \r
1352         $this->pagehead();\r
1353         ?>\r
1354             <h2><?php echo _MOVE_TITLE?></h2>\r
1355             <form method="post" action="index.php"><div>\r
1356                 <input type="hidden" name="action" value="itemmoveto" />\r
1357                 <input type="hidden" name="itemid" value="<?php echo  $itemid; ?>" />\r
1358 \r
1359                 <?php\r
1360 \r
1361                     $manager->addTicketHidden();\r
1362                     $this->selectBlogCategory('catid',$item['catid'],10,1);\r
1363                 ?>\r
1364 \r
1365                 <input type="submit" value="<?php echo _MOVE_BTN?>" tabindex="10000" onclick="return checkSubmit();" />\r
1366             </div></form>\r
1367         <?php\r
1368         $this->pagefoot();\r
1369     }\r
1370 \r
1371     /**\r
1372      * @todo document this\r
1373      */\r
1374     function action_itemmoveto() {\r
1375         global $member, $manager;\r
1376 \r
1377         $itemid = intRequestVar('itemid');\r
1378         $catid = requestVar('catid');\r
1379 \r
1380         // create new category if needed\r
1381         if (strstr($catid,'newcat')) {\r
1382             // get blogid\r
1383             list($blogid) = sscanf($catid,'newcat-%d');\r
1384 \r
1385             // create\r
1386             $blog =& $manager->getBlog($blogid);\r
1387             $catid = $blog->createNewCategory();\r
1388 \r
1389             // show error when sth goes wrong\r
1390             if (!$catid)\r
1391                 $this->doError(_ERROR_CATCREATEFAIL);\r
1392         }\r
1393 \r
1394         // only allow if user is allowed to alter item\r
1395         $member->canUpdateItem($itemid, $catid) or $this->disallow();\r
1396 \r
1397         $old_blogid = getBlogIDFromItemId($itemid);\r
1398 \r
1399         ITEM::move($itemid, $catid);\r
1400 \r
1401         // set the futurePosted flag on the blog\r
1402         $this->updateFuturePosted(getBlogIDFromItemId($itemid));\r
1403 \r
1404         // reset the futurePosted in case the item is moved from one blog to another\r
1405         $this->updateFuturePosted($old_blogid);\r
1406 \r
1407         if ($catid != intRequestVar('catid'))\r
1408             $this->action_categoryedit($catid, $blog->getID());\r
1409         else\r
1410             $this->action_itemlist(getBlogIDFromCatID($catid));\r
1411     }\r
1412 \r
1413     /**\r
1414      * Moves one item to a given category (category existance should be checked by caller)\r
1415      * errors are returned\r
1416      * @param int $itemid\r
1417      * @param int $destCatid category ID to which the item will be moved\r
1418      */\r
1419     function moveOneItem($itemid, $destCatid) {\r
1420         global $member;\r
1421 \r
1422         // only allow if user is allowed to move item\r
1423         if (!$member->canUpdateItem($itemid, $destCatid))\r
1424             return _ERROR_DISALLOWED;\r
1425 \r
1426         ITEM::move($itemid, $destCatid);\r
1427     }\r
1428 \r
1429     /**\r
1430      * Adds a item to the chosen blog\r
1431      */\r
1432     function action_additem() {\r
1433         global $manager, $CONF;\r
1434 \r
1435         $manager->loadClass('ITEM');\r
1436 \r
1437         $result = ITEM::createFromRequest();\r
1438 \r
1439         if ($result['status'] == 'error')\r
1440             $this->error($result['message']);\r
1441 \r
1442         $blogid = getBlogIDFromItemID($result['itemid']);\r
1443         $blog =& $manager->getBlog($blogid);\r
1444         $btimestamp = $blog->getCorrectTime();\r
1445         $item       = $manager->getItem(intval($result['itemid']), 1, 1);\r
1446 \r
1447         if ($result['status'] == 'newcategory') {\r
1448             $distURI = $manager->addTicketToUrl($CONF['AdminURL'] . 'index.php?action=itemList&blogid=' . intval($blogid));\r
1449             $this->action_categoryedit($result['catid'], $blogid, $distURI);\r
1450         } else {\r
1451             $methodName = 'action_itemList';\r
1452             call_user_func(array(&$this, $methodName), $blogid);\r
1453         }\r
1454     }\r
1455 \r
1456     /**\r
1457      * Allows to edit previously made comments\r
1458      */\r
1459     function action_commentedit() {\r
1460         global $member, $manager;\r
1461 \r
1462         $commentid = intRequestVar('commentid');\r
1463 \r
1464         $member->canAlterComment($commentid) or $this->disallow();\r
1465 \r
1466         $comment = COMMENT::getComment($commentid);\r
1467 \r
1468         $manager->notify('PrepareCommentForEdit',array('comment' => &$comment));\r
1469 \r
1470         // change <br /> to \n\r
1471         $comment['body'] = str_replace('<br />','',$comment['body']);\r
1472 \r
1473         $comment['body'] = eregi_replace("<a href=['\"]([^'\"]+)['\"]( rel=\"nofollow\")?>[^<]*</a>","\\1",$comment['body']);\r
1474 \r
1475         $this->pagehead();\r
1476 \r
1477         ?>\r
1478         <h2><?php echo _EDITC_TITLE?></h2>\r
1479 \r
1480         <form action="index.php" method="post"><div>\r
1481 \r
1482         <input type="hidden" name="action" value="commentupdate" />\r
1483         <?php $manager->addTicketHidden(); ?>\r
1484         <input type="hidden" name="commentid" value="<?php echo  $commentid; ?>" />\r
1485         <table><tr>\r
1486             <th colspan="2"><?php echo _EDITC_TITLE?></th>\r
1487         </tr><tr>\r
1488             <td><?php echo _EDITC_WHO?></td>\r
1489             <td>\r
1490             <?php               if ($comment['member'])\r
1491                     echo $comment['member'] . " (" . _EDITC_MEMBER . ")";\r
1492                 else\r
1493                     echo $comment['user'] . " (" . _EDITC_NONMEMBER . ")";\r
1494             ?>\r
1495             </td>\r
1496         </tr><tr>\r
1497             <td><?php echo _EDITC_WHEN?></td>\r
1498             <td><?php echo  date("Y-m-d @ H:i",$comment['timestamp']); ?></td>\r
1499         </tr><tr>\r
1500             <td><?php echo _EDITC_HOST?></td>\r
1501             <td><?php echo  $comment['host']; ?></td>\r
1502         </tr>\r
1503         <tr>\r
1504             <td><?php echo _EDITC_URL; ?></td>\r
1505             <td><input type="text" name="url" size="30" tabindex="6" value="<?php echo $comment['userid']; ?>" /></td>\r
1506         </tr>\r
1507         <tr>\r
1508             <td><?php echo _EDITC_EMAIL; ?></td>\r
1509             <td><input type="text" name="email" size="30" tabindex="8" value="<?php echo $comment['email']; ?>" /></td>\r
1510         </tr>\r
1511         <tr>\r
1512             <td><?php echo _EDITC_TEXT?></td>\r
1513             <td>\r
1514                 <textarea name="body" tabindex="10" rows="10" cols="50"><?php                   // htmlspecialchars not needed (things should be escaped already)\r
1515                     echo $comment['body'];\r
1516                 ?></textarea>\r
1517             </td>\r
1518         </tr><tr>\r
1519             <td><?php echo _EDITC_EDIT?></td>\r
1520             <td><input type="submit"  tabindex="20" value="<?php echo _EDITC_EDIT?>" onclick="return checkSubmit();" /></td>\r
1521         </tr></table>\r
1522 \r
1523         </div></form>\r
1524         <?php\r
1525         $this->pagefoot();\r
1526     }\r
1527 \r
1528     /**\r
1529      * @todo document this\r
1530      */\r
1531     function action_commentupdate() {\r
1532         global $member, $manager;\r
1533 \r
1534         $commentid = intRequestVar('commentid');\r
1535 \r
1536         $member->canAlterComment($commentid) or $this->disallow();\r
1537 \r
1538         $url = postVar('url');\r
1539         $email = postVar('email');\r
1540         $body = postVar('body');\r
1541 \r
1542         // intercept words that are too long\r
1543         if (eregi("[a-zA-Z0-9|\.,;:!\?=\/\\]{90,90}",$body) != false)\r
1544             $this->error(_ERROR_COMMENT_LONGWORD);\r
1545 \r
1546         // check length\r
1547         if (strlen($body)<3)\r
1548             $this->error(_ERROR_COMMENT_NOCOMMENT);\r
1549         if (strlen($body)>5000)\r
1550             $this->error(_ERROR_COMMENT_TOOLONG);\r
1551 \r
1552 \r
1553         // prepare body\r
1554         $body = COMMENT::prepareBody($body);\r
1555 \r
1556         // call plugins\r
1557         $manager->notify('PreUpdateComment',array('body' => &$body));\r
1558 \r
1559         $query =  'UPDATE '.sql_table('comment')\r
1560                . " SET cmail = '" . addslashes($url) . "', cemail = '" . addslashes($email) . "', cbody = '" . addslashes($body) . "'"\r
1561                . " WHERE cnumber=" . $commentid;\r
1562         sql_query($query);\r
1563 \r
1564         // get itemid\r
1565         $res = sql_query('SELECT citem FROM '.sql_table('comment').' WHERE cnumber=' . $commentid);\r
1566         $o = sql_fetch_object($res);\r
1567         $itemid = $o->citem;\r
1568 \r
1569         if ($member->canAlterItem($itemid))\r
1570             $this->action_itemcommentlist($itemid);\r
1571         else\r
1572             $this->action_browseowncomments();\r
1573 \r
1574     }\r
1575 \r
1576     /**\r
1577      * @todo document this\r
1578      */\r
1579     function action_commentdelete() {\r
1580         global $member, $manager;\r
1581 \r
1582         $commentid = intRequestVar('commentid');\r
1583 \r
1584         $member->canAlterComment($commentid) or $this->disallow();\r
1585 \r
1586         $comment = COMMENT::getComment($commentid);\r
1587 \r
1588         $body = strip_tags($comment['body']);\r
1589         $body = htmlspecialchars(shorten($body, 300, '...'));\r
1590 \r
1591         if ($comment['member'])\r
1592             $author = $comment['member'];\r
1593         else\r
1594             $author = $comment['user'];\r
1595 \r
1596         $this->pagehead();\r
1597         ?>\r
1598 \r
1599             <h2><?php echo _DELETE_CONFIRM?></h2>\r
1600 \r
1601             <p><?php echo _CONFIRMTXT_COMMENT?></p>\r
1602 \r
1603             <div class="note">\r
1604             <b><?php echo _EDITC_WHO?>:</b> <?php echo  $author ?>\r
1605             <br />\r
1606             <b><?php echo _EDITC_TEXT?>:</b> <?php echo  $body ?>\r
1607             </div>\r
1608 \r
1609             <form method="post" action="index.php"><div>\r
1610                 <input type="hidden" name="action" value="commentdeleteconfirm" />\r
1611                 <?php $manager->addTicketHidden() ?>\r
1612                 <input type="hidden" name="commentid" value="<?php echo  $commentid; ?>" />\r
1613                 <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
1614             </div></form>\r
1615         <?php\r
1616         $this->pagefoot();\r
1617     }\r
1618 \r
1619     /**\r
1620      * @todo document this\r
1621      */\r
1622     function action_commentdeleteconfirm() {\r
1623         global $member;\r
1624 \r
1625         $commentid = intRequestVar('commentid');\r
1626 \r
1627         // get item id first\r
1628         $res = sql_query('SELECT citem FROM '.sql_table('comment') .' WHERE cnumber=' . $commentid);\r
1629         $o = sql_fetch_object($res);\r
1630         $itemid = $o->citem;\r
1631 \r
1632         $error = $this->deleteOneComment($commentid);\r
1633         if ($error)\r
1634             $this->doError($error);\r
1635 \r
1636         if ($member->canAlterItem($itemid))\r
1637             $this->action_itemcommentlist($itemid);\r
1638         else\r
1639             $this->action_browseowncomments();\r
1640     }\r
1641 \r
1642     /**\r
1643      * @todo document this\r
1644      */\r
1645     function deleteOneComment($commentid) {\r
1646         global $member, $manager;\r
1647 \r
1648         $commentid = intval($commentid);\r
1649 \r
1650         if (!$member->canAlterComment($commentid))\r
1651             return _ERROR_DISALLOWED;\r
1652 \r
1653         $manager->notify('PreDeleteComment', array('commentid' => $commentid));\r
1654 \r
1655         // delete the comments associated with the item\r
1656         $query = 'DELETE FROM '.sql_table('comment').' WHERE cnumber=' . $commentid;\r
1657         sql_query($query);\r
1658 \r
1659         $manager->notify('PostDeleteComment', array('commentid' => $commentid));\r
1660 \r
1661         return '';\r
1662     }\r
1663 \r
1664     /**\r
1665      * Usermanagement main\r
1666      */\r
1667     function action_usermanagement() {\r
1668         global $member, $manager;\r
1669 \r
1670         // check if allowed\r
1671         $member->isAdmin() or $this->disallow();\r
1672 \r
1673         $this->pagehead();\r
1674 \r
1675         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
1676 \r
1677         echo '<h2>' . _MEMBERS_TITLE .'</h2>';\r
1678 \r
1679         echo '<h3>' . _MEMBERS_CURRENT .'</h3>';\r
1680 \r
1681         // show list of members with actions\r
1682         $query =  'SELECT *'\r
1683                . ' FROM '.sql_table('member');\r
1684         $template['content'] = 'memberlist';\r
1685         $template['tabindex'] = 10;\r
1686 \r
1687         $manager->loadClass("ENCAPSULATE");\r
1688         $batch =& new BATCH('member');\r
1689         $batch->showlist($query,'table',$template);\r
1690 \r
1691         echo '<h3>' . _MEMBERS_NEW .'</h3>';\r
1692         ?>\r
1693             <form method="post" action="index.php" name="memberedit"><div>\r
1694 \r
1695             <input type="hidden" name="action" value="memberadd" />\r
1696             <?php $manager->addTicketHidden() ?>\r
1697 \r
1698             <table>\r
1699             <tr>\r
1700                 <th colspan="2"><?php echo _MEMBERS_NEW?></th>\r
1701             </tr><tr>\r
1702                 <td><?php echo _MEMBERS_DISPLAY?> <?php help('shortnames');?>\r
1703                 <br /><small><?php echo _MEMBERS_DISPLAY_INFO?></small>\r
1704                 </td>\r
1705                 <td><input tabindex="10010" name="name" size="32" maxlength="32" /></td>\r
1706             </tr><tr>\r
1707                 <td><?php echo _MEMBERS_REALNAME?></td>\r
1708                 <td><input name="realname" tabindex="10020" size="40" maxlength="60" /></td>\r
1709             </tr><tr>\r
1710                 <td><?php echo _MEMBERS_PWD?></td>\r
1711                 <td><input name="password" tabindex="10030" size="16" maxlength="40" type="password" /></td>\r
1712             </tr><tr>\r
1713                 <td><?php echo _MEMBERS_REPPWD?></td>\r
1714                 <td><input name="repeatpassword" tabindex="10035" size="16" maxlength="40" type="password" /></td>\r
1715             </tr><tr>\r
1716                 <td><?php echo _MEMBERS_EMAIL?></td>\r
1717                 <td><input name="email" tabindex="10040" size="40" maxlength="60" /></td>\r
1718             </tr><tr>\r
1719                 <td><?php echo _MEMBERS_URL?></td>\r
1720                 <td><input name="url" tabindex="10050" size="40" maxlength="100" /></td>\r
1721             </tr><tr>\r
1722                 <td><?php echo _MEMBERS_SUPERADMIN?> <?php help('superadmin'); ?></td>\r
1723                 <td><?php $this->input_yesno('admin',0,10060); ?> </td>\r
1724             </tr><tr>\r
1725                 <td><?php echo _MEMBERS_CANLOGIN?> <?php help('canlogin'); ?></td>\r
1726                 <td><?php $this->input_yesno('canlogin',1,10070); ?></td>\r
1727             </tr><tr>\r
1728                 <td><?php echo _MEMBERS_NOTES?></td>\r
1729                 <td><input name="notes" maxlength="100" size="40" tabindex="10080" /></td>\r
1730             </tr><tr>\r
1731                 <td><?php echo _MEMBERS_NEW?></td>\r
1732                 <td><input type="submit" value="<?php echo _MEMBERS_NEW_BTN?>" tabindex="10090" onclick="return checkSubmit();" /></td>\r
1733             </tr></table>\r
1734 \r
1735             </div></form>\r
1736         <?php\r
1737         $this->pagefoot();\r
1738     }\r
1739 \r
1740     /**\r
1741      * Edit member settings\r
1742      */\r
1743     function action_memberedit() {\r
1744         $this->action_editmembersettings(intRequestVar('memberid'));\r
1745     }\r
1746 \r
1747     /**\r
1748      * @todo document this\r
1749      */\r
1750     function action_editmembersettings($memberid = '') {\r
1751         global $member, $manager, $CONF;\r
1752 \r
1753         if ($memberid == '')\r
1754             $memberid = $member->getID();\r
1755 \r
1756         // check if allowed\r
1757         ($member->getID() == $memberid) or $member->isAdmin() or $this->disallow();\r
1758 \r
1759         $extrahead = '<script type="text/javascript" src="javascript/numbercheck.js"></script>';\r
1760         $this->pagehead($extrahead);\r
1761 \r
1762         // show message to go back to member overview (only for admins)\r
1763         if ($member->isAdmin())\r
1764             echo '<a href="index.php?action=usermanagement">(' ._MEMBERS_BACKTOOVERVIEW. ')</a>';\r
1765         else\r
1766             echo '<a href="index.php?action=overview">(' ._BACKHOME. ')</a>';\r
1767 \r
1768         echo '<h2>' . _MEMBERS_EDIT . '</h2>';\r
1769 \r
1770         $mem = MEMBER::createFromID($memberid);\r
1771 \r
1772         ?>\r
1773         <form method="post" action="index.php" name="memberedit"><div>\r
1774 \r
1775         <input type="hidden" name="action" value="changemembersettings" />\r
1776         <input type="hidden" name="memberid" value="<?php echo  $memberid; ?>" />\r
1777         <?php $manager->addTicketHidden() ?>\r
1778 \r
1779         <table><tr>\r
1780             <th colspan="2"><?php echo _MEMBERS_EDIT?></th>\r
1781         </tr><tr>\r
1782             <td><?php echo _MEMBERS_DISPLAY?> <?php help('shortnames');?>\r
1783                 <br /><small><?php echo _MEMBERS_DISPLAY_INFO?></small>\r
1784             </td>\r
1785             <td>\r
1786             <?php if ($CONF['AllowLoginEdit'] || $member->isAdmin()) { ?>\r
1787                 <input name="name" tabindex="10" maxlength="32" size="32" value="<?php echo  htmlspecialchars($mem->getDisplayName()); ?>" />\r
1788             <?php } else {\r
1789                 echo htmlspecialchars($member->getDisplayName());\r
1790                }\r
1791             ?>\r
1792             </td>\r
1793         </tr><tr>\r
1794             <td><?php echo _MEMBERS_REALNAME?></td>\r
1795             <td><input name="realname" tabindex="20" maxlength="60" size="40" value="<?php echo  htmlspecialchars($mem->getRealName()); ?>" /></td>\r
1796         </tr><tr>\r
1797         <?php if ($CONF['AllowLoginEdit'] || $member->isAdmin()) { ?>\r
1798             <td><?php echo _MEMBERS_PWD?></td>\r
1799             <td><input type="password" tabindex="30" maxlength="40" size="16" name="password" /></td>\r
1800         </tr><tr>\r
1801             <td><?php echo _MEMBERS_REPPWD?></td>\r
1802             <td><input type="password" tabindex="35" maxlength="40" size="16" name="repeatpassword" /></td>\r
1803         <?php } ?>\r
1804         </tr><tr>\r
1805             <td><?php echo _MEMBERS_EMAIL?>\r
1806                 <br /><small><?php echo _MEMBERS_EMAIL_EDIT?></small>\r
1807             </td>\r
1808             <td><input name="email" tabindex="40" size="40" maxlength="60" value="<?php echo  htmlspecialchars($mem->getEmail()); ?>" /></td>\r
1809         </tr><tr>\r
1810             <td><?php echo _MEMBERS_URL?></td>\r
1811             <td><input name="url" tabindex="50" size="40" maxlength="100" value="<?php echo  htmlspecialchars($mem->getURL()); ?>" /></td>\r
1812         <?php // only allow to change this by super-admins\r
1813            // we don't want normal users to 'upgrade' themselves to super-admins, do we? ;-)\r
1814            if ($member->isAdmin()) {\r
1815         ?>\r
1816             </tr><tr>\r
1817                 <td><?php echo _MEMBERS_SUPERADMIN?> <?php help('superadmin'); ?></td>\r
1818                 <td><?php $this->input_yesno('admin',$mem->isAdmin(),60); ?></td>\r
1819             </tr><tr>\r
1820                 <td><?php echo _MEMBERS_CANLOGIN?> <?php help('canlogin'); ?></td>\r
1821                 <td><?php $this->input_yesno('canlogin',$mem->canLogin(),70,1,0,_YES,_NO,$mem->isAdmin()); ?></td>\r
1822         <?php } ?>\r
1823         </tr><tr>\r
1824             <td><?php echo _MEMBERS_NOTES?></td>\r
1825             <td><input name="notes" tabindex="80" size="40" maxlength="100" value="<?php echo  htmlspecialchars($mem->getNotes()); ?>" /></td>\r
1826         </tr><tr>\r
1827             <td><?php echo _MEMBERS_DEFLANG?> <?php help('language'); ?>\r
1828             </td>\r
1829             <td>\r
1830 \r
1831                 <select name="deflang" tabindex="85">\r
1832                     <option value=""><?php echo _MEMBERS_USESITELANG?></option>\r
1833                 <?php               // show a dropdown list of all available languages\r
1834                 global $DIR_LANG;\r
1835                 $dirhandle = opendir($DIR_LANG);\r
1836                 while ($filename = readdir($dirhandle)) {\r
1837                     if (ereg("^(.*)\.php$",$filename,$matches)) {\r
1838                         $name = $matches[1];\r
1839                         echo "<option value='$name'";\r
1840                         if ($name == $mem->getLanguage())\r
1841                             echo " selected='selected'";\r
1842                         echo ">$name</option>";\r
1843                     }\r
1844                 }\r
1845                 closedir($dirhandle);\r
1846 \r
1847                 ?>\r
1848                 </select>\r
1849 \r
1850             </td>\r
1851         </tr>\r
1852         <tr>\r
1853             <td><?php echo _MEMBERS_USEAUTOSAVE?> <?php help('autosave'); ?></td>\r
1854             <td><?php $this->input_yesno('autosave', $mem->getAutosave(), 87); ?></td>\r
1855         </tr>\r
1856         <?php\r
1857             // plugin options\r
1858             $this->_insertPluginOptions('member',$memberid);\r
1859         ?>\r
1860         <tr>\r
1861             <th colspan="2"><?php echo _MEMBERS_EDIT ?></th>\r
1862         </tr><tr>\r
1863             <td><?php echo _MEMBERS_EDIT?></td>\r
1864             <td><input type="submit" tabindex="90" value="<?php echo _MEMBERS_EDIT_BTN?>" onclick="return checkSubmit();" /></td>\r
1865         </tr></table>\r
1866 \r
1867         </div></form>\r
1868 \r
1869         <?php\r
1870             echo '<h3>',_PLUGINS_EXTRA,'</h3>';\r
1871 \r
1872             $manager->notify(\r
1873                 'MemberSettingsFormExtras',\r
1874                 array(\r
1875                     'member' => &$mem\r
1876                 )\r
1877             );\r
1878 \r
1879         $this->pagefoot();\r
1880     }\r
1881 \r
1882     /**\r
1883      * @todo document this\r
1884      */\r
1885     function action_changemembersettings() {\r
1886         global $member, $CONF, $manager;\r
1887 \r
1888         $memberid = intRequestVar('memberid');\r
1889 \r
1890         // check if allowed\r
1891         ($member->getID() == $memberid) or $member->isAdmin() or $this->disallow();\r
1892 \r
1893         $name           = trim(strip_tags(postVar('name')));\r
1894         $realname       = trim(strip_tags(postVar('realname')));\r
1895         $password       = postVar('password');\r
1896         $repeatpassword = postVar('repeatpassword');\r
1897         $email          = strip_tags(postVar('email'));\r
1898         $url            = strip_tags(postVar('url'));\r
1899 \r
1900         // Sometimes user didn't prefix the URL with http://, this cause a malformed URL. Let's fix it.\r
1901         if (!eregi("^https?://", $url))\r
1902             $url = "http://".$url;\r
1903 \r
1904         $admin          = postVar('admin');\r
1905         $canlogin       = postVar('canlogin');\r
1906         $notes          = strip_tags(postVar('notes'));\r
1907         $deflang        = postVar('deflang');\r
1908 \r
1909         $mem = MEMBER::createFromID($memberid);\r
1910 \r
1911         if ($CONF['AllowLoginEdit'] || $member->isAdmin()) {\r
1912 \r
1913             if (!isValidDisplayName($name))\r
1914                 $this->error(_ERROR_BADNAME);\r
1915 \r
1916             if (($name != $mem->getDisplayName()) && MEMBER::exists($name))\r
1917                 $this->error(_ERROR_NICKNAMEINUSE);\r
1918 \r
1919             if ($password != $repeatpassword)\r
1920                 $this->error(_ERROR_PASSWORDMISMATCH);\r
1921 \r
1922             if ($password && (strlen($password) < 6))\r
1923                 $this->error(_ERROR_PASSWORDTOOSHORT);\r
1924 \r
1925             $pwdvalid = true;\r
1926             $pwderror = '';\r
1927             $manager->notify('PrePasswordSet',array('password' => $password, 'errormessage' => &$pwderror, 'valid' => &$pwdvalid));\r
1928             if (!$pwdvalid) {\r
1929                 $this->error($pwderror);\r
1930             }\r
1931         }\r
1932 \r
1933         if (!isValidMailAddress($email))\r
1934             $this->error(_ERROR_BADMAILADDRESS);\r
1935 \r
1936 \r
1937         if (!$realname)\r
1938             $this->error(_ERROR_REALNAMEMISSING);\r
1939 \r
1940         if (($deflang != '') && (!checkLanguage($deflang)))\r
1941             $this->error(_ERROR_NOSUCHLANGUAGE);\r
1942 \r
1943         // check if there will remain at least one site member with both the logon and admin rights\r
1944         // (check occurs when taking away one of these rights from such a member)\r
1945         if (    (!$admin && $mem->isAdmin() && $mem->canLogin())\r
1946              || (!$canlogin && $mem->isAdmin() && $mem->canLogin())\r
1947            )\r
1948         {\r
1949             $r = sql_query('SELECT * FROM '.sql_table('member').' WHERE madmin=1 and mcanlogin=1');\r
1950             if (sql_num_rows($r) < 2)\r
1951                 $this->error(_ERROR_ATLEASTONEADMIN);\r
1952         }\r
1953 \r
1954         if ($CONF['AllowLoginEdit'] || $member->isAdmin()) {\r
1955             $mem->setDisplayName($name);\r
1956             if ($password)\r
1957                 $mem->setPassword($password);\r
1958         }\r
1959 \r
1960         $oldEmail = $mem->getEmail();\r
1961 \r
1962         $mem->setRealName($realname);\r
1963         $mem->setEmail($email);\r
1964         $mem->setURL($url);\r
1965         $mem->setNotes($notes);\r
1966         $mem->setLanguage($deflang);\r
1967 \r
1968 \r
1969         // only allow super-admins to make changes to the admin status\r
1970         if ($member->isAdmin()) {\r
1971             $mem->setAdmin($admin);\r
1972             $mem->setCanLogin($canlogin);\r
1973         }\r
1974 \r
1975         $autosave = postVar ('autosave');\r
1976         $mem->setAutosave($autosave);\r
1977 \r
1978         $mem->write();\r
1979 \r
1980         // store plugin options\r
1981         $aOptions = requestArray('plugoption');\r
1982         NucleusPlugin::_applyPluginOptions($aOptions);\r
1983         $manager->notify('PostPluginOptionsUpdate',array('context' => 'member', 'memberid' => $memberid, 'member' => &$mem));\r
1984 \r
1985         // if email changed, generate new password\r
1986         if ($oldEmail != $mem->getEmail())\r
1987         {\r
1988             $mem->sendActivationLink('addresschange', $oldEmail);\r
1989             // logout member\r
1990             $mem->newCookieKey();\r
1991 \r
1992             // only log out if the member being edited is the current member.\r
1993             if ($member->getID() == $memberid)\r
1994                 $member->logout();\r
1995             $this->action_login(_MSG_ACTIVATION_SENT, 0);\r
1996             return;\r
1997         }\r
1998 \r
1999 \r
2000         if (  ( $mem->getID() == $member->getID() )\r
2001            && ( $mem->getDisplayName() != $member->getDisplayName() )\r
2002            ) {\r
2003             $mem->newCookieKey();\r
2004             $member->logout();\r
2005             $this->action_login(_MSG_LOGINAGAIN, 0);\r
2006         } else {\r
2007             $this->action_overview(_MSG_SETTINGSCHANGED);\r
2008         }\r
2009     }\r
2010 \r
2011     /**\r
2012      * @todo document this\r
2013      */\r
2014     function action_memberadd() {\r
2015         global $member, $manager;\r
2016 \r
2017         // check if allowed\r
2018         $member->isAdmin() or $this->disallow();\r
2019 \r
2020         if (postVar('password') != postVar('repeatpassword'))\r
2021             $this->error(_ERROR_PASSWORDMISMATCH);\r
2022         if (strlen(postVar('password')) < 6)\r
2023             $this->error(_ERROR_PASSWORDTOOSHORT);\r
2024 \r
2025         $res = MEMBER::create(postVar('name'), postVar('realname'), postVar('password'), postVar('email'), postVar('url'), postVar('admin'), postVar('canlogin'), postVar('notes'));\r
2026         if ($res != 1)\r
2027             $this->error($res);\r
2028 \r
2029         // fire PostRegister event\r
2030         $newmem = new MEMBER();\r
2031         $newmem->readFromName(postVar('name'));\r
2032         $manager->notify('PostRegister',array('member' => &$newmem));\r
2033 \r
2034         $this->action_usermanagement();\r
2035     }\r
2036 \r
2037     /**\r
2038      * Account activation\r
2039      *\r
2040      * @author dekarma\r
2041      */\r
2042     function action_activate() {\r
2043 \r
2044         $key = getVar('key');\r
2045         $this->_showActivationPage($key);\r
2046     }\r
2047 \r
2048     /**\r
2049      * @todo document this\r
2050      */\r
2051     function _showActivationPage($key, $message = '')\r
2052     {\r
2053         global $manager;\r
2054 \r
2055         // clean up old activation keys\r
2056         MEMBER::cleanupActivationTable();\r
2057 \r
2058         // get activation info\r
2059         $info = MEMBER::getActivationInfo($key);\r
2060 \r
2061         if (!$info)\r
2062             $this->error(_ERROR_ACTIVATE);\r
2063 \r
2064         $mem = MEMBER::createFromId($info->vmember);\r
2065 \r
2066         if (!$mem)\r
2067             $this->error(_ERROR_ACTIVATE);\r
2068 \r
2069         $text = '';\r
2070         $title = '';\r
2071         $bNeedsPasswordChange = true;\r
2072 \r
2073         switch ($info->vtype)\r
2074         {\r
2075             case 'forgot':\r
2076                 $title = _ACTIVATE_FORGOT_TITLE;\r
2077                 $text = _ACTIVATE_FORGOT_TEXT;\r
2078                 break;\r
2079             case 'register':\r
2080                 $title = _ACTIVATE_REGISTER_TITLE;\r
2081                 $text = _ACTIVATE_REGISTER_TEXT;\r
2082                 break;\r
2083             case 'addresschange':\r
2084                 $title = _ACTIVATE_CHANGE_TITLE;\r
2085                 $text = _ACTIVATE_CHANGE_TEXT;\r
2086                 $bNeedsPasswordChange = false;\r
2087                 MEMBER::activate($key);\r
2088                 break;\r
2089         }\r
2090 \r
2091         $aVars = array(\r
2092             'memberName' => htmlspecialchars($mem->getDisplayName())\r
2093         );\r
2094         $title = TEMPLATE::fill($title, $aVars);\r
2095         $text = TEMPLATE::fill($text, $aVars);\r
2096 \r
2097         $this->pagehead();\r
2098 \r
2099             echo '<h2>' , $title, '</h2>';\r
2100             echo '<p>' , $text, '</p>';\r
2101 \r
2102             if ($message != '')\r
2103             {\r
2104                 echo '<p class="error">',$message,'</p>';\r
2105             }\r
2106 \r
2107             if ($bNeedsPasswordChange)\r
2108             {\r
2109                 ?>\r
2110                     <div><form action="index.php" method="post">\r
2111 \r
2112                         <input type="hidden" name="action" value="activatesetpwd" />\r
2113                         <?php $manager->addTicketHidden() ?>\r
2114                         <input type="hidden" name="key" value="<?php echo htmlspecialchars($key) ?>" />\r
2115 \r
2116                         <table><tr>\r
2117                             <td><?php echo _MEMBERS_PWD?></td>\r
2118                             <td><input type="password" maxlength="40" size="16" name="password" /></td>\r
2119                         </tr><tr>\r
2120                             <td><?php echo _MEMBERS_REPPWD?></td>\r
2121                             <td><input type="password" maxlength="40" size="16" name="repeatpassword" /></td>\r
2122                         <?php\r
2123 \r
2124                             global $manager;\r
2125                             $manager->notify('FormExtra', array('type' => 'activation', 'member' => $mem));\r
2126 \r
2127                         ?>\r
2128                         </tr><tr>\r
2129                             <td><?php echo _MEMBERS_SETPWD ?></td>\r
2130                             <td><input type='submit' value='<?php echo _MEMBERS_SETPWD_BTN ?>' /></td>\r
2131                         </tr></table>\r
2132 \r
2133 \r
2134                     </form></div>\r
2135 \r
2136                 <?php\r
2137 \r
2138             }\r
2139 \r
2140         $this->pagefoot();\r
2141 \r
2142     }\r
2143 \r
2144     /**\r
2145      * Account activation - set password part\r
2146      *\r
2147      * @author dekarma\r
2148      */\r
2149     function action_activatesetpwd() {\r
2150 \r
2151         $key = postVar('key');\r
2152 \r
2153         // clean up old activation keys\r
2154         MEMBER::cleanupActivationTable();\r
2155 \r
2156         // get activation info\r
2157         $info = MEMBER::getActivationInfo($key);\r
2158 \r
2159         if (!$info || ($info->type == 'addresschange'))\r
2160             return $this->_showActivationPage($key, _ERROR_ACTIVATE);\r
2161 \r
2162         $mem = MEMBER::createFromId($info->vmember);\r
2163 \r
2164         if (!$mem)\r
2165             return $this->_showActivationPage($key, _ERROR_ACTIVATE);\r
2166 \r
2167         $password       = postVar('password');\r
2168         $repeatpassword = postVar('repeatpassword');\r
2169 \r
2170         if ($password != $repeatpassword)\r
2171             return $this->_showActivationPage($key, _ERROR_PASSWORDMISMATCH);\r
2172 \r
2173         if ($password && (strlen($password) < 6))\r
2174             return $this->_showActivationPage($key, _ERROR_PASSWORDTOOSHORT);\r
2175 \r
2176         $pwdvalid = true;\r
2177         $pwderror = '';\r
2178         $manager->notify('PrePasswordSet',array('password' => $password, 'errormessage' => &$pwderror, 'valid' => &$pwdvalid));\r
2179         if (!$pwdvalid) {\r
2180             return $this->_showActivationPage($key,$pwderror);\r
2181         }\r
2182 \r
2183         $error = '';\r
2184         global $manager;\r
2185         $manager->notify('ValidateForm', array('type' => 'activation', 'member' => $mem, 'error' => &$error));\r
2186         if ($error != '')\r
2187             return $this->_showActivationPage($key, $error);\r
2188 \r
2189 \r
2190         // set password\r
2191         $mem->setPassword($password);\r
2192         $mem->write();\r
2193 \r
2194         // do the activation\r
2195         MEMBER::activate($key);\r
2196 \r
2197         $this->pagehead();\r
2198             echo '<h2>',_ACTIVATE_SUCCESS_TITLE,'</h2>';\r
2199             echo '<p>',_ACTIVATE_SUCCESS_TEXT,'</p>';\r
2200         $this->pagefoot();\r
2201     }\r
2202 \r
2203     /**\r
2204      * Manage team\r
2205      */\r
2206     function action_manageteam() {\r
2207         global $member, $manager;\r
2208 \r
2209         $blogid = intRequestVar('blogid');\r
2210 \r
2211         // check if allowed\r
2212         $member->blogAdminRights($blogid) or $this->disallow();\r
2213 \r
2214         $this->pagehead();\r
2215 \r
2216         echo "<p><a href='index.php?action=blogsettings&amp;blogid=$blogid'>(",_BACK_TO_BLOGSETTINGS,")</a></p>";\r
2217 \r
2218         echo '<h2>' . _TEAM_TITLE . getBlogNameFromID($blogid) . '</h2>';\r
2219 \r
2220         echo '<h3>' . _TEAM_CURRENT . '</h3>';\r
2221 \r
2222 \r
2223 \r
2224         $query =  'SELECT tblog, tmember, mname, mrealname, memail, tadmin'\r
2225                . ' FROM '.sql_table('member').', '.sql_table('team')\r
2226                . ' WHERE tmember=mnumber and tblog=' . $blogid;\r
2227 \r
2228         $template['content'] = 'teamlist';\r
2229         $template['tabindex'] = 10;\r
2230 \r
2231         $manager->loadClass("ENCAPSULATE");\r
2232         $batch =& new BATCH('team');\r
2233         $batch->showlist($query, 'table', $template);\r
2234 \r
2235         ?>\r
2236             <h3><?php echo _TEAM_ADDNEW?></h3>\r
2237 \r
2238             <form method='post' action='index.php'><div>\r
2239 \r
2240             <input type='hidden' name='action' value='teamaddmember' />\r
2241             <input type='hidden' name='blogid' value='<?php echo  $blogid; ?>' />\r
2242             <?php $manager->addTicketHidden() ?>\r
2243 \r
2244             <table><tr>\r
2245                 <td><?php echo _TEAM_CHOOSEMEMBER?></td>\r
2246                 <td><?php                   // TODO: try to make it so only non-team-members are listed\r
2247                     $query =  'SELECT mname as text, mnumber as value'\r
2248                            . ' FROM '.sql_table('member');\r
2249 \r
2250                     $template['name'] = 'memberid';\r
2251                     $template['tabindex'] = 10000;\r
2252                     showlist($query,'select',$template);\r
2253                 ?></td>\r
2254             </tr><tr>\r
2255                 <td><?php echo _TEAM_ADMIN?><?php help('teamadmin'); ?></td>\r
2256                 <td><?php $this->input_yesno('admin',0,10020); ?></td>\r
2257             </tr><tr>\r
2258                 <td><?php echo _TEAM_ADD?></td>\r
2259                 <td><input type='submit' value='<?php echo _TEAM_ADD_BTN?>' tabindex="10030" /></td>\r
2260             </tr></table>\r
2261 \r
2262             </div></form>\r
2263         <?php\r
2264         $this->pagefoot();\r
2265     }\r
2266 \r
2267     /**\r
2268      * Add member to team\r
2269      */\r
2270     function action_teamaddmember() {\r
2271         global $member, $manager;\r
2272 \r
2273         $memberid = intPostVar('memberid');\r
2274         $blogid = intPostVar('blogid');\r
2275         $admin = intPostVar('admin');\r
2276 \r
2277         // check if allowed\r
2278         $member->blogAdminRights($blogid) or $this->disallow();\r
2279 \r
2280         $blog =& $manager->getBlog($blogid);\r
2281         if (!$blog->addTeamMember($memberid, $admin))\r
2282             $this->error(_ERROR_ALREADYONTEAM);\r
2283 \r
2284         $this->action_manageteam();\r
2285 \r
2286     }\r
2287 \r
2288     /**\r
2289      * @todo document this\r
2290      */\r
2291     function action_teamdelete() {\r
2292         global $member, $manager;\r
2293 \r
2294         $memberid = intRequestVar('memberid');\r
2295         $blogid = intRequestVar('blogid');\r
2296 \r
2297         // check if allowed\r
2298         $member->blogAdminRights($blogid) or $this->disallow();\r
2299 \r
2300         $teammem = MEMBER::createFromID($memberid);\r
2301         $blog =& $manager->getBlog($blogid);\r
2302 \r
2303         $this->pagehead();\r
2304         ?>\r
2305             <h2><?php echo _DELETE_CONFIRM?></h2>\r
2306 \r
2307             <p><?php echo _CONFIRMTXT_TEAM1?><b><?php echo  htmlspecialchars($teammem->getDisplayName()) ?></b><?php echo _CONFIRMTXT_TEAM2?><b><?php echo  htmlspecialchars(strip_tags($blog->getName())) ?></b>\r
2308             </p>\r
2309 \r
2310 \r
2311             <form method="post" action="index.php"><div>\r
2312             <input type="hidden" name="action" value="teamdeleteconfirm" />\r
2313             <?php $manager->addTicketHidden() ?>\r
2314             <input type="hidden" name="memberid" value="<?php echo  $memberid; ?>" />\r
2315             <input type="hidden" name="blogid" value="<?php echo  $blogid; ?>" />\r
2316             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
2317             </div></form>\r
2318         <?php\r
2319         $this->pagefoot();\r
2320     }\r
2321 \r
2322     /**\r
2323      * @todo document this\r
2324      */\r
2325     function action_teamdeleteconfirm() {\r
2326         global $member;\r
2327 \r
2328         $memberid = intRequestVar('memberid');\r
2329         $blogid = intRequestVar('blogid');\r
2330 \r
2331         $error = $this->deleteOneTeamMember($blogid, $memberid);\r
2332         if ($error)\r
2333             $this->error($error);\r
2334 \r
2335 \r
2336         $this->action_manageteam();\r
2337     }\r
2338 \r
2339     /**\r
2340      * @todo document this\r
2341      */\r
2342     function deleteOneTeamMember($blogid, $memberid) {\r
2343         global $member, $manager;\r
2344 \r
2345         $blogid = intval($blogid);\r
2346         $memberid = intval($memberid);\r
2347 \r
2348         // check if allowed\r
2349         if (!$member->blogAdminRights($blogid))\r
2350             return _ERROR_DISALLOWED;\r
2351 \r
2352         // check if: - there remains at least one blog admin\r
2353         //           - (there remains at least one team member)\r
2354         $tmem = MEMBER::createFromID($memberid);\r
2355 \r
2356         $manager->notify('PreDeleteTeamMember', array('member' => &$tmem, 'blogid' => $blogid));\r
2357 \r
2358         if ($tmem->isBlogAdmin($blogid)) {\r
2359             // check if there are more blog members left and at least one admin\r
2360             // (check for at least two admins before deletion)\r
2361             $query = 'SELECT * FROM '.sql_table('team') . ' WHERE tblog='.$blogid.' and tadmin=1';\r
2362             $r = sql_query($query);\r
2363             if (sql_num_rows($r) < 2)\r
2364                 return _ERROR_ATLEASTONEBLOGADMIN;\r
2365         }\r
2366 \r
2367         $query = 'DELETE FROM '.sql_table('team')." WHERE tblog=$blogid and tmember=$memberid";\r
2368         sql_query($query);\r
2369 \r
2370         $manager->notify('PostDeleteTeamMember', array('member' => &$tmem, 'blogid' => $blogid));\r
2371 \r
2372         return '';\r
2373     }\r
2374 \r
2375     /**\r
2376      * @todo document this\r
2377      */\r
2378     function action_teamchangeadmin() {\r
2379         global $member;\r
2380 \r
2381         $blogid = intRequestVar('blogid');\r
2382         $memberid = intRequestVar('memberid');\r
2383 \r
2384         // check if allowed\r
2385         $member->blogAdminRights($blogid) or $this->disallow();\r
2386 \r
2387         $mem = MEMBER::createFromID($memberid);\r
2388 \r
2389         // don't allow when there is only one admin at this moment\r
2390         if ($mem->isBlogAdmin($blogid)) {\r
2391             $r = sql_query('SELECT * FROM '.sql_table('team') . " WHERE tblog=$blogid and tadmin=1");\r
2392             if (sql_num_rows($r) == 1)\r
2393                 $this->error(_ERROR_ATLEASTONEBLOGADMIN);\r
2394         }\r
2395 \r
2396         if ($mem->isBlogAdmin($blogid))\r
2397             $newval = 0;\r
2398         else\r
2399             $newval = 1;\r
2400 \r
2401         $query = 'UPDATE '.sql_table('team') ." SET tadmin=$newval WHERE tblog=$blogid and tmember=$memberid";\r
2402         sql_query($query);\r
2403 \r
2404         // only show manageteam if member did not change its own admin privileges\r
2405         if ($member->isBlogAdmin($blogid))\r
2406             $this->action_manageteam();\r
2407         else\r
2408             $this->action_overview(_MSG_ADMINCHANGED);\r
2409     }\r
2410 \r
2411     /**\r
2412      * @todo document this\r
2413      */\r
2414     function action_blogsettings() {\r
2415         global $member, $manager;\r
2416 \r
2417         $blogid = intRequestVar('blogid');\r
2418 \r
2419         // check if allowed\r
2420         $member->blogAdminRights($blogid) or $this->disallow();\r
2421 \r
2422         $blog =& $manager->getBlog($blogid);\r
2423 \r
2424         $extrahead = '<script type="text/javascript" src="javascript/numbercheck.js"></script>';\r
2425         $this->pagehead($extrahead);\r
2426 \r
2427         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';\r
2428         ?>\r
2429         <h2><?php echo _EBLOG_TITLE?>: '<?php echo $this->bloglink($blog)?>'</h2>\r
2430 \r
2431         <h3><?php echo _EBLOG_TEAM_TITLE?></h3>\r
2432 \r
2433         <p><?php echo _EBLOG_CURRENT_TEAM_MEMBER; ?>\r
2434         <?php\r
2435             $res = sql_query('SELECT mname, mrealname FROM ' . sql_table('member') . ',' . sql_table('team') . ' WHERE mnumber=tmember AND tblog=' . intval($blogid));\r
2436             $aMemberNames = array();\r
2437             while ($o = sql_fetch_object($res))\r
2438                 array_push($aMemberNames, htmlspecialchars($o->mname) . ' (' . htmlspecialchars($o->mrealname). ')');\r
2439             echo implode(',', $aMemberNames);\r
2440         ?>\r
2441         </p>\r
2442 \r
2443 \r
2444 \r
2445         <p>\r
2446         <a href="index.php?action=manageteam&amp;blogid=<?php echo $blogid?>"><?php echo _EBLOG_TEAM_TEXT?></a>\r
2447         </p>\r
2448 \r
2449         <h3><?php echo _EBLOG_SETTINGS_TITLE?></h3>\r
2450 \r
2451         <form method="post" action="index.php"><div>\r
2452 \r
2453         <input type="hidden" name="action" value="blogsettingsupdate" />\r
2454         <?php $manager->addTicketHidden() ?>\r
2455         <input type="hidden" name="blogid" value="<?php echo  $blogid; ?>" />\r
2456         <table><tr>\r
2457             <td><?php echo _EBLOG_NAME?></td>\r
2458             <td><input name="name" tabindex="10" size="40" maxlength="60" value="<?php echo  htmlspecialchars($blog->getName()) ?>" /></td>\r
2459         </tr><tr>\r
2460             <td><?php echo _EBLOG_SHORTNAME?> <?php help('shortblogname'); ?>\r
2461                 <?php echo _EBLOG_SHORTNAME_EXTRA?>\r
2462             </td>\r
2463             <td><input name="shortname" tabindex="20" maxlength="15" size="15" value="<?php echo  htmlspecialchars($blog->getShortName()) ?>" /></td>\r
2464         </tr><tr>\r
2465             <td><?php echo _EBLOG_DESC?></td>\r
2466             <td><input name="desc" tabindex="30" maxlength="200" size="40" value="<?php echo  htmlspecialchars($blog->getDescription()) ?>" /></td>\r
2467         </tr><tr>\r
2468             <td><?php echo _EBLOG_URL?></td>\r
2469             <td><input name="url" tabindex="40" size="40" maxlength="100" value="<?php echo  htmlspecialchars($blog->getURL()) ?>" /></td>\r
2470         </tr><tr>\r
2471             <td><?php echo _EBLOG_DEFSKIN?>\r
2472                 <?php help('blogdefaultskin'); ?>\r
2473             </td>\r
2474             <td>\r
2475                 <?php\r
2476                     $query =  'SELECT sdname as text, sdnumber as value'\r
2477                            . ' FROM '.sql_table('skin_desc');\r
2478                     $template['name'] = 'defskin';\r
2479                     $template['selected'] = $blog->getDefaultSkin();\r
2480                     $template['tabindex'] = 50;\r
2481                     showlist($query,'select',$template);\r
2482                 ?>\r
2483 \r
2484             </td>\r
2485         </tr><tr>\r
2486             <td><?php echo _EBLOG_LINEBREAKS?> <?php help('convertbreaks'); ?>\r
2487             </td>\r
2488             <td><?php $this->input_yesno('convertbreaks',$blog->convertBreaks(),55); ?></td>\r
2489         </tr><tr>\r
2490             <td><?php echo _EBLOG_ALLOWPASTPOSTING?> <?php help('allowpastposting'); ?>\r
2491             </td>\r
2492             <td><?php $this->input_yesno('allowpastposting',$blog->allowPastPosting(),57); ?></td>\r
2493         </tr><tr>\r
2494             <td><?php echo _EBLOG_DISABLECOMMENTS?>\r
2495             </td>\r
2496             <td><?php $this->input_yesno('comments',$blog->commentsEnabled(),60); ?></td>\r
2497         </tr><tr>\r
2498             <td><?php echo _EBLOG_ANONYMOUS?>\r
2499             </td>\r
2500             <td><?php $this->input_yesno('public',$blog->isPublic(),70); ?></td>\r
2501         </tr><tr>\r
2502     <td><?php echo _EBLOG_REQUIREDEMAIL?>\r
2503          </td>\r
2504          <td><?php $this->input_yesno('reqemail',$blog->emailRequired(),72); ?></td>\r
2505       </tr><tr>\r
2506             <td><?php echo _EBLOG_NOTIFY?> <?php help('blognotify'); ?></td>\r
2507             <td><input name="notify" tabindex="80" maxlength="60" size="40" value="<?php echo  htmlspecialchars($blog->getNotifyAddress()); ?>" /></td>\r
2508         </tr><tr>\r
2509             <td><?php echo _EBLOG_NOTIFY_ON?></td>\r
2510             <td>\r
2511                 <input name="notifyComment" value="3" type="checkbox" tabindex="81" id="notifyComment"\r
2512                     <?php if  ($blog->notifyOnComment()) echo "checked='checked'" ?>\r
2513                 /><label for="notifyComment"><?php echo _EBLOG_NOTIFY_COMMENT?></label>\r
2514                 <br />\r
2515                 <input name="notifyVote" value="5" type="checkbox" tabindex="82" id="notifyVote"\r
2516                     <?php if  ($blog->notifyOnVote()) echo "checked='checked'" ?>\r
2517                 /><label for="notifyVote"><?php echo _EBLOG_NOTIFY_KARMA?></label>\r
2518                 <br />\r
2519                 <input name="notifyNewItem" value="7" type="checkbox" tabindex="83" id="notifyNewItem"\r
2520                     <?php if  ($blog->notifyOnNewItem()) echo "checked='checked'" ?>\r
2521                 /><label for="notifyNewItem"><?php echo _EBLOG_NOTIFY_ITEM?></label>\r
2522             </td>\r
2523         </tr><tr>\r
2524             <td><?php echo _EBLOG_MAXCOMMENTS?> <?php help('blogmaxcomments'); ?></td>\r
2525             <td><input name="maxcomments" tabindex="90" size="3" value="<?php echo  htmlspecialchars($blog->getMaxComments()); ?>" /></td>\r
2526         </tr><tr>\r
2527             <td><?php echo _EBLOG_UPDATE?> <?php help('blogupdatefile'); ?></td>\r
2528             <td><input name="update" tabindex="100" size="40" maxlength="60" value="<?php echo  htmlspecialchars($blog->getUpdateFile()) ?>" /></td>\r
2529         </tr><tr>\r
2530             <td><?php echo _EBLOG_DEFCAT?></td>\r
2531             <td>\r
2532                 <?php\r
2533                     $query =  'SELECT cname as text, catid as value'\r
2534                            . ' FROM '.sql_table('category')\r
2535                            . ' WHERE cblog=' . $blog->getID();\r
2536                     $template['name'] = 'defcat';\r
2537                     $template['selected'] = $blog->getDefaultCategory();\r
2538                     $template['tabindex'] = 110;\r
2539                     showlist($query,'select',$template);\r
2540                 ?>\r
2541             </td>\r
2542         </tr><tr>\r
2543             <td><?php echo _EBLOG_OFFSET?> <?php help('blogtimeoffset'); ?>\r
2544                 <br /><?php echo _EBLOG_STIME?> <b><?php echo  strftime("%H:%M",time()); ?></b>\r
2545                 <br /><?php echo _EBLOG_BTIME?> <b><?php echo  strftime("%H:%M",$blog->getCorrectTime()); ?></b>\r
2546                 </td>\r
2547             <td><input name="timeoffset" tabindex="120" size="3" value="<?php echo  htmlspecialchars($blog->getTimeOffset()); ?>" /></td>\r
2548         </tr><tr>\r
2549             <td><?php echo _EBLOG_SEARCH?> <?php help('blogsearchable'); ?></td>\r
2550             <td><?php $this->input_yesno('searchable',$blog->getSearchable(),122); ?></td>\r
2551         </tr>\r
2552         <?php\r
2553             // plugin options\r
2554             $this->_insertPluginOptions('blog',$blogid);\r
2555         ?>\r
2556         <tr>\r
2557             <th colspan="2"><?php echo _EBLOG_CHANGE?></th>\r
2558         </tr><tr>\r
2559             <td><?php echo _EBLOG_CHANGE?></td>\r
2560             <td><input type="submit" tabindex="130" value="<?php echo _EBLOG_CHANGE_BTN?>" onclick="return checkSubmit();" /></td>\r
2561         </tr></table>\r
2562 \r
2563         </div></form>\r
2564 \r
2565         <h3><?php echo _EBLOG_CAT_TITLE?></h3>\r
2566 \r
2567 \r
2568         <?php\r
2569         $query = 'SELECT * FROM '.sql_table('category').' WHERE cblog='.$blog->getID().' ORDER BY cname';\r
2570         $template['content'] = 'categorylist';\r
2571         $template['tabindex'] = 200;\r
2572 \r
2573         $manager->loadClass("ENCAPSULATE");\r
2574         $batch =& new BATCH('category');\r
2575         $batch->showlist($query,'table',$template);\r
2576 \r
2577         ?>\r
2578 \r
2579 \r
2580         <form action="index.php" method="post"><div>\r
2581         <input name="action" value="categorynew" type="hidden" />\r
2582         <?php $manager->addTicketHidden() ?>\r
2583         <input name="blogid" value="<?php echo $blog->getID()?>" type="hidden" />\r
2584 \r
2585         <table><tr>\r
2586             <th colspan="2"><?php echo _EBLOG_CAT_CREATE?></th>\r
2587         </tr><tr>\r
2588             <td><?php echo _EBLOG_CAT_NAME?></td>\r
2589             <td><input name="cname" size="40" maxlength="40" tabindex="300" /></td>\r
2590         </tr><tr>\r
2591             <td><?php echo _EBLOG_CAT_DESC?></td>\r
2592             <td><input name="cdesc" size="40" maxlength="200" tabindex="310" /></td>\r
2593         </tr><tr>\r
2594             <td><?php echo _EBLOG_CAT_CREATE?></td>\r
2595             <td><input type="submit" value="<?php echo _EBLOG_CAT_CREATE?>" tabindex="320" /></td>\r
2596         </tr></table>\r
2597 \r
2598         </div></form>\r
2599 \r
2600         <?php\r
2601 \r
2602             echo '<h3>',_PLUGINS_EXTRA,'</h3>';\r
2603 \r
2604             $manager->notify(\r
2605                 'BlogSettingsFormExtras',\r
2606                 array(\r
2607                     'blog' => &$blog\r
2608                 )\r
2609             );\r
2610 \r
2611         $this->pagefoot();\r
2612     }\r
2613 \r
2614     /**\r
2615      * @todo document this\r
2616      */\r
2617     function action_categorynew() {\r
2618         global $member, $manager;\r
2619 \r
2620         $blogid = intRequestVar('blogid');\r
2621 \r
2622         $member->blogAdminRights($blogid) or $this->disallow();\r
2623 \r
2624         $cname = postVar('cname');\r
2625         $cdesc = postVar('cdesc');\r
2626 \r
2627         if (!isValidCategoryName($cname))\r
2628             $this->error(_ERROR_BADCATEGORYNAME);\r
2629 \r
2630         $query = 'SELECT * FROM '.sql_table('category') . ' WHERE cname=\'' . addslashes($cname).'\' and cblog=' . intval($blogid);\r
2631         $res = sql_query($query);\r
2632         if (sql_num_rows($res) > 0)\r
2633             $this->error(_ERROR_DUPCATEGORYNAME);\r
2634 \r
2635         $blog       =& $manager->getBlog($blogid);\r
2636         $newCatID   =  $blog->createNewCategory($cname, $cdesc);\r
2637 \r
2638         $this->action_blogsettings();\r
2639     }\r
2640 \r
2641     /**\r
2642      * @todo document this\r
2643      */\r
2644     function action_categoryedit($catid = '', $blogid = '', $desturl = '') {\r
2645         global $member, $manager;\r
2646 \r
2647         if ($blogid == '')\r
2648             $blogid = intGetVar('blogid');\r
2649         else\r
2650             $blogid = intval($blogid);\r
2651         if ($catid == '')\r
2652             $catid = intGetVar('catid');\r
2653         else\r
2654             $catid = intval($catid);\r
2655 \r
2656         $member->blogAdminRights($blogid) or $this->disallow();\r
2657 \r
2658         $res = sql_query('SELECT * FROM '.sql_table('category')." WHERE cblog=$blogid AND catid=$catid");\r
2659         $obj = sql_fetch_object($res);\r
2660 \r
2661         $cname = $obj->cname;\r
2662         $cdesc = $obj->cdesc;\r
2663 \r
2664         $extrahead = '<script type="text/javascript" src="javascript/numbercheck.js"></script>';\r
2665         $this->pagehead($extrahead);\r
2666 \r
2667         echo "<p><a href='index.php?action=blogsettings&amp;blogid=$blogid'>(",_BACK_TO_BLOGSETTINGS,")</a></p>";\r
2668 \r
2669         ?>\r
2670         <h2><?php echo _EBLOG_CAT_UPDATE?> '<?php echo htmlspecialchars($cname)?>'</h2>\r
2671         <form method='post' action='index.php'><div>\r
2672         <input name="blogid" type="hidden" value="<?php echo $blogid?>" />\r
2673         <input name="catid" type="hidden" value="<?php echo $catid?>" />\r
2674         <input name="desturl" type="hidden" value="<?php echo htmlspecialchars($desturl) ?>" />\r
2675         <input name="action" type="hidden" value="categoryupdate" />\r
2676         <?php $manager->addTicketHidden(); ?>\r
2677 \r
2678         <table><tr>\r
2679             <th colspan="2"><?php echo _EBLOG_CAT_UPDATE ?></th>\r
2680         </tr><tr>\r
2681             <td><?php echo _EBLOG_CAT_NAME?></td>\r
2682             <td><input type="text" name="cname" value="<?php echo htmlspecialchars($cname)?>" size="40" maxlength="40" /></td>\r
2683         </tr><tr>\r
2684             <td><?php echo _EBLOG_CAT_DESC?></td>\r
2685             <td><input type="text" name="cdesc" value="<?php echo htmlspecialchars($cdesc)?>" size="40" maxlength="200" /></td>\r
2686         </tr>\r
2687         <?php\r
2688             // insert plugin options\r
2689             $this->_insertPluginOptions('category',$catid);\r
2690         ?>\r
2691         <tr>\r
2692             <th colspan="2"><?php echo _EBLOG_CAT_UPDATE ?></th>\r
2693         </tr><tr>\r
2694             <td><?php echo _EBLOG_CAT_UPDATE?></td>\r
2695             <td><input type="submit" value="<?php echo _EBLOG_CAT_UPDATE_BTN?>" /></td>\r
2696         </tr></table>\r
2697 \r
2698         </div></form>\r
2699         <?php\r
2700         $this->pagefoot();\r
2701     }\r
2702 \r
2703     /**\r
2704      * @todo document this\r
2705      */\r
2706     function action_categoryupdate() {\r
2707         global $member, $manager;\r
2708 \r
2709         $blogid = intPostVar('blogid');\r
2710         $catid = intPostVar('catid');\r
2711         $cname = postVar('cname');\r
2712         $cdesc = postVar('cdesc');\r
2713         $desturl = postVar('desturl');\r
2714 \r
2715         $member->blogAdminRights($blogid) or $this->disallow();\r
2716 \r
2717         if (!isValidCategoryName($cname))\r
2718             $this->error(_ERROR_BADCATEGORYNAME);\r
2719 \r
2720         $query = 'SELECT * FROM '.sql_table('category').' WHERE cname=\'' . addslashes($cname).'\' and cblog=' . intval($blogid) . " and not(catid=$catid)";\r
2721         $res = sql_query($query);\r
2722         if (sql_num_rows($res) > 0)\r
2723             $this->error(_ERROR_DUPCATEGORYNAME);\r
2724 \r
2725         $query =  'UPDATE '.sql_table('category').' SET'\r
2726                . " cname='" . addslashes($cname) . "',"\r
2727                . " cdesc='" . addslashes($cdesc) . "'"\r
2728                . " WHERE catid=" . $catid;\r
2729 \r
2730         sql_query($query);\r
2731 \r
2732         // store plugin options\r
2733         $aOptions = requestArray('plugoption');\r
2734         NucleusPlugin::_applyPluginOptions($aOptions);\r
2735         $manager->notify('PostPluginOptionsUpdate',array('context' => 'category', 'catid' => $catid));\r
2736 \r
2737 \r
2738         if ($desturl) {\r
2739             redirect($desturl);\r
2740             exit;\r
2741         } else {\r
2742             $this->action_blogsettings();\r
2743         }\r
2744     }\r
2745 \r
2746     /**\r
2747      * @todo document this\r
2748      */\r
2749     function action_categorydelete() {\r
2750         global $member, $manager;\r
2751 \r
2752         $blogid = intRequestVar('blogid');\r
2753         $catid = intRequestVar('catid');\r
2754 \r
2755         $member->blogAdminRights($blogid) or $this->disallow();\r
2756 \r
2757         $blog =& $manager->getBlog($blogid);\r
2758 \r
2759         // check if the category is valid\r
2760         if (!$blog->isValidCategory($catid))\r
2761             $this->error(_ERROR_NOSUCHCATEGORY);\r
2762 \r
2763         // don't allow deletion of default category\r
2764         if ($blog->getDefaultCategory() == $catid)\r
2765             $this->error(_ERROR_DELETEDEFCATEGORY);\r
2766 \r
2767         // check if catid is the only category left for blogid\r
2768         $query = 'SELECT catid FROM '.sql_table('category').' WHERE cblog=' . $blogid;\r
2769         $res = sql_query($query);\r
2770         if (sql_num_rows($res) == 1)\r
2771             $this->error(_ERROR_DELETELASTCATEGORY);\r
2772 \r
2773 \r
2774         $this->pagehead();\r
2775         ?>\r
2776             <h2><?php echo _DELETE_CONFIRM?></h2>\r
2777 \r
2778             <div>\r
2779             <?php echo _CONFIRMTXT_CATEGORY?><b><?php echo  htmlspecialchars($blog->getCategoryName($catid))?></b>\r
2780             </div>\r
2781 \r
2782             <form method="post" action="index.php"><div>\r
2783             <input type="hidden" name="action" value="categorydeleteconfirm" />\r
2784             <?php $manager->addTicketHidden() ?>\r
2785             <input type="hidden" name="blogid" value="<?php echo $blogid?>" />\r
2786             <input type="hidden" name="catid" value="<?php echo $catid?>" />\r
2787             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
2788             </div></form>\r
2789         <?php\r
2790         $this->pagefoot();\r
2791     }\r
2792 \r
2793     /**\r
2794      * @todo document this\r
2795      */\r
2796     function action_categorydeleteconfirm() {\r
2797         global $member, $manager;\r
2798 \r
2799         $blogid = intRequestVar('blogid');\r
2800         $catid = intRequestVar('catid');\r
2801 \r
2802         $member->blogAdminRights($blogid) or $this->disallow();\r
2803 \r
2804         $error = $this->deleteOneCategory($catid);\r
2805         if ($error)\r
2806             $this->error($error);\r
2807 \r
2808         $this->action_blogsettings();\r
2809     }\r
2810 \r
2811     /**\r
2812      * @todo document this\r
2813      */\r
2814     function deleteOneCategory($catid) {\r
2815         global $manager, $member;\r
2816 \r
2817         $catid = intval($catid);\r
2818 \r
2819         $blogid = getBlogIDFromCatID($catid);\r
2820 \r
2821         if (!$member->blogAdminRights($blogid))\r
2822             return ERROR_DISALLOWED;\r
2823 \r
2824         // get blog\r
2825         $blog =& $manager->getBlog($blogid);\r
2826 \r
2827         // check if the category is valid\r
2828         if (!$blog || !$blog->isValidCategory($catid))\r
2829             return _ERROR_NOSUCHCATEGORY;\r
2830 \r
2831         $destcatid = $blog->getDefaultCategory();\r
2832 \r
2833         // don't allow deletion of default category\r
2834         if ($blog->getDefaultCategory() == $catid)\r
2835             return _ERROR_DELETEDEFCATEGORY;\r
2836 \r
2837         // check if catid is the only category left for blogid\r
2838         $query = 'SELECT catid FROM '.sql_table('category').' WHERE cblog=' . $blogid;\r
2839         $res = sql_query($query);\r
2840         if (sql_num_rows($res) == 1)\r
2841             return _ERROR_DELETELASTCATEGORY;\r
2842 \r
2843         $manager->notify('PreDeleteCategory', array('catid' => $catid));\r
2844 \r
2845         // change category for all items to the default category\r
2846         $query = 'UPDATE '.sql_table('item')." SET icat=$destcatid WHERE icat=$catid";\r
2847         sql_query($query);\r
2848 \r
2849         // delete all associated plugin options\r
2850         NucleusPlugin::_deleteOptionValues('category', $catid);\r
2851 \r
2852         // delete category\r
2853         $query = 'DELETE FROM '.sql_table('category').' WHERE catid=' .$catid;\r
2854         sql_query($query);\r
2855 \r
2856         $manager->notify('PostDeleteCategory', array('catid' => $catid));\r
2857 \r
2858     }\r
2859 \r
2860     /**\r
2861      * @todo document this\r
2862      */\r
2863     function moveOneCategory($catid, $destblogid) {\r
2864         global $manager, $member;\r
2865 \r
2866         $catid = intval($catid);\r
2867         $destblogid = intval($destblogid);\r
2868 \r
2869         $blogid = getBlogIDFromCatID($catid);\r
2870 \r
2871         // mover should have admin rights on both blogs\r
2872         if (!$member->blogAdminRights($blogid))\r
2873             return _ERROR_DISALLOWED;\r
2874         if (!$member->blogAdminRights($destblogid))\r
2875             return _ERROR_DISALLOWED;\r
2876 \r
2877         // cannot move to self\r
2878         if ($blogid == $destblogid)\r
2879             return _ERROR_MOVETOSELF;\r
2880 \r
2881         // get blogs\r
2882         $blog =& $manager->getBlog($blogid);\r
2883         $destblog =& $manager->getBlog($destblogid);\r
2884 \r
2885         // check if the category is valid\r
2886         if (!$blog || !$blog->isValidCategory($catid))\r
2887             return _ERROR_NOSUCHCATEGORY;\r
2888 \r
2889         // don't allow default category to be moved\r
2890         if ($blog->getDefaultCategory() == $catid)\r
2891             return _ERROR_MOVEDEFCATEGORY;\r
2892 \r
2893         $manager->notify(\r
2894             'PreMoveCategory',\r
2895             array(\r
2896                 'catid' => &$catid,\r
2897                 'sourceblog' => &$blog,\r
2898                 'destblog' => &$destblog\r
2899             )\r
2900         );\r
2901 \r
2902         // update comments table (cblog)\r
2903         $query = 'SELECT inumber FROM '.sql_table('item').' WHERE icat='.$catid;\r
2904         $items = sql_query($query);\r
2905         while ($oItem = sql_fetch_object($items)) {\r
2906             sql_query('UPDATE '.sql_table('comment').' SET cblog='.$destblogid.' WHERE citem='.$oItem->inumber);\r
2907         }\r
2908 \r
2909         // update items (iblog)\r
2910         $query = 'UPDATE '.sql_table('item').' SET iblog='.$destblogid.' WHERE icat='.$catid;\r
2911         sql_query($query);\r
2912 \r
2913         // move category\r
2914         $query = 'UPDATE '.sql_table('category').' SET cblog='.$destblogid.' WHERE catid='.$catid;\r
2915         sql_query($query);\r
2916 \r
2917         $manager->notify(\r
2918             'PostMoveCategory',\r
2919             array(\r
2920                 'catid' => &$catid,\r
2921                 'sourceblog' => &$blog,\r
2922                 'destblog' => $destblog\r
2923             )\r
2924         );\r
2925 \r
2926     }\r
2927 \r
2928     /**\r
2929      * @todo document this\r
2930      */\r
2931     function action_blogsettingsupdate() {\r
2932         global $member, $manager;\r
2933 \r
2934         $blogid = intRequestVar('blogid');\r
2935 \r
2936         $member->blogAdminRights($blogid) or $this->disallow();\r
2937 \r
2938         $blog =& $manager->getBlog($blogid);\r
2939 \r
2940         $notify         = trim(postVar('notify'));\r
2941         $shortname      = trim(postVar('shortname'));\r
2942         $updatefile     = trim(postVar('update'));\r
2943 \r
2944         $notifyComment  = intPostVar('notifyComment');\r
2945         $notifyVote     = intPostVar('notifyVote');\r
2946         $notifyNewItem  = intPostVar('notifyNewItem');\r
2947 \r
2948         if ($notifyComment == 0)    $notifyComment = 1;\r
2949         if ($notifyVote == 0)       $notifyVote = 1;\r
2950         if ($notifyNewItem == 0)    $notifyNewItem = 1;\r
2951 \r
2952         $notifyType = $notifyComment * $notifyVote * $notifyNewItem;\r
2953 \r
2954 \r
2955         if ($notify) {\r
2956             $not =& new NOTIFICATION($notify);\r
2957             if (!$not->validAddresses())\r
2958                 $this->error(_ERROR_BADNOTIFY);\r
2959 \r
2960         }\r
2961 \r
2962         if (!isValidShortName($shortname))\r
2963             $this->error(_ERROR_BADSHORTBLOGNAME);\r
2964 \r
2965         if (($blog->getShortName() != $shortname) && $manager->existsBlog($shortname))\r
2966             $this->error(_ERROR_DUPSHORTBLOGNAME);\r
2967 \r
2968         // check if update file is writable\r
2969         if ($updatefile && !is_writeable($updatefile))\r
2970             $this->error(_ERROR_UPDATEFILE);\r
2971 \r
2972         $blog->setName(trim(postVar('name')));\r
2973         $blog->setShortName($shortname);\r
2974         $blog->setNotifyAddress($notify);\r
2975         $blog->setNotifyType($notifyType);\r
2976         $blog->setMaxComments(postVar('maxcomments'));\r
2977         $blog->setCommentsEnabled(postVar('comments'));\r
2978         $blog->setTimeOffset(postVar('timeoffset'));\r
2979         $blog->setUpdateFile($updatefile);\r
2980         $blog->setURL(trim(postVar('url')));\r
2981         $blog->setDefaultSkin(intPostVar('defskin'));\r
2982         $blog->setDescription(trim(postVar('desc')));\r
2983         $blog->setPublic(postVar('public'));\r
2984         $blog->setConvertBreaks(intPostVar('convertbreaks'));\r
2985         $blog->setAllowPastPosting(intPostVar('allowpastposting'));\r
2986         $blog->setDefaultCategory(intPostVar('defcat'));\r
2987         $blog->setSearchable(intPostVar('searchable'));\r
2988         $blog->setEmailRequired(intPostVar('reqemail'));\r
2989 \r
2990         $blog->writeSettings();\r
2991 \r
2992         // store plugin options\r
2993         $aOptions = requestArray('plugoption');\r
2994         NucleusPlugin::_applyPluginOptions($aOptions);\r
2995         $manager->notify('PostPluginOptionsUpdate',array('context' => 'blog', 'blogid' => $blogid, 'blog' => &$blog));\r
2996 \r
2997 \r
2998         $this->action_overview(_MSG_SETTINGSCHANGED);\r
2999     }\r
3000 \r
3001     /**\r
3002      * @todo document this\r
3003      */\r
3004     function action_deleteblog() {\r
3005         global $member, $CONF, $manager;\r
3006 \r
3007         $blogid = intRequestVar('blogid');\r
3008 \r
3009         $member->blogAdminRights($blogid) or $this->disallow();\r
3010 \r
3011         // check if blog is default blog\r
3012         if ($CONF['DefaultBlog'] == $blogid)\r
3013             $this->error(_ERROR_DELDEFBLOG);\r
3014 \r
3015         $blog =& $manager->getBlog($blogid);\r
3016 \r
3017         $this->pagehead();\r
3018         ?>\r
3019             <h2><?php echo _DELETE_CONFIRM?></h2>\r
3020 \r
3021             <p><?php echo _WARNINGTXT_BLOGDEL?>\r
3022             </p>\r
3023 \r
3024             <div>\r
3025             <?php echo _CONFIRMTXT_BLOG?><b><?php echo  htmlspecialchars($blog->getName())?></b>\r
3026             </div>\r
3027 \r
3028             <form method="post" action="index.php"><div>\r
3029             <input type="hidden" name="action" value="deleteblogconfirm" />\r
3030             <?php $manager->addTicketHidden() ?>\r
3031             <input type="hidden" name="blogid" value="<?php echo  $blogid; ?>" />\r
3032             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
3033             </div></form>\r
3034         <?php\r
3035         $this->pagefoot();\r
3036     }\r
3037 \r
3038     /**\r
3039      * @todo document this\r
3040      */\r
3041     function action_deleteblogconfirm() {\r
3042         global $member, $CONF, $manager;\r
3043 \r
3044         $blogid = intRequestVar('blogid');\r
3045 \r
3046         $manager->notify('PreDeleteBlog', array('blogid' => $blogid));\r
3047 \r
3048         $member->blogAdminRights($blogid) or $this->disallow();\r
3049 \r
3050         // check if blog is default blog\r
3051         if ($CONF['DefaultBlog'] == $blogid)\r
3052             $this->error(_ERROR_DELDEFBLOG);\r
3053 \r
3054         // delete all comments\r
3055         $query = 'DELETE FROM '.sql_table('comment').' WHERE cblog='.$blogid;\r
3056         sql_query($query);\r
3057 \r
3058         // delete all items\r
3059         $query = 'DELETE FROM '.sql_table('item').' WHERE iblog='.$blogid;\r
3060         sql_query($query);\r
3061 \r
3062         // delete all team members\r
3063         $query = 'DELETE FROM '.sql_table('team').' WHERE tblog='.$blogid;\r
3064         sql_query($query);\r
3065 \r
3066         // delete all bans\r
3067         $query = 'DELETE FROM '.sql_table('ban').' WHERE blogid='.$blogid;\r
3068         sql_query($query);\r
3069 \r
3070         // delete all categories\r
3071         $query = 'DELETE FROM '.sql_table('category').' WHERE cblog='.$blogid;\r
3072         sql_query($query);\r
3073 \r
3074         // delete all associated plugin options\r
3075         NucleusPlugin::_deleteOptionValues('blog', $blogid);\r
3076 \r
3077         // delete the blog itself\r
3078         $query = 'DELETE FROM '.sql_table('blog').' WHERE bnumber='.$blogid;\r
3079         sql_query($query);\r
3080 \r
3081         $manager->notify('PostDeleteBlog', array('blogid' => $blogid));\r
3082 \r
3083         $this->action_overview(_DELETED_BLOG);\r
3084     }\r
3085 \r
3086     /**\r
3087      * @todo document this\r
3088      */\r
3089     function action_memberdelete() {\r
3090         global $member, $manager;\r
3091 \r
3092         $memberid = intRequestVar('memberid');\r
3093 \r
3094         ($member->getID() == $memberid) or $member->isAdmin() or $this->disallow();\r
3095 \r
3096         $mem = MEMBER::createFromID($memberid);\r
3097 \r
3098         $this->pagehead();\r
3099         ?>\r
3100             <h2><?php echo _DELETE_CONFIRM?></h2>\r
3101 \r
3102             <p><?php echo _CONFIRMTXT_MEMBER?><b><?php echo htmlspecialchars($mem->getDisplayName()) ?></b>\r
3103             </p>\r
3104 \r
3105             <p>\r
3106             <?php echo _WARNINGTXT_NOTDELMEDIAFILES ?>\r
3107             </p>\r
3108 \r
3109             <form method="post" action="index.php"><div>\r
3110             <input type="hidden" name="action" value="memberdeleteconfirm" />\r
3111             <?php $manager->addTicketHidden() ?>\r
3112             <input type="hidden" name="memberid" value="<?php echo  $memberid; ?>" />\r
3113             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
3114             </div></form>\r
3115         <?php\r
3116         $this->pagefoot();\r
3117     }\r
3118 \r
3119     /**\r
3120      * @todo document this\r
3121      */\r
3122     function action_memberdeleteconfirm() {\r
3123         global $member;\r
3124 \r
3125         $memberid = intRequestVar('memberid');\r
3126 \r
3127         ($member->getID() == $memberid) or $member->isAdmin() or $this->disallow();\r
3128 \r
3129         $error = $this->deleteOneMember($memberid);\r
3130         if ($error)\r
3131             $this->error($error);\r
3132 \r
3133         if ($member->isAdmin())\r
3134             $this->action_usermanagement();\r
3135         else\r
3136             $this->action_overview(_DELETED_MEMBER);\r
3137     }\r
3138 \r
3139     /**\r
3140      * @static\r
3141      * @todo document this\r
3142      */\r
3143     function deleteOneMember($memberid) {\r
3144         global $manager;\r
3145 \r
3146         $memberid = intval($memberid);\r
3147         $mem = MEMBER::createFromID($memberid);\r
3148 \r
3149         if (!$mem->canBeDeleted())\r
3150             return _ERROR_DELETEMEMBER;\r
3151 \r
3152         $manager->notify('PreDeleteMember', array('member' => &$mem));\r
3153 \r
3154         /* unlink comments from memberid */\r
3155         if ($memberid) {\r
3156             $query = 'UPDATE ' . sql_table('comment') . ' SET cmember="0", cuser="'. addslashes($mem->getDisplayName())\r
3157                    .'" WHERE cmember='.$memberid;\r
3158             sql_query($query);\r
3159         }\r
3160 \r
3161         $query = 'DELETE FROM '.sql_table('member').' WHERE mnumber='.$memberid;\r
3162         sql_query($query);\r
3163 \r
3164         $query = 'DELETE FROM '.sql_table('team').' WHERE tmember='.$memberid;\r
3165         sql_query($query);\r
3166 \r
3167         $query = 'DELETE FROM '.sql_table('activation').' WHERE vmember='.$memberid;\r
3168         sql_query($query);\r
3169 \r
3170         // delete all associated plugin options\r
3171         NucleusPlugin::_deleteOptionValues('member', $memberid);\r
3172 \r
3173         $manager->notify('PostDeleteMember', array('member' => &$mem));\r
3174 \r
3175         return '';\r
3176     }\r
3177 \r
3178     /**\r
3179      * @todo document this\r
3180      */\r
3181     function action_createnewlog() {\r
3182         global $member, $CONF, $manager;\r
3183 \r
3184         // Only Super-Admins can do this\r
3185         $member->isAdmin() or $this->disallow();\r
3186 \r
3187         $this->pagehead();\r
3188 \r
3189         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
3190         ?>\r
3191         <h2><?php echo _EBLOG_CREATE_TITLE?></h2>\r
3192 \r
3193         <h3><?php echo _ADMIN_NOTABILIA ?></h3>\r
3194 \r
3195         <p><?php echo _ADMIN_PLEASE_READ ?></p>\r
3196 \r
3197         <p><?php echo _ADMIN_HOW_TO_ACCESS ?></p>\r
3198 \r
3199         <ol>\r
3200             <li><?php echo _ADMIN_SIMPLE_WAY ?></li>\r
3201             <li><?php echo _ADMIN_ADVANCED_WAY ?></li>\r
3202         </ol>\r
3203 \r
3204         <h3><?php echo _ADMIN_HOW_TO_CREATE ?></h3>\r
3205 \r
3206         <p>\r
3207         <?php echo _EBLOG_CREATE_TEXT?>\r
3208         </p>\r
3209 \r
3210         <form method="post" action="index.php"><div>\r
3211 \r
3212         <input type="hidden" name="action" value="addnewlog" />\r
3213         <?php $manager->addTicketHidden() ?>\r
3214 \r
3215 \r
3216         <table><tr>\r
3217             <td><?php echo _EBLOG_NAME?></td>\r
3218             <td><input name="name" tabindex="10" size="40" maxlength="60" /></td>\r
3219         </tr><tr>\r
3220             <td><?php echo _EBLOG_SHORTNAME?>\r
3221                 <?php help('shortblogname'); ?>\r
3222             </td>\r
3223             <td><input name="shortname" tabindex="20" maxlength="15" size="15" /></td>\r
3224         </tr><tr>\r
3225             <td><?php echo _EBLOG_DESC?></td>\r
3226             <td><input name="desc" tabindex="30" maxlength="200" size="40" /></td>\r
3227         </tr><tr>\r
3228             <td><?php echo _EBLOG_DEFSKIN?>\r
3229                 <?php help('blogdefaultskin'); ?>\r
3230             </td>\r
3231             <td>\r
3232                 <?php\r
3233                     $query =  'SELECT sdname as text, sdnumber as value'\r
3234                            . ' FROM '.sql_table('skin_desc');\r
3235                     $template['name'] = 'defskin';\r
3236                     $template['tabindex'] = 50;\r
3237                     $template['selected'] = $CONF['BaseSkin'];  // set default selected skin to be globally defined base skin\r
3238                     showlist($query,'select',$template);\r
3239                 ?>\r
3240             </td>\r
3241         </tr><tr>\r
3242             <td><?php echo _EBLOG_OFFSET?>\r
3243                 <?php help('blogtimeoffset'); ?>\r
3244                 <br /><?php echo _EBLOG_STIME?> <b><?php echo  strftime("%H:%M",time()); ?></b>\r
3245             </td>\r
3246             <td><input name="timeoffset" tabindex="110" size="3" value="0" /></td>\r
3247         </tr><tr>\r
3248             <td><?php echo _EBLOG_ADMIN?>\r
3249                 <?php help('teamadmin'); ?>\r
3250             </td>\r
3251             <td><?php echo _EBLOG_ADMIN_MSG?></td>\r
3252         </tr><tr>\r
3253             <td><?php echo _EBLOG_CREATE?></td>\r
3254             <td><input type="submit" tabindex="120" value="<?php echo _EBLOG_CREATE_BTN?>" onclick="return checkSubmit();" /></td>\r
3255         </tr></table>\r
3256 \r
3257         </div></form>\r
3258         <?php\r
3259         $this->pagefoot();\r
3260     }\r
3261 \r
3262     /**\r
3263      * @todo document this\r
3264      */\r
3265     function action_addnewlog() {\r
3266         global $member, $manager, $CONF;\r
3267 \r
3268         // Only Super-Admins can do this\r
3269         $member->isAdmin() or $this->disallow();\r
3270 \r
3271         $bname          = trim(postVar('name'));\r
3272         $bshortname     = trim(postVar('shortname'));\r
3273         $btimeoffset    = postVar('timeoffset');\r
3274         $bdesc          = trim(postVar('desc'));\r
3275         $bdefskin       = postVar('defskin');\r
3276 \r
3277         if (!isValidShortName($bshortname))\r
3278             $this->error(_ERROR_BADSHORTBLOGNAME);\r
3279 \r
3280         if ($manager->existsBlog($bshortname))\r
3281             $this->error(_ERROR_DUPSHORTBLOGNAME);\r
3282 \r
3283         $manager->notify(\r
3284             'PreAddBlog',\r
3285             array(\r
3286                 'name'        => &$bname,\r
3287                 'shortname'   => &$bshortname,\r
3288                 'timeoffset'  => &$btimeoffset,\r
3289                 'description' => &$bdesc,\r
3290                 'defaultskin' => &$bdefskin\r
3291             )\r
3292         );\r
3293 \r
3294 \r
3295         // add slashes for sql queries\r
3296         $bname       = addslashes($bname);\r
3297         $bshortname  = addslashes($bshortname);\r
3298         $btimeoffset = addslashes($btimeoffset);\r
3299         $bdesc       = addslashes($bdesc);\r
3300         $bdefskin    = addslashes($bdefskin);\r
3301 \r
3302         // create blog\r
3303         $query = 'INSERT INTO '.sql_table('blog')." (bname, bshortname, bdesc, btimeoffset, bdefskin) VALUES ('$bname', '$bshortname', '$bdesc', '$btimeoffset', '$bdefskin')";\r
3304         sql_query($query);\r
3305         $blogid = sql_insert_id();\r
3306         $blog   =& $manager->getBlog($blogid);\r
3307 \r
3308         // create new category\r
3309 \r
3310 \r
3311         $sql = 'INSERT INTO %s (cblog, cname, cdesc) VALUES (%d, "%s", "%s")';\r
3312         sql_query(sprintf($sql, sql_table('category'), $blogid, _EBLOGDEFAULTCATEGORY_NAME, _EBLOGDEFAULTCATEGORY_DESC));\r
3313 \r
3314 //              sql_query('INSERT INTO '.sql_table('category')." (cblog, cname, cdesc) VALUES ($blogid, _EBLOGDEFAULTCATEGORY_NAME, _EBLOGDEFAULTCATEGORY_DESC)");\r
3315         $catid = sql_insert_id();\r
3316 \r
3317         // set as default category\r
3318         $blog->setDefaultCategory($catid);\r
3319         $blog->writeSettings();\r
3320 \r
3321         // create team member\r
3322         $memberid = $member->getID();\r
3323         $query = 'INSERT INTO '.sql_table('team')." (tmember, tblog, tadmin) VALUES ($memberid, $blogid, 1)";\r
3324         sql_query($query);\r
3325 \r
3326 \r
3327 \r
3328 \r
3329 \r
3330 \r
3331         $blog->additem($blog->getDefaultCategory(),_EBLOG_FIRSTITEM_TITLE,_EBLOG_FIRSTITEM_BODY,'',$blogid, $memberid,$blog->getCorrectTime(),0,0,0);\r
3332 \r
3333 \r
3334         $manager->notify(\r
3335             'PostAddBlog',\r
3336             array(\r
3337                 'blog' => &$blog\r
3338             )\r
3339         );\r
3340 \r
3341         $manager->notify(\r
3342             'PostAddCategory',\r
3343             array(\r
3344                 'blog'        => &$blog,\r
3345                 'name'        => _EBLOGDEFAULTCATEGORY_NAME,\r
3346                 'description' => _EBLOGDEFAULTCATEGORY_DESC,\r
3347                 'catid'       => $catid\r
3348             )\r
3349         );\r
3350 \r
3351         $this->pagehead();\r
3352         ?>\r
3353         <h2><?php echo _BLOGCREATED_TITLE ?></h2>\r
3354 \r
3355         <p><?php echo sprintf(_BLOGCREATED_ADDEDTXT, htmlspecialchars($bname)) ?></p>\r
3356 \r
3357         <ol>\r
3358             <li><a href="#index_php"><?php echo sprintf(_BLOGCREATED_SIMPLEWAY, htmlspecialchars($bshortname)) ?></a></li>\r
3359             <li><a href="#skins"><?php echo _BLOGCREATED_ADVANCEDWAY ?></a></li>\r
3360         </ol>\r
3361 \r
3362         <h3><a id="index_php"><?php echo sprintf(_BLOGCREATED_SIMPLEDESC1, htmlspecialchars($bshortname)) ?></a></h3>\r
3363 \r
3364         <p><?php echo sprintf(_BLOGCREATED_SIMPLEDESC2, htmlspecialchars($bshortname)) ?></p>\r
3365 <pre><code>&lt;?php\r
3366 \r
3367 $CONF['Self'] = '<b><?php echo htmlspecialchars($bshortname)?>.php</b>';\r
3368 \r
3369 include('<i>./config.php</i>');\r
3370 \r
3371 selectBlog('<b><?php echo htmlspecialchars($bshortname)?></b>');\r
3372 selector();\r
3373 \r
3374 ?&gt;</code></pre>\r
3375 \r
3376         <p><?php echo _BLOGCREATED_SIMPLEDESC3 ?></p>\r
3377 \r
3378         <p><?php echo _BLOGCREATED_SIMPLEDESC4 ?></p>\r
3379 \r
3380         <form action="index.php" method="post"><div>\r
3381             <input type="hidden" name="action" value="addnewlog2" />\r
3382             <?php $manager->addTicketHidden() ?>\r
3383             <input type="hidden" name="blogid" value="<?php echo intval($blogid)?>" />\r
3384             <table><tr>\r
3385                 <td><?php echo _EBLOG_URL?></td>\r
3386                 <td><input name="url" maxlength="100" size="40" value="<?php echo htmlspecialchars($CONF['IndexURL'].$bshortname.'.php')?>" /></td>\r
3387             </tr><tr>\r
3388                 <td><?php echo _EBLOG_CREATE?></td>\r
3389                 <td><input type="submit" value="<?php echo _EBLOG_CREATE_BTN?>" onclick="return checkSubmit();" /></td>\r
3390             </tr></table>\r
3391         </div></form>\r
3392 \r
3393         <h3><a id="skins"><?php echo _BLOGCREATED_ADVANCEDWAY2 ?></a></h3>\r
3394 \r
3395         <p><?php echo _BLOGCREATED_ADVANCEDWAY3 ?></p>\r
3396 \r
3397         <form action="index.php" method="post"><div>\r
3398             <input type="hidden" name="action" value="addnewlog2" />\r
3399             <?php $manager->addTicketHidden() ?>\r
3400             <input type="hidden" name="blogid" value="<?php echo intval($blogid)?>" />\r
3401             <table><tr>\r
3402                 <td><?php echo _EBLOG_URL?></td>\r
3403                 <td><input name="url" maxlength="100" size="40" /></td>\r
3404             </tr><tr>\r
3405                 <td><?php echo _EBLOG_CREATE?></td>\r
3406                 <td><input type="submit" value="<?php echo _EBLOG_CREATE_BTN?>" onclick="return checkSubmit();" /></td>\r
3407             </tr></table>\r
3408         </div></form>\r
3409 \r
3410         <?php       $this->pagefoot();\r
3411 \r
3412     }\r
3413 \r
3414     /**\r
3415      * @todo document this\r
3416      */\r
3417     function action_addnewlog2() {\r
3418         global $member, $manager;\r
3419 \r
3420         $member->blogAdminRights($blogid) or $this->disallow();\r
3421 \r
3422         $burl   = requestVar('url');\r
3423         $blogid = intRequestVar('blogid');\r
3424 \r
3425         $blog =& $manager->getBlog($blogid);\r
3426         $blog->setURL(trim($burl));\r
3427         $blog->writeSettings();\r
3428 \r
3429         $this->action_overview(_MSG_NEWBLOG);\r
3430     }\r
3431 \r
3432     /**\r
3433      * @todo document this\r
3434      */\r
3435     function action_skinieoverview() {\r
3436         global $member, $DIR_LIBS, $manager;\r
3437 \r
3438         $member->isAdmin() or $this->disallow();\r
3439 \r
3440         // load skinie class\r
3441         include_once($DIR_LIBS . 'skinie.php');\r
3442 \r
3443         $this->pagehead();\r
3444 \r
3445         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
3446 \r
3447     ?>\r
3448         <h2><?php echo _SKINIE_TITLE_IMPORT?></h2>\r
3449 \r
3450                 <p><label for="skinie_import_local"><?php echo _SKINIE_LOCAL?></label>\r
3451                 <?php                   global $DIR_SKINS;\r
3452 \r
3453                     $candidates = SKINIMPORT::searchForCandidates($DIR_SKINS);\r
3454 \r
3455                     if (sizeof($candidates) > 0) {\r
3456                         ?>\r
3457                             <form method="post" action="index.php"><div>\r
3458                                 <input type="hidden" name="action" value="skinieimport" />\r
3459                                 <?php $manager->addTicketHidden() ?>\r
3460                                 <input type="hidden" name="mode" value="file" />\r
3461                                 <select name="skinfile" id="skinie_import_local">\r
3462                                 <?php                                   foreach ($candidates as $skinname => $skinfile) {\r
3463                                         $html = htmlspecialchars($skinfile);\r
3464                                         echo '<option value="',$html,'">',$skinname,'</option>';\r
3465                                     }\r
3466                                 ?>\r
3467                                 </select>\r
3468                                 <input type="submit" value="<?php echo _SKINIE_BTN_IMPORT?>" />\r
3469                             </div></form>\r
3470                         <?php                   } else {\r
3471                         echo _SKINIE_NOCANDIDATES;\r
3472                     }\r
3473                 ?>\r
3474                 </p>\r
3475 \r
3476                 <p><em><?php echo _OR?></em></p>\r
3477 \r
3478                 <form method="post" action="index.php"><p>\r
3479                     <?php $manager->addTicketHidden() ?>\r
3480                     <input type="hidden" name="action" value="skinieimport" />\r
3481                     <input type="hidden" name="mode" value="url" />\r
3482                     <label for="skinie_import_url"><?php echo _SKINIE_FROMURL?></label>\r
3483                     <input type="text" name="skinfile" id="skinie_import_url" size="60" value="http://" />\r
3484                     <input type="submit" value="<?php echo _SKINIE_BTN_IMPORT?>" />\r
3485                 </p></form>\r
3486 \r
3487 \r
3488         <h2><?php echo _SKINIE_TITLE_EXPORT?></h2>\r
3489         <form method="post" action="index.php"><div>\r
3490             <input type="hidden" name="action" value="skinieexport" />\r
3491             <?php $manager->addTicketHidden() ?>\r
3492 \r
3493             <p><?php echo _SKINIE_EXPORT_INTRO?></p>\r
3494 \r
3495             <table><tr>\r
3496                 <th colspan="2"><?php echo _SKINIE_EXPORT_SKINS?></th>\r
3497             </tr><tr>\r
3498     <?php       // show list of skins\r
3499         $res = sql_query('SELECT * FROM '.sql_table('skin_desc'));\r
3500         while ($skinObj = sql_fetch_object($res)) {\r
3501             $id = 'skinexp' . $skinObj->sdnumber;\r
3502             echo '<td><input type="checkbox" name="skin[',$skinObj->sdnumber,']"  id="',$id,'" />';\r
3503             echo '<label for="',$id,'">',htmlspecialchars($skinObj->sdname),'</label></td>';\r
3504             echo '<td>',htmlspecialchars($skinObj->sddesc),'</td>';\r
3505             echo '</tr><tr>';\r
3506         }\r
3507 \r
3508         echo '<th colspan="2">',_SKINIE_EXPORT_TEMPLATES,'</th></tr><tr>';\r
3509 \r
3510         // show list of templates\r
3511         $res = sql_query('SELECT * FROM '.sql_table('template_desc'));\r
3512         while ($templateObj = sql_fetch_object($res)) {\r
3513             $id = 'templateexp' . $templateObj->tdnumber;\r
3514             echo '<td><input type="checkbox" name="template[',$templateObj->tdnumber,']" id="',$id,'" />';\r
3515             echo '<label for="',$id,'">',htmlspecialchars($templateObj->tdname),'</label></td>';\r
3516             echo '<td>',htmlspecialchars($templateObj->tddesc),'</td>';\r
3517             echo '</tr><tr>';\r
3518         }\r
3519 \r
3520     ?>\r
3521                 <th colspan="2"><?php echo _SKINIE_EXPORT_EXTRA?></th>\r
3522             </tr><tr>\r
3523                 <td colspan="2"><textarea cols="40" rows="5" name="info"></textarea></td>\r
3524             </tr><tr>\r
3525                 <th colspan="2"><?php echo _SKINIE_TITLE_EXPORT?></th>\r
3526             </tr><tr>\r
3527                 <td colspan="2"><input type="submit" value="<?php echo _SKINIE_BTN_EXPORT?>" /></td>\r
3528             </tr></table>\r
3529         </div></form>\r
3530 \r
3531     <?php\r
3532         $this->pagefoot();\r
3533 \r
3534     }\r
3535 \r
3536     /**\r
3537      * @todo document this\r
3538      */\r
3539     function action_skinieimport() {\r
3540         global $member, $DIR_LIBS, $DIR_SKINS, $manager;\r
3541 \r
3542         $member->isAdmin() or $this->disallow();\r
3543 \r
3544         // load skinie class\r
3545         include_once($DIR_LIBS . 'skinie.php');\r
3546 \r
3547         $skinFileRaw= postVar('skinfile');\r
3548         $mode       = postVar('mode');\r
3549 \r
3550         $importer =& new SKINIMPORT();\r
3551 \r
3552         // get full filename\r
3553         if ($mode == 'file')\r
3554         {\r
3555             $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';\r
3556 \r
3557             // backwards compatibilty (in v2.0, exports were saved as skindata.xml)\r
3558             if (!file_exists($skinFile))\r
3559                 $skinFile = $DIR_SKINS . $skinFileRaw . '/skindata.xml';\r
3560         } else {\r
3561             $skinFile = $skinFileRaw;\r
3562         }\r
3563 \r
3564         // read only metadata\r
3565         $error = $importer->readFile($skinFile, 1);\r
3566 \r
3567         // clashes\r
3568         $skinNameClashes = $importer->checkSkinNameClashes();\r
3569         $templateNameClashes = $importer->checkTemplateNameClashes();\r
3570         $hasNameClashes = (count($skinNameClashes) > 0) || (count($templateNameClashes) > 0);\r
3571 \r
3572         if ($error) $this->error($error);\r
3573 \r
3574         $this->pagehead();\r
3575 \r
3576         echo '<p><a href="index.php?action=skinieoverview">(',_BACK,')</a></p>';\r
3577         ?>\r
3578         <h2><?php echo _SKINIE_CONFIRM_TITLE?></h2>\r
3579 \r
3580         <ul>\r
3581             <li><p><strong><?php echo _SKINIE_INFO_GENERAL?></strong> <?php echo htmlspecialchars($importer->getInfo())?></p></li>\r
3582             <li><p><strong><?php echo _SKINIE_INFO_SKINS?></strong> <?php echo implode(' <em>'._AND.'</em> ',$importer->getSkinNames())?></p></li>\r
3583             <li><p><strong><?php echo _SKINIE_INFO_TEMPLATES?></strong> <?php echo implode(' <em>'._AND.'</em> ',$importer->getTemplateNames())?></p></li>\r
3584             <?php\r
3585                 if ($hasNameClashes)\r
3586                 {\r
3587             ?>\r
3588             <li><p><strong style="color: red;"><?php echo _SKINIE_INFO_SKINCLASH?></strong> <?php echo implode(' <em>'._AND.'</em> ',$skinNameClashes)?></p></li>\r
3589             <li><p><strong style="color: red;"><?php echo _SKINIE_INFO_TEMPLCLASH?></strong> <?php echo implode(' <em>'._AND.'</em> ',$templateNameClashes)?></p></li>\r
3590             <?php\r
3591                 } // if (hasNameClashes)\r
3592             ?>\r
3593         </ul>\r
3594 \r
3595         <form method="post" action="index.php"><div>\r
3596             <input type="hidden" name="action" value="skiniedoimport" />\r
3597             <?php $manager->addTicketHidden() ?>\r
3598             <input type="hidden" name="skinfile" value="<?php echo htmlspecialchars(postVar('skinfile'))?>" />\r
3599             <input type="hidden" name="mode" value="<?php echo htmlspecialchars($mode)?>" />\r
3600             <input type="submit" value="<?php echo _SKINIE_CONFIRM_IMPORT?>" />\r
3601             <?php\r
3602                 if ($hasNameClashes)\r
3603                 {\r
3604             ?>\r
3605             <br />\r
3606             <input type="checkbox" name="overwrite" value="1" id="cb_overwrite" /><label for="cb_overwrite"><?php echo _SKINIE_CONFIRM_OVERWRITE?></label>\r
3607             <?php\r
3608                 } // if (hasNameClashes)\r
3609             ?>\r
3610         </div></form>\r
3611 \r
3612 \r
3613         <?php\r
3614         $this->pagefoot();\r
3615     }\r
3616 \r
3617     /**\r
3618      * @todo document this\r
3619      */\r
3620     function action_skiniedoimport() {\r
3621         global $member, $DIR_LIBS, $DIR_SKINS;\r
3622 \r
3623         $member->isAdmin() or $this->disallow();\r
3624 \r
3625         // load skinie class\r
3626         include_once($DIR_LIBS . 'skinie.php');\r
3627 \r
3628         $skinFileRaw= postVar('skinfile');\r
3629         $mode       = postVar('mode');\r
3630 \r
3631         $allowOverwrite = intPostVar('overwrite');\r
3632 \r
3633         // get full filename\r
3634         if ($mode == 'file')\r
3635         {\r
3636             $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';\r
3637 \r
3638             // backwards compatibilty (in v2.0, exports were saved as skindata.xml)\r
3639             if (!file_exists($skinFile))\r
3640                 $skinFile = $DIR_SKINS . $skinFileRaw . '/skindata.xml';\r
3641 \r
3642         } else {\r
3643             $skinFile = $skinFileRaw;\r
3644         }\r
3645 \r
3646         $importer =& new SKINIMPORT();\r
3647 \r
3648         $error = $importer->readFile($skinFile);\r
3649 \r
3650         if ($error)\r
3651             $this->error($error);\r
3652 \r
3653         $error = $importer->writeToDatabase($allowOverwrite);\r
3654 \r
3655         if ($error)\r
3656             $this->error($error);\r
3657 \r
3658         $this->pagehead();\r
3659 \r
3660         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
3661     ?>\r
3662         <h2><?php echo _SKINIE_DONE?></h2>\r
3663 \r
3664         <ul>\r
3665             <li><p><strong><?php echo _SKINIE_INFO_GENERAL?></strong> <?php echo htmlspecialchars($importer->getInfo())?></p></li>\r
3666             <li><p><strong><?php echo _SKINIE_INFO_IMPORTEDSKINS?></strong> <?php echo implode(' <em>'._AND.'</em> ',$importer->getSkinNames())?></p></li>\r
3667             <li><p><strong><?php echo _SKINIE_INFO_IMPORTEDTEMPLS?></strong> <?php echo implode(' <em>'._AND.'</em> ',$importer->getTemplateNames())?></p></li>\r
3668         </ul>\r
3669 \r
3670     <?php       $this->pagefoot();\r
3671 \r
3672     }\r
3673 \r
3674     /**\r
3675      * @todo document this\r
3676      */\r
3677     function action_skinieexport() {\r
3678         global $member, $DIR_LIBS;\r
3679 \r
3680         $member->isAdmin() or $this->disallow();\r
3681 \r
3682         // load skinie class\r
3683         include_once($DIR_LIBS . 'skinie.php');\r
3684 \r
3685         $aSkins = requestIntArray('skin');\r
3686         $aTemplates = requestIntArray('template');\r
3687 \r
3688         if (!is_array($aTemplates)) $aTemplates = array();\r
3689         if (!is_array($aSkins)) $aSkins = array();\r
3690 \r
3691         $skinList = array_keys($aSkins);\r
3692         $templateList = array_keys($aTemplates);\r
3693 \r
3694         $info = postVar('info');\r
3695 \r
3696         $exporter =& new SKINEXPORT();\r
3697         foreach ($skinList as $skinId) {\r
3698             $exporter->addSkin($skinId);\r
3699         }\r
3700         foreach ($templateList as $templateId) {\r
3701             $exporter->addTemplate($templateId);\r
3702         }\r
3703         $exporter->setInfo($info);\r
3704 \r
3705         $exporter->export();\r
3706     }\r
3707 \r
3708     /**\r
3709      * @todo document this\r
3710      */\r
3711     function action_templateoverview() {\r
3712         global $member, $manager;\r
3713 \r
3714         $member->isAdmin() or $this->disallow();\r
3715 \r
3716         $this->pagehead();\r
3717 \r
3718         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
3719 \r
3720         echo '<h2>' . _TEMPLATE_TITLE . '</h2>';\r
3721         echo '<h3>' . _TEMPLATE_AVAILABLE_TITLE . '</h3>';\r
3722 \r
3723         $query = 'SELECT * FROM '.sql_table('template_desc').' ORDER BY tdname';\r
3724         $template['content'] = 'templatelist';\r
3725         $template['tabindex'] = 10;\r
3726         showlist($query,'table',$template);\r
3727 \r
3728         echo '<h3>' . _TEMPLATE_NEW_TITLE . '</h3>';\r
3729 \r
3730         ?>\r
3731         <form method="post" action="index.php"><div>\r
3732 \r
3733         <input name="action" value="templatenew" type="hidden" />\r
3734         <?php $manager->addTicketHidden() ?>\r
3735         <table><tr>\r
3736             <td><?php echo _TEMPLATE_NAME?> <?php help('shortnames');?></td>\r
3737             <td><input name="name" tabindex="10010" maxlength="20" size="20" /></td>\r
3738         </tr><tr>\r
3739             <td><?php echo _TEMPLATE_DESC?></td>\r
3740             <td><input name="desc" tabindex="10020" maxlength="200" size="50" /></td>\r
3741         </tr><tr>\r
3742             <td><?php echo _TEMPLATE_CREATE?></td>\r
3743             <td><input type="submit" tabindex="10030" value="<?php echo _TEMPLATE_CREATE_BTN?>" onclick="return checkSubmit();" /></td>\r
3744         </tr></table>\r
3745 \r
3746         </div></form>\r
3747 \r
3748         <?php\r
3749         $this->pagefoot();\r
3750     }\r
3751 \r
3752     /**\r
3753      * @todo document this\r
3754      */\r
3755     function action_templateedit($msg = '') {\r
3756         global $member, $manager;\r
3757 \r
3758         $templateid = intRequestVar('templateid');\r
3759 \r
3760         $member->isAdmin() or $this->disallow();\r
3761 \r
3762         $extrahead = '<script type="text/javascript" src="javascript/templateEdit.js"></script>';\r
3763         $extrahead .= '<script type="text/javascript">setTemplateEditText("'.addslashes(_EDITTEMPLATE_EMPTY).'");</script>';\r
3764 \r
3765         $this->pagehead($extrahead);\r
3766 \r
3767         $templatename = TEMPLATE::getNameFromId($templateid);\r
3768         $templatedescription = TEMPLATE::getDesc($templateid);\r
3769         $template =& $manager->getTemplate($templatename);\r
3770 \r
3771         ?>\r
3772         <p>\r
3773         <a href="index.php?action=templateoverview">(<?php echo _TEMPLATE_BACK?>)</a>\r
3774         </p>\r
3775 \r
3776         <h2><?php echo _TEMPLATE_EDIT_TITLE?> '<?php echo  htmlspecialchars($templatename); ?>'</h2>\r
3777 \r
3778         <?php                   if ($msg) echo "<p>"._MESSAGE.": $msg</p>";\r
3779         ?>\r
3780 \r
3781         <p><?php echo _TEMPLATE_EDIT_MSG?></p>\r
3782 \r
3783         <form method="post" action="index.php">\r
3784         <div>\r
3785 \r
3786         <input type="hidden" name="action" value="templateupdate" />\r
3787         <?php $manager->addTicketHidden() ?>\r
3788         <input type="hidden" name="templateid" value="<?php echo  $templateid; ?>" />\r
3789 \r
3790         <table><tr>\r
3791             <th colspan="2"><?php echo _TEMPLATE_SETTINGS?></th>\r
3792         </tr><tr>\r
3793             <td><?php echo _TEMPLATE_NAME?> <?php help('shortnames');?></td>\r
3794             <td><input name="tname" tabindex="4" size="20" maxlength="20" value="<?php echo  htmlspecialchars($templatename) ?>" /></td>\r
3795         </tr><tr>\r
3796             <td><?php echo _TEMPLATE_DESC?></td>\r
3797             <td><input name="tdesc" tabindex="5" size="50" maxlength="200" value="<?php echo  htmlspecialchars($templatedescription) ?>" /></td>\r
3798         </tr><tr>\r
3799             <th colspan="2"><?php echo _TEMPLATE_UPDATE?></th>\r
3800         </tr><tr>\r
3801             <td><?php echo _TEMPLATE_UPDATE?></td>\r
3802             <td>\r
3803                 <input type="submit" tabindex="6" value="<?php echo _TEMPLATE_UPDATE_BTN?>" onclick="return checkSubmit();" />\r
3804                 <input type="reset" tabindex="7" value="<?php echo _TEMPLATE_RESET_BTN?>" />\r
3805             </td>\r
3806         </tr><tr>\r
3807             <th colspan="2"><?php echo _TEMPLATE_ITEMS?> <?php help('templateitems'); ?></th>\r
3808 <?php   $this->_templateEditRow($template, _TEMPLATE_ITEMHEADER, 'ITEM_HEADER', '', 8);\r
3809     $this->_templateEditRow($template, _TEMPLATE_ITEMBODY, 'ITEM', '', 9, 1);\r
3810     $this->_templateEditRow($template, _TEMPLATE_ITEMFOOTER, 'ITEM_FOOTER', '', 10);\r
3811     $this->_templateEditRow($template, _TEMPLATE_MORELINK, 'MORELINK', 'morelink', 20);\r
3812     $this->_templateEditRow($template, _TEMPLATE_EDITLINK, 'EDITLINK', 'editlink', 25);\r
3813     $this->_templateEditRow($template, _TEMPLATE_NEW, 'NEW', 'new', 30);\r
3814 ?>\r
3815         </tr><tr>\r
3816             <th colspan="2"><?php echo _TEMPLATE_COMMENTS_ANY?> <?php help('templatecomments'); ?></th>\r
3817 <?php   $this->_templateEditRow($template, _TEMPLATE_CHEADER, 'COMMENTS_HEADER', 'commentheaders', 40);\r
3818     $this->_templateEditRow($template, _TEMPLATE_CBODY, 'COMMENTS_BODY', 'commentbody', 50, 1);\r
3819     $this->_templateEditRow($template, _TEMPLATE_CFOOTER, 'COMMENTS_FOOTER', 'commentheaders', 60);\r
3820     $this->_templateEditRow($template, _TEMPLATE_CONE, 'COMMENTS_ONE', 'commentwords', 70);\r
3821     $this->_templateEditRow($template, _TEMPLATE_CMANY, 'COMMENTS_MANY', 'commentwords', 80);\r
3822     $this->_templateEditRow($template, _TEMPLATE_CMORE, 'COMMENTS_CONTINUED', 'commentcontinued', 90);\r
3823     $this->_templateEditRow($template, _TEMPLATE_CMEXTRA, 'COMMENTS_AUTH', 'memberextra', 100);\r
3824 ?>\r
3825         </tr><tr>\r
3826             <th colspan="2"><?php echo _TEMPLATE_COMMENTS_NONE?> <?php help('templatecomments'); ?></th>\r
3827 <?php\r
3828     $this->_templateEditRow($template, _TEMPLATE_CNONE, 'COMMENTS_NONE', '', 110);\r
3829 ?>\r
3830         </tr><tr>\r
3831             <th colspan="2"><?php echo _TEMPLATE_COMMENTS_TOOMUCH?> <?php help('templatecomments'); ?></th>\r
3832 <?php   $this->_templateEditRow($template, _TEMPLATE_CTOOMUCH, 'COMMENTS_TOOMUCH', '', 120);\r
3833 ?>\r
3834         </tr><tr>\r
3835             <th colspan="2"><?php echo _TEMPLATE_ARCHIVELIST?> <?php help('templatearchivelists'); ?></th>\r
3836 <?php   $this->_templateEditRow($template, _TEMPLATE_AHEADER, 'ARCHIVELIST_HEADER', '', 130);\r
3837     $this->_templateEditRow($template, _TEMPLATE_AITEM, 'ARCHIVELIST_LISTITEM', '', 140);\r
3838     $this->_templateEditRow($template, _TEMPLATE_AFOOTER, 'ARCHIVELIST_FOOTER', '', 150);\r
3839 ?>\r
3840         </tr><tr>\r
3841             <th colspan="2"><?php echo _TEMPLATE_BLOGLIST?> <?php help('templatebloglists'); ?></th>\r
3842 <?php   $this->_templateEditRow($template, _TEMPLATE_BLOGHEADER, 'BLOGLIST_HEADER', '', 160);\r
3843     $this->_templateEditRow($template, _TEMPLATE_BLOGITEM, 'BLOGLIST_LISTITEM', '', 170);\r
3844     $this->_templateEditRow($template, _TEMPLATE_BLOGFOOTER, 'BLOGLIST_FOOTER', '', 180);\r
3845 ?>\r
3846         </tr><tr>\r
3847             <th colspan="2"><?php echo _TEMPLATE_CATEGORYLIST?> <?php help('templatecategorylists'); ?></th>\r
3848 <?php   $this->_templateEditRow($template, _TEMPLATE_CATHEADER, 'CATLIST_HEADER', '', 190);\r
3849     $this->_templateEditRow($template, _TEMPLATE_CATITEM, 'CATLIST_LISTITEM', '', 200);\r
3850     $this->_templateEditRow($template, _TEMPLATE_CATFOOTER, 'CATLIST_FOOTER', '', 210);\r
3851 ?>\r
3852         </tr><tr>\r
3853             <th colspan="2"><?php echo _TEMPLATE_DATETIME?></th>\r
3854 <?php   $this->_templateEditRow($template, _TEMPLATE_DHEADER, 'DATE_HEADER', 'dateheads', 220);\r
3855     $this->_templateEditRow($template, _TEMPLATE_DFOOTER, 'DATE_FOOTER', 'dateheads', 230);\r
3856     $this->_templateEditRow($template, _TEMPLATE_DFORMAT, 'FORMAT_DATE', 'datetime', 240);\r
3857     $this->_templateEditRow($template, _TEMPLATE_TFORMAT, 'FORMAT_TIME', 'datetime', 250);\r
3858     $this->_templateEditRow($template, _TEMPLATE_LOCALE, 'LOCALE', 'locale', 260);\r
3859 ?>\r
3860         </tr><tr>\r
3861             <th colspan="2"><?php echo _TEMPLATE_IMAGE?> <?php help('templatepopups'); ?></th>\r
3862 <?php   $this->_templateEditRow($template, _TEMPLATE_PCODE, 'POPUP_CODE', '', 270);\r
3863     $this->_templateEditRow($template, _TEMPLATE_ICODE, 'IMAGE_CODE', '', 280);\r
3864     $this->_templateEditRow($template, _TEMPLATE_MCODE, 'MEDIA_CODE', '', 290);\r
3865 ?>\r
3866         </tr><tr>\r
3867             <th colspan="2"><?php echo _TEMPLATE_SEARCH?></th>\r
3868 <?php   $this->_templateEditRow($template, _TEMPLATE_SHIGHLIGHT, 'SEARCH_HIGHLIGHT', 'highlight',300);\r
3869     $this->_templateEditRow($template, _TEMPLATE_SNOTFOUND, 'SEARCH_NOTHINGFOUND', 'nothingfound',310);\r
3870 ?>\r
3871         </tr><tr>\r
3872             <th colspan="2"><?php echo _TEMPLATE_PLUGIN_FIELDS?></th>\r
3873 <?php\r
3874         $tab = 600;\r
3875         $pluginfields = array();\r
3876         $manager->notify('TemplateExtraFields',array('fields'=>&$pluginfields));\r
3877 \r
3878         foreach ($pluginfields as $pfkey=>$pfvalue) {\r
3879             echo "</tr><tr>\n";\r
3880             echo '<th colspan="2">'.htmlentities($pfkey)."</th>\n";\r
3881             foreach ($pfvalue as $pffield=>$pfdesc) {\r
3882                 $this->_templateEditRow($template, $pfdesc, $pffield, '',++$tab,0);\r
3883             }\r
3884         }\r
3885 ?>\r
3886         </tr><tr>\r
3887             <th colspan="2"><?php echo _TEMPLATE_UPDATE?></th>\r
3888         </tr><tr>\r
3889             <td><?php echo _TEMPLATE_UPDATE?></td>\r
3890             <td>\r
3891                 <input type="submit" tabindex="800" value="<?php echo _TEMPLATE_UPDATE_BTN?>" onclick="return checkSubmit();" />\r
3892                 <input type="reset" tabindex="810" value="<?php echo _TEMPLATE_RESET_BTN?>" />\r
3893             </td>\r
3894         </tr></table>\r
3895 \r
3896         </div>\r
3897         </form>\r
3898         <?php\r
3899         $this->pagefoot();\r
3900     }\r
3901 \r
3902     /**\r
3903      * @todo document this\r
3904      */\r
3905     function _templateEditRow(&$template, $description, $name, $help = '', $tabindex = 0, $big = 0) {\r
3906         static $count = 1;\r
3907         if (!isset($template[$name])) $template[$name] = '';\r
3908     ?>\r
3909         </tr><tr>\r
3910             <td><?php echo $description?> <?php if ($help) help('template'.$help); ?></td>\r
3911             <td id="td<?php echo $count?>"><textarea class="templateedit" name="<?php echo $name?>" tabindex="<?php echo $tabindex?>" cols="50" rows="<?php echo $big?10:5?>" id="textarea<?php echo $count?>"><?php echo  htmlspecialchars($template[$name]); ?></textarea></td>\r
3912     <?php       $count++;\r
3913     }\r
3914 \r
3915     /**\r
3916      * @todo document this\r
3917      */\r
3918     function action_templateupdate() {\r
3919         global $member, $manager;\r
3920 \r
3921         $templateid = intRequestVar('templateid');\r
3922 \r
3923         $member->isAdmin() or $this->disallow();\r
3924 \r
3925         $name = postVar('tname');\r
3926         $desc = postVar('tdesc');\r
3927 \r
3928         if (!isValidTemplateName($name))\r
3929             $this->error(_ERROR_BADTEMPLATENAME);\r
3930 \r
3931         if ((TEMPLATE::getNameFromId($templateid) != $name) && TEMPLATE::exists($name))\r
3932             $this->error(_ERROR_DUPTEMPLATENAME);\r
3933 \r
3934 \r
3935         $name = addslashes($name);\r
3936         $desc = addslashes($desc);\r
3937 \r
3938         // 1. Remove all template parts\r
3939         $query = 'DELETE FROM '.sql_table('template').' WHERE tdesc=' . $templateid;\r
3940         sql_query($query);\r
3941 \r
3942         // 2. Update description\r
3943         $query =  'UPDATE '.sql_table('template_desc').' SET'\r
3944                . " tdname='" . $name . "',"\r
3945                . " tddesc='" . $desc . "'"\r
3946                . " WHERE tdnumber=" . $templateid;\r
3947         sql_query($query);\r
3948 \r
3949         // 3. Add non-empty template parts\r
3950         $this->addToTemplate($templateid, 'ITEM_HEADER', postVar('ITEM_HEADER'));\r
3951         $this->addToTemplate($templateid, 'ITEM', postVar('ITEM'));\r
3952         $this->addToTemplate($templateid, 'ITEM_FOOTER', postVar('ITEM_FOOTER'));\r
3953         $this->addToTemplate($templateid, 'MORELINK', postVar('MORELINK'));\r
3954         $this->addToTemplate($templateid, 'EDITLINK', postVar('EDITLINK'));\r
3955         $this->addToTemplate($templateid, 'NEW', postVar('NEW'));\r
3956         $this->addToTemplate($templateid, 'COMMENTS_HEADER', postVar('COMMENTS_HEADER'));\r
3957         $this->addToTemplate($templateid, 'COMMENTS_BODY', postVar('COMMENTS_BODY'));\r
3958         $this->addToTemplate($templateid, 'COMMENTS_FOOTER', postVar('COMMENTS_FOOTER'));\r
3959         $this->addToTemplate($templateid, 'COMMENTS_CONTINUED', postVar('COMMENTS_CONTINUED'));\r
3960         $this->addToTemplate($templateid, 'COMMENTS_TOOMUCH', postVar('COMMENTS_TOOMUCH'));\r
3961         $this->addToTemplate($templateid, 'COMMENTS_AUTH', postVar('COMMENTS_AUTH'));\r
3962         $this->addToTemplate($templateid, 'COMMENTS_ONE', postVar('COMMENTS_ONE'));\r
3963         $this->addToTemplate($templateid, 'COMMENTS_MANY', postVar('COMMENTS_MANY'));\r
3964         $this->addToTemplate($templateid, 'COMMENTS_NONE', postVar('COMMENTS_NONE'));\r
3965         $this->addToTemplate($templateid, 'ARCHIVELIST_HEADER', postVar('ARCHIVELIST_HEADER'));\r
3966         $this->addToTemplate($templateid, 'ARCHIVELIST_LISTITEM', postVar('ARCHIVELIST_LISTITEM'));\r
3967         $this->addToTemplate($templateid, 'ARCHIVELIST_FOOTER', postVar('ARCHIVELIST_FOOTER'));\r
3968         $this->addToTemplate($templateid, 'BLOGLIST_HEADER', postVar('BLOGLIST_HEADER'));\r
3969         $this->addToTemplate($templateid, 'BLOGLIST_LISTITEM', postVar('BLOGLIST_LISTITEM'));\r
3970         $this->addToTemplate($templateid, 'BLOGLIST_FOOTER', postVar('BLOGLIST_FOOTER'));\r
3971         $this->addToTemplate($templateid, 'CATLIST_HEADER', postVar('CATLIST_HEADER'));\r
3972         $this->addToTemplate($templateid, 'CATLIST_LISTITEM', postVar('CATLIST_LISTITEM'));\r
3973         $this->addToTemplate($templateid, 'CATLIST_FOOTER', postVar('CATLIST_FOOTER'));\r
3974         $this->addToTemplate($templateid, 'DATE_HEADER', postVar('DATE_HEADER'));\r
3975         $this->addToTemplate($templateid, 'DATE_FOOTER', postVar('DATE_FOOTER'));\r
3976         $this->addToTemplate($templateid, 'FORMAT_DATE', postVar('FORMAT_DATE'));\r
3977         $this->addToTemplate($templateid, 'FORMAT_TIME', postVar('FORMAT_TIME'));\r
3978         $this->addToTemplate($templateid, 'LOCALE', postVar('LOCALE'));\r
3979         $this->addToTemplate($templateid, 'SEARCH_HIGHLIGHT', postVar('SEARCH_HIGHLIGHT'));\r
3980         $this->addToTemplate($templateid, 'SEARCH_NOTHINGFOUND', postVar('SEARCH_NOTHINGFOUND'));\r
3981         $this->addToTemplate($templateid, 'POPUP_CODE', postVar('POPUP_CODE'));\r
3982         $this->addToTemplate($templateid, 'MEDIA_CODE', postVar('MEDIA_CODE'));\r
3983         $this->addToTemplate($templateid, 'IMAGE_CODE', postVar('IMAGE_CODE'));\r
3984 \r
3985         $pluginfields = array();\r
3986         $manager->notify('TemplateExtraFields',array('fields'=>&$pluginfields));\r
3987         foreach ($pluginfields as $pfkey=>$pfvalue) {\r
3988             foreach ($pfvalue as $pffield=>$pfdesc) {\r
3989                 $this->addToTemplate($templateid, $pffield, postVar($pffield));\r
3990             }\r
3991         }\r
3992 \r
3993         // jump back to template edit\r
3994         $this->action_templateedit(_TEMPLATE_UPDATED);\r
3995 \r
3996     }\r
3997 \r
3998     /**\r
3999      * @todo document this\r
4000      */\r
4001     function addToTemplate($id, $partname, $content) {\r
4002         $partname = addslashes($partname);\r
4003         $content = addslashes($content);\r
4004 \r
4005         $id = intval($id);\r
4006 \r
4007         // don't add empty parts:\r
4008         if (!trim($content)) return -1;\r
4009 \r
4010         $query = 'INSERT INTO '.sql_table('template')." (tdesc, tpartname, tcontent) "\r
4011                . "VALUES ($id, '$partname', '$content')";\r
4012         sql_query($query) or exit(_ADMIN_SQLDIE_QUERYERROR . sql_error());\r
4013         return sql_insert_id();\r
4014     }\r
4015 \r
4016     /**\r
4017      * @todo document this\r
4018      */\r
4019     function action_templatedelete() {\r
4020         global $member, $manager;\r
4021 \r
4022         $member->isAdmin() or $this->disallow();\r
4023 \r
4024         $templateid = intRequestVar('templateid');\r
4025         // TODO: check if template can be deleted\r
4026 \r
4027         $this->pagehead();\r
4028 \r
4029         $name = TEMPLATE::getNameFromId($templateid);\r
4030         $desc = TEMPLATE::getDesc($templateid);\r
4031 \r
4032         ?>\r
4033             <h2><?php echo _DELETE_CONFIRM?></h2>\r
4034 \r
4035             <p>\r
4036             <?php echo _CONFIRMTXT_TEMPLATE?><b><?php echo htmlspecialchars($name)?></b> (<?php echo  htmlspecialchars($desc) ?>)\r
4037             </p>\r
4038 \r
4039             <form method="post" action="index.php"><div>\r
4040                 <input type="hidden" name="action" value="templatedeleteconfirm" />\r
4041                 <?php $manager->addTicketHidden() ?>\r
4042                 <input type="hidden" name="templateid" value="<?php echo  $templateid ?>" />\r
4043                 <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
4044             </div></form>\r
4045         <?php\r
4046         $this->pagefoot();\r
4047     }\r
4048 \r
4049     /**\r
4050      * @todo document this\r
4051      */\r
4052     function action_templatedeleteconfirm() {\r
4053         global $member, $manager;\r
4054 \r
4055         $templateid = intRequestVar('templateid');\r
4056 \r
4057         $member->isAdmin() or $this->disallow();\r
4058 \r
4059         $manager->notify('PreDeleteTemplate', array('templateid' => $templateid));\r
4060 \r
4061         // 1. delete description\r
4062         sql_query('DELETE FROM '.sql_table('template_desc').' WHERE tdnumber=' . $templateid);\r
4063 \r
4064         // 2. delete parts\r
4065         sql_query('DELETE FROM '.sql_table('template').' WHERE tdesc=' . $templateid);\r
4066 \r
4067         $manager->notify('PostDeleteTemplate', array('templateid' => $templateid));\r
4068 \r
4069         $this->action_templateoverview();\r
4070     }\r
4071 \r
4072     /**\r
4073      * @todo document this\r
4074      */\r
4075     function action_templatenew() {\r
4076         global $member;\r
4077 \r
4078         $member->isAdmin() or $this->disallow();\r
4079 \r
4080         $name = postVar('name');\r
4081         $desc = postVar('desc');\r
4082 \r
4083         if (!isValidTemplateName($name))\r
4084             $this->error(_ERROR_BADTEMPLATENAME);\r
4085 \r
4086         if (TEMPLATE::exists($name))\r
4087             $this->error(_ERROR_DUPTEMPLATENAME);\r
4088 \r
4089         $newTemplateId = TEMPLATE::createNew($name, $desc);\r
4090 \r
4091         $this->action_templateoverview();\r
4092     }\r
4093 \r
4094     /**\r
4095      * @todo document this\r
4096      */\r
4097     function action_templateclone() {\r
4098         global $member;\r
4099 \r
4100         $templateid = intRequestVar('templateid');\r
4101 \r
4102         $member->isAdmin() or $this->disallow();\r
4103 \r
4104         // 1. read old template\r
4105         $name = TEMPLATE::getNameFromId($templateid);\r
4106         $desc = TEMPLATE::getDesc($templateid);\r
4107 \r
4108         // 2. create desc thing\r
4109         $name = "cloned" . $name;\r
4110 \r
4111         // if a template with that name already exists:\r
4112         if (TEMPLATE::exists($name)) {\r
4113             $i = 1;\r
4114             while (TEMPLATE::exists($name . $i))\r
4115                 $i++;\r
4116             $name .= $i;\r
4117         }\r
4118 \r
4119         $newid = TEMPLATE::createNew($name, $desc);\r
4120 \r
4121         // 3. create clone\r
4122         // go through parts of old template and add them to the new one\r
4123         $res = sql_query('SELECT tpartname, tcontent FROM '.sql_table('template').' WHERE tdesc=' . $templateid);\r
4124         while ($o = sql_fetch_object($res)) {\r
4125             $this->addToTemplate($newid, $o->tpartname, $o->tcontent);\r
4126         }\r
4127 \r
4128         $this->action_templateoverview();\r
4129     }\r
4130 \r
4131     /**\r
4132      * @todo document this\r
4133      */\r
4134     function action_skinoverview() {\r
4135         global $member, $manager;\r
4136 \r
4137         $member->isAdmin() or $this->disallow();\r
4138 \r
4139         $this->pagehead();\r
4140 \r
4141         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
4142 \r
4143         echo '<h2>' . _SKIN_EDIT_TITLE . '</h2>';\r
4144 \r
4145         echo '<h3>' . _SKIN_AVAILABLE_TITLE . '</h3>';\r
4146 \r
4147         $query = 'SELECT * FROM '.sql_table('skin_desc').' ORDER BY sdname';\r
4148         $template['content'] = 'skinlist';\r
4149         $template['tabindex'] = 10;\r
4150         showlist($query,'table',$template);\r
4151 \r
4152         echo '<h3>' . _SKIN_NEW_TITLE . '</h3>';\r
4153 \r
4154         ?>\r
4155         <form method="post" action="index.php">\r
4156         <div>\r
4157 \r
4158         <input name="action" value="skinnew" type="hidden" />\r
4159         <?php $manager->addTicketHidden() ?>\r
4160         <table><tr>\r
4161             <td><?php echo _SKIN_NAME?> <?php help('shortnames');?></td>\r
4162             <td><input name="name" tabindex="10010" maxlength="20" size="20" /></td>\r
4163         </tr><tr>\r
4164             <td><?php echo _SKIN_DESC?></td>\r
4165             <td><input name="desc" tabindex="10020" maxlength="200" size="50" /></td>\r
4166         </tr><tr>\r
4167             <td><?php echo _SKIN_CREATE?></td>\r
4168             <td><input type="submit" tabindex="10030" value="<?php echo _SKIN_CREATE_BTN?>" onclick="return checkSubmit();" /></td>\r
4169         </tr></table>\r
4170 \r
4171         </div>\r
4172         </form>\r
4173 \r
4174         <?php\r
4175         $this->pagefoot();\r
4176     }\r
4177 \r
4178     /**\r
4179      * @todo document this\r
4180      */\r
4181     function action_skinnew() {\r
4182         global $member;\r
4183 \r
4184         $member->isAdmin() or $this->disallow();\r
4185 \r
4186         $name = trim(postVar('name'));\r
4187         $desc = trim(postVar('desc'));\r
4188 \r
4189         if (!isValidSkinName($name))\r
4190             $this->error(_ERROR_BADSKINNAME);\r
4191 \r
4192         if (SKIN::exists($name))\r
4193             $this->error(_ERROR_DUPSKINNAME);\r
4194 \r
4195         $newId = SKIN::createNew($name, $desc);\r
4196 \r
4197         $this->action_skinoverview();\r
4198     }\r
4199 \r
4200     /**\r
4201      * @todo document this\r
4202      */\r
4203     function action_skinedit() {\r
4204         global $member, $manager;\r
4205 \r
4206         $skinid = intRequestVar('skinid');\r
4207 \r
4208         $member->isAdmin() or $this->disallow();\r
4209 \r
4210         $skin =& new SKIN($skinid);\r
4211 \r
4212         $this->pagehead();\r
4213         ?>\r
4214         <p>\r
4215             <a href="index.php?action=skinoverview">(<?php echo _SKIN_BACK?>)</a>\r
4216         </p>\r
4217         <h2><?php echo _SKIN_EDITONE_TITLE?> '<?php echo  $skin->getName() ?>'</h2>\r
4218 \r
4219         <h3><?php echo _SKIN_PARTS_TITLE?></h3>\r
4220         <?php echo _SKIN_PARTS_MSG?>\r
4221         <ul>\r
4222             <li><a tabindex="10" href="index.php?action=skinedittype&amp;skinid=<?php echo  $skinid ?>&amp;type=index"><?php echo _SKIN_PART_MAIN?></a> <?php help('skinpartindex')?></li>\r
4223             <li><a tabindex="20" href="index.php?action=skinedittype&amp;skinid=<?php echo  $skinid ?>&amp;type=item"><?php echo _SKIN_PART_ITEM?></a> <?php help('skinpartitem')?></li>\r
4224             <li><a tabindex="30" href="index.php?action=skinedittype&amp;skinid=<?php echo  $skinid ?>&amp;type=archivelist"><?php echo _SKIN_PART_ALIST?></a> <?php help('skinpartarchivelist')?></li>\r
4225             <li><a tabindex="40" href="index.php?action=skinedittype&amp;skinid=<?php echo  $skinid ?>&amp;type=archive"><?php echo _SKIN_PART_ARCHIVE?></a> <?php help('skinpartarchive')?></li>\r
4226             <li><a tabindex="50" href="index.php?action=skinedittype&amp;skinid=<?php echo  $skinid ?>&amp;type=search"><?php echo _SKIN_PART_SEARCH?></a> <?php help('skinpartsearch')?></li>\r
4227             <li><a tabindex="60" href="index.php?action=skinedittype&amp;skinid=<?php echo  $skinid ?>&amp;type=error"><?php echo _SKIN_PART_ERROR?></a> <?php help('skinparterror')?></li>\r
4228             <li><a tabindex="70" href="index.php?action=skinedittype&amp;skinid=<?php echo  $skinid ?>&amp;type=member"><?php echo _SKIN_PART_MEMBER?></a> <?php help('skinpartmember')?></li>\r
4229             <li><a tabindex="75" href="index.php?action=skinedittype&amp;skinid=<?php echo  $skinid ?>&amp;type=imagepopup"><?php echo _SKIN_PART_POPUP?></a> <?php help('skinpartimagepopup')?></li>\r
4230         </ul>\r
4231 \r
4232         <?php\r
4233 \r
4234         $query = "SELECT stype FROM " . sql_table('skin') . " WHERE stype NOT IN ('index', 'item', 'error', 'search', 'archive', 'archivelist', 'imagepopup', 'member') and sdesc = " . $skinid;\r
4235         $res = sql_query($query);\r
4236 \r
4237         echo '<h3>' . _SKIN_PARTS_SPECIAL . '</h3>';\r
4238         echo '<form method="get" action="index.php">' . "\r\n";\r
4239         echo '<input type="hidden" name="action" value="skinedittype" />' . "\r\n";\r
4240         echo '<input type="hidden" name="skinid" value="' . $skinid . '" />' . "\r\n";\r
4241         echo '<input name="type" tabindex="89" size="20" maxlength="20" />' . "\r\n";\r
4242         echo '<input type="submit" tabindex="140" value="' . _SKIN_CREATE . '" onclick="return checkSubmit();" />' . "\r\n";\r
4243         echo '</form>' . "\r\n";\r
4244 \r
4245         if ($res && sql_num_rows($res) > 0) {\r
4246             echo '<ul>';\r
4247             $tabstart = 75;\r
4248 \r
4249             while ($row = sql_fetch_assoc($res)) {\r
4250                 echo '<li><a tabindex="' . ($tabstart++) . '" href="index.php?action=skinedittype&amp;skinid=' . $skinid . '&amp;type=' . htmlspecialchars(strtolower($row['stype'])) . '">' . htmlspecialchars(ucfirst($row['stype'])) . '</a> (<a tabindex="' . ($tabstart++) . '" href="index.php?action=skinremovetype&amp;skinid=' . $skinid . '&amp;type=' . htmlspecialchars(strtolower($row['stype'])) . '">'._LISTS_DELETE.'</a>)</li>';\r
4251             }\r
4252 \r
4253             echo '</ul>';\r
4254         }\r
4255 \r
4256         ?>\r
4257 \r
4258         <h3><?php echo _SKIN_GENSETTINGS_TITLE; ?></h3>\r
4259         <form method="post" action="index.php">\r
4260         <div>\r
4261 \r
4262         <input type="hidden" name="action" value="skineditgeneral" />\r
4263         <?php $manager->addTicketHidden() ?>\r
4264         <input type="hidden" name="skinid" value="<?php echo  $skinid ?>" />\r
4265         <table><tr>\r
4266             <td><?php echo _SKIN_NAME?> <?php help('shortnames');?></td>\r
4267             <td><input name="name" tabindex="90" value="<?php echo  htmlspecialchars($skin->getName()) ?>" maxlength="20" size="20" /></td>\r
4268         </tr><tr>\r
4269             <td><?php echo _SKIN_DESC?></td>\r
4270             <td><input name="desc" tabindex="100" value="<?php echo  htmlspecialchars($skin->getDescription()) ?>" maxlength="200" size="50" /></td>\r
4271         </tr><tr>\r
4272             <td><?php echo _SKIN_TYPE?></td>\r
4273             <td><input name="type" tabindex="110" value="<?php echo  htmlspecialchars($skin->getContentType()) ?>" maxlength="40" size="20" /></td>\r
4274         </tr><tr>\r
4275             <td><?php echo _SKIN_INCLUDE_MODE?> <?php help('includemode')?></td>\r
4276             <td><?php $this->input_yesno('inc_mode',$skin->getIncludeMode(),120,'skindir','normal',_PARSER_INCMODE_SKINDIR,_PARSER_INCMODE_NORMAL);?></td>\r
4277         </tr><tr>\r
4278             <td><?php echo _SKIN_INCLUDE_PREFIX?> <?php help('includeprefix')?></td>\r
4279             <td><input name="inc_prefix" tabindex="130" value="<?php echo  htmlspecialchars($skin->getIncludePrefix()) ?>" maxlength="40" size="20" /></td>\r
4280         </tr><tr>\r
4281             <td><?php echo _SKIN_CHANGE?></td>\r
4282             <td><input type="submit" tabindex="140" value="<?php echo _SKIN_CHANGE_BTN?>" onclick="return checkSubmit();" /></td>\r
4283         </tr></table>\r
4284 \r
4285         </div>\r
4286         </form>\r
4287 \r
4288 \r
4289         <?php       $this->pagefoot();\r
4290     }\r
4291 \r
4292     /**\r
4293      * @todo document this\r
4294      */\r
4295     function action_skineditgeneral() {\r
4296         global $member;\r
4297 \r
4298         $skinid = intRequestVar('skinid');\r
4299 \r
4300         $member->isAdmin() or $this->disallow();\r
4301 \r
4302         $name = postVar('name');\r
4303         $desc = postVar('desc');\r
4304         $type = postVar('type');\r
4305         $inc_mode = postVar('inc_mode');\r
4306         $inc_prefix = postVar('inc_prefix');\r
4307 \r
4308         $skin =& new SKIN($skinid);\r
4309 \r
4310         // 1. Some checks\r
4311         if (!isValidSkinName($name))\r
4312             $this->error(_ERROR_BADSKINNAME);\r
4313 \r
4314         if (($skin->getName() != $name) && SKIN::exists($name))\r
4315             $this->error(_ERROR_DUPSKINNAME);\r
4316 \r
4317         if (!$type) $type = 'text/html';\r
4318         if (!$inc_mode) $inc_mode = 'normal';\r
4319 \r
4320         // 2. Update description\r
4321         $skin->updateGeneralInfo($name, $desc, $type, $inc_mode, $inc_prefix);\r
4322 \r
4323         $this->action_skinedit();\r
4324 \r
4325     }\r
4326 \r
4327     /**\r
4328      * @todo document this\r
4329      */\r
4330     function action_skinedittype($msg = '') {\r
4331         global $member, $manager;\r
4332 \r
4333         $skinid = intRequestVar('skinid');\r
4334         $type = requestVar('type');\r
4335 \r
4336         $member->isAdmin() or $this->disallow();\r
4337 \r
4338         $type = trim($type);\r
4339         $type = strtolower($type);\r
4340 \r
4341         if (!isValidShortName($type)) {\r
4342             $this->error(_ERROR_SKIN_PARTS_SPECIAL_FORMAT);\r
4343         }\r
4344 \r
4345         $skin =& new SKIN($skinid);\r
4346 \r
4347         $friendlyNames = SKIN::getFriendlyNames();\r
4348 \r
4349         $this->pagehead();\r
4350         ?>\r
4351         <p>(<a href="index.php?action=skinoverview"><?php echo _SKIN_GOBACK?></a>)</p>\r
4352 \r
4353         <h2><?php echo _SKIN_EDITPART_TITLE?> '<?php echo htmlspecialchars($skin->getName()) ?>': <?php echo htmlspecialchars(isset($friendlyNames[$type]) ? $friendlyNames[$type] : ucfirst($type)); ?></h2>\r
4354 \r
4355         <?php           if ($msg) echo "<p>"._MESSAGE.": $msg</p>";\r
4356         ?>\r
4357 \r
4358 \r
4359         <form method="post" action="index.php">\r
4360         <div>\r
4361 \r
4362         <input type="hidden" name="action" value="skinupdate" />\r
4363         <?php $manager->addTicketHidden() ?>\r
4364         <input type="hidden" name="skinid" value="<?php echo  $skinid ?>" />\r
4365         <input type="hidden" name="type" value="<?php echo  $type ?>" />\r
4366 \r
4367         <input type="submit" value="<?php echo _SKIN_UPDATE_BTN?>" onclick="return checkSubmit();" />\r
4368         <input type="reset" value="<?php echo _SKIN_RESET_BTN?>" />\r
4369         (skin type: <?php echo htmlspecialchars(isset($friendlyNames[$type]) ? $friendlyNames[$type] : ucfirst($type)); ?>)\r
4370         <?php if (in_array($type, array('index', 'item', 'archivelist', 'archive', 'search', 'error', 'member', 'imagepopup'))) {\r
4371             help('skinpart' . $type);\r
4372         } else {\r
4373             help('skinpartspecial');\r
4374         }?>\r
4375         <br />\r
4376 \r
4377         <textarea class="skinedit" tabindex="10" rows="20" cols="80" name="content"><?php echo  htmlspecialchars($skin->getContent($type)) ?></textarea>\r
4378 \r
4379         <br />\r
4380         <input type="submit" tabindex="20" value="<?php echo _SKIN_UPDATE_BTN?>" onclick="return checkSubmit();" />\r
4381         <input type="reset" value="<?php echo _SKIN_RESET_BTN?>" />\r
4382         (skin type: <?php echo htmlspecialchars(isset($friendlyNames[$type]) ? $friendlyNames[$type] : ucfirst($type)); ?>)\r
4383 \r
4384         <br /><br />\r
4385         <?php echo _SKIN_ALLOWEDVARS?>\r
4386         <?php           $actions = SKIN::getAllowedActionsForType($type);\r
4387 \r
4388             sort($actions);\r
4389 \r
4390             while ($current = array_shift($actions)) {\r
4391                 // skip deprecated vars\r
4392                 if ($current == 'ifcat') continue;\r
4393                 if ($current == 'imagetext') continue;\r
4394                 if ($current == 'vars') continue;\r
4395 \r
4396                 echo helplink('skinvar-' . $current) . "$current</a>";\r
4397                 if (count($actions) != 0) echo ", ";\r
4398             }\r
4399         echo '<br /><br />' . _SKINEDIT_ALLOWEDBLOGS;\r
4400         $query = 'SELECT bshortname, bname FROM '.sql_table('blog');\r
4401             showlist($query,'table',array('content'=>'shortblognames'));\r
4402         echo '<br />' . _SKINEDIT_ALLOWEDTEMPLATESS;\r
4403         $query = 'SELECT tdname as name, tddesc as description FROM '.sql_table('template_desc');\r
4404             showlist($query,'table',array('content'=>'shortnames'));\r
4405         echo '</div></form>';\r
4406         $this->pagefoot();\r
4407     }\r
4408 \r
4409     /**\r
4410      * @todo document this\r
4411      */\r
4412     function action_skinupdate() {\r
4413         global $member;\r
4414 \r
4415         $skinid = intRequestVar('skinid');\r
4416         $content = trim(postVar('content'));\r
4417         $type = postVar('type');\r
4418 \r
4419         $member->isAdmin() or $this->disallow();\r
4420 \r
4421         $skin =& new SKIN($skinid);\r
4422         $skin->update($type, $content);\r
4423 \r
4424         $this->action_skinedittype(_SKIN_UPDATED);\r
4425     }\r
4426 \r
4427     /**\r
4428      * @todo document this\r
4429      */\r
4430     function action_skindelete() {\r
4431         global $member, $manager, $CONF;\r
4432 \r
4433         $skinid = intRequestVar('skinid');\r
4434 \r
4435         $member->isAdmin() or $this->disallow();\r
4436 \r
4437         // don't allow default skin to be deleted\r
4438         if ($skinid == $CONF['BaseSkin'])\r
4439             $this->error(_ERROR_DEFAULTSKIN);\r
4440 \r
4441         // don't allow deletion of default skins for blogs\r
4442         $query = 'SELECT bname FROM '.sql_table('blog').' WHERE bdefskin=' . $skinid;\r
4443         $r = sql_query($query);\r
4444         if ($o = sql_fetch_object($r))\r
4445             $this->error(_ERROR_SKINDEFDELETE . htmlspecialchars($o->bname));\r
4446 \r
4447         $this->pagehead();\r
4448 \r
4449         $skin =& new SKIN($skinid);\r
4450         $name = $skin->getName();\r
4451         $desc = $skin->getDescription();\r
4452 \r
4453         ?>\r
4454             <h2><?php echo _DELETE_CONFIRM?></h2>\r
4455 \r
4456             <p>\r
4457                 <?php echo _CONFIRMTXT_SKIN?><b><?php echo htmlspecialchars($name) ?></b> (<?php echo  htmlspecialchars($desc)?>)\r
4458             </p>\r
4459 \r
4460             <form method="post" action="index.php"><div>\r
4461                 <input type="hidden" name="action" value="skindeleteconfirm" />\r
4462                 <?php $manager->addTicketHidden() ?>\r
4463                 <input type="hidden" name="skinid" value="<?php echo  $skinid ?>" />\r
4464                 <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
4465             </div></form>\r
4466         <?php\r
4467         $this->pagefoot();\r
4468     }\r
4469 \r
4470     /**\r
4471      * @todo document this\r
4472      */\r
4473     function action_skindeleteconfirm() {\r
4474         global $member, $CONF, $manager;\r
4475 \r
4476         $skinid = intRequestVar('skinid');\r
4477 \r
4478         $member->isAdmin() or $this->disallow();\r
4479 \r
4480         // don't allow default skin to be deleted\r
4481         if ($skinid == $CONF['BaseSkin'])\r
4482             $this->error(_ERROR_DEFAULTSKIN);\r
4483 \r
4484         // don't allow deletion of default skins for blogs\r
4485         $query = 'SELECT bname FROM '.sql_table('blog').' WHERE bdefskin=' . $skinid;\r
4486         $r = sql_query($query);\r
4487         if ($o = sql_fetch_object($r))\r
4488             $this->error(_ERROR_SKINDEFDELETE .$o->bname);\r
4489 \r
4490         $manager->notify('PreDeleteSkin', array('skinid' => $skinid));\r
4491 \r
4492         // 1. delete description\r
4493         sql_query('DELETE FROM '.sql_table('skin_desc').' WHERE sdnumber=' . $skinid);\r
4494 \r
4495         // 2. delete parts\r
4496         sql_query('DELETE FROM '.sql_table('skin').' WHERE sdesc=' . $skinid);\r
4497 \r
4498         $manager->notify('PostDeleteSkin', array('skinid' => $skinid));\r
4499 \r
4500         $this->action_skinoverview();\r
4501     }\r
4502 \r
4503     /**\r
4504      * @todo document this\r
4505      */\r
4506     function action_skinremovetype() {\r
4507         global $member, $manager, $CONF;\r
4508 \r
4509         $skinid = intRequestVar('skinid');\r
4510         $skintype = requestVar('type');\r
4511 \r
4512         if (!isValidShortName($skintype)) {\r
4513             $this->error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);\r
4514         }\r
4515 \r
4516         $member->isAdmin() or $this->disallow();\r
4517 \r
4518         // don't allow default skinparts to be deleted\r
4519         if (in_array($skintype, array('index', 'item', 'archivelist', 'archive', 'search', 'error', 'member', 'imagepopup'))) {\r
4520             $this->error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);\r
4521         }\r
4522 \r
4523         $this->pagehead();\r
4524 \r
4525         $skin =& new SKIN($skinid);\r
4526         $name = $skin->getName();\r
4527         $desc = $skin->getDescription();\r
4528 \r
4529         ?>\r
4530             <h2><?php echo _DELETE_CONFIRM?></h2>\r
4531 \r
4532             <p>\r
4533                 <?php echo _CONFIRMTXT_SKIN_PARTS_SPECIAL; ?> <b><?php echo htmlspecialchars($skintype); ?> (<?php echo htmlspecialchars($name); ?>)</b> (<?php echo  htmlspecialchars($desc)?>)\r
4534             </p>\r
4535 \r
4536             <form method="post" action="index.php"><div>\r
4537                 <input type="hidden" name="action" value="skinremovetypeconfirm" />\r
4538                 <?php $manager->addTicketHidden() ?>\r
4539                 <input type="hidden" name="skinid" value="<?php echo $skinid; ?>" />\r
4540                 <input type="hidden" name="type" value="<?php echo htmlspecialchars($skintype); ?>" />\r
4541                 <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
4542             </div></form>\r
4543         <?php\r
4544         $this->pagefoot();\r
4545     }\r
4546 \r
4547     /**\r
4548      * @todo document this\r
4549      */\r
4550     function action_skinremovetypeconfirm() {\r
4551         global $member, $CONF, $manager;\r
4552 \r
4553         $skinid = intRequestVar('skinid');\r
4554         $skintype = requestVar('type');\r
4555 \r
4556         if (!isValidShortName($skintype)) {\r
4557             $this->error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);\r
4558         }\r
4559 \r
4560         $member->isAdmin() or $this->disallow();\r
4561 \r
4562         // don't allow default skinparts to be deleted\r
4563         if (in_array($skintype, array('index', 'item', 'archivelist', 'archive', 'search', 'error', 'member', 'imagepopup'))) {\r
4564             $this->error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);\r
4565         }\r
4566 \r
4567         $manager->notify('PreDeleteSkinPart', array('skinid' => $skinid, 'skintype' => $skintype));\r
4568 \r
4569         // delete part\r
4570         sql_query('DELETE FROM '.sql_table('skin').' WHERE sdesc=' . $skinid . ' AND stype=\'' . $skintype . '\'');\r
4571 \r
4572         $manager->notify('PostDeleteSkinPart', array('skinid' => $skinid, 'skintype' => $skintype));\r
4573 \r
4574         $this->action_skinedit();\r
4575     }\r
4576 \r
4577     /**\r
4578      * @todo document this\r
4579      */\r
4580     function action_skinclone() {\r
4581         global $member;\r
4582 \r
4583         $skinid = intRequestVar('skinid');\r
4584 \r
4585         $member->isAdmin() or $this->disallow();\r
4586 \r
4587         // 1. read skin to clone\r
4588         $skin =& new SKIN($skinid);\r
4589 \r
4590         $name = "clone_" . $skin->getName();\r
4591 \r
4592         // if a skin with that name already exists:\r
4593         if (SKIN::exists($name)) {\r
4594             $i = 1;\r
4595             while (SKIN::exists($name . $i))\r
4596                 $i++;\r
4597             $name .= $i;\r
4598         }\r
4599 \r
4600         // 2. create skin desc\r
4601         $newid = SKIN::createNew(\r
4602             $name,\r
4603             $skin->getDescription(),\r
4604             $skin->getContentType(),\r
4605             $skin->getIncludeMode(),\r
4606             $skin->getIncludePrefix()\r
4607         );\r
4608 \r
4609 \r
4610         // 3. clone\r
4611         /*\r
4612         $this->skinclonetype($skin, $newid, 'index');\r
4613         $this->skinclonetype($skin, $newid, 'item');\r
4614         $this->skinclonetype($skin, $newid, 'archivelist');\r
4615         $this->skinclonetype($skin, $newid, 'archive');\r
4616         $this->skinclonetype($skin, $newid, 'search');\r
4617         $this->skinclonetype($skin, $newid, 'error');\r
4618         $this->skinclonetype($skin, $newid, 'member');\r
4619         $this->skinclonetype($skin, $newid, 'imagepopup');\r
4620         */\r
4621 \r
4622         $query = "SELECT stype FROM " . sql_table('skin') . " WHERE sdesc = " . $skinid;\r
4623         $res = sql_query($query);\r
4624         while ($row = sql_fetch_assoc($res)) {\r
4625             $this->skinclonetype($skin, $newid, $row['stype']);\r
4626         }\r
4627 \r
4628         $this->action_skinoverview();\r
4629 \r
4630     }\r
4631 \r
4632     /**\r
4633      * @todo document this\r
4634      */\r
4635     function skinclonetype($skin, $newid, $type) {\r
4636         $newid = intval($newid);\r
4637         $content = $skin->getContent($type);\r
4638         if ($content) {\r
4639             $query = 'INSERT INTO '.sql_table('skin')." (sdesc, scontent, stype) VALUES ($newid,'". addslashes($content)."', '". addslashes($type)."')";\r
4640             sql_query($query);\r
4641         }\r
4642     }\r
4643 \r
4644     /**\r
4645      * @todo document this\r
4646      */\r
4647     function action_settingsedit() {\r
4648         global $member, $manager, $CONF, $DIR_NUCLEUS, $DIR_MEDIA;\r
4649 \r
4650         $member->isAdmin() or $this->disallow();\r
4651 \r
4652         $this->pagehead();\r
4653 \r
4654         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
4655         ?>\r
4656 \r
4657         <h2><?php echo _SETTINGS_TITLE?></h2>\r
4658 \r
4659         <form action="index.php" method="post">\r
4660         <div>\r
4661 \r
4662         <input type="hidden" name="action" value="settingsupdate" />\r
4663         <?php $manager->addTicketHidden() ?>\r
4664 \r
4665         <table><tr>\r
4666             <th colspan="2"><?php echo _SETTINGS_SUB_GENERAL?></th>\r
4667         </tr><tr>\r
4668             <td><?php echo _SETTINGS_DEFBLOG?> <?php help('defaultblog'); ?></td>\r
4669             <td>\r
4670                 <?php\r
4671                     $query =  'SELECT bname as text, bnumber as value'\r
4672                            . ' FROM '.sql_table('blog');\r
4673                     $template['name'] = 'DefaultBlog';\r
4674                     $template['selected'] = $CONF['DefaultBlog'];\r
4675                     $template['tabindex'] = 10;\r
4676                     showlist($query,'select',$template);\r
4677                 ?>\r
4678             </td>\r
4679         </tr><tr>\r
4680             <td><?php echo _SETTINGS_BASESKIN?> <?php help('baseskin'); ?></td>\r
4681             <td>\r
4682                 <?php\r
4683                     $query =  'SELECT sdname as text, sdnumber as value'\r
4684                            . ' FROM '.sql_table('skin_desc');\r
4685                     $template['name'] = 'BaseSkin';\r
4686                     $template['selected'] = $CONF['BaseSkin'];\r
4687                     $template['tabindex'] = 1;\r
4688                     showlist($query,'select',$template);\r
4689                 ?>\r
4690             </td>\r
4691         </tr><tr>\r
4692             <td><?php echo _SETTINGS_ADMINMAIL?></td>\r
4693             <td><input name="AdminEmail" tabindex="10010" size="40" value="<?php echo  htmlspecialchars($CONF['AdminEmail']) ?>" /></td>\r
4694         </tr><tr>\r
4695             <td><?php echo _SETTINGS_SITENAME?></td>\r
4696             <td><input name="SiteName" tabindex="10020" size="40" value="<?php echo  htmlspecialchars($CONF['SiteName']) ?>" /></td>\r
4697         </tr><tr>\r
4698             <td><?php echo _SETTINGS_SITEURL?></td>\r
4699             <td><input name="IndexURL" tabindex="10030" size="40" value="<?php echo  htmlspecialchars($CONF['IndexURL']) ?>" /></td>\r
4700         </tr><tr>\r
4701             <td><?php echo _SETTINGS_ADMINURL?></td>\r
4702             <td><input name="AdminURL" tabindex="10040" size="40" value="<?php echo  htmlspecialchars($CONF['AdminURL']) ?>" /></td>\r
4703         </tr><tr>\r
4704             <td><?php echo _SETTINGS_PLUGINURL?> <?php help('pluginurl');?></td>\r
4705             <td><input name="PluginURL" tabindex="10045" size="40" value="<?php echo  htmlspecialchars($CONF['PluginURL']) ?>" /></td>\r
4706         </tr><tr>\r
4707             <td><?php echo _SETTINGS_SKINSURL?> <?php help('skinsurl');?></td>\r
4708             <td><input name="SkinsURL" tabindex="10046" size="40" value="<?php echo  htmlspecialchars($CONF['SkinsURL']) ?>" /></td>\r
4709         </tr><tr>\r
4710             <td><?php echo _SETTINGS_ACTIONSURL?> <?php help('actionurl');?></td>\r
4711             <td><input name="ActionURL" tabindex="10047" size="40" value="<?php echo  htmlspecialchars($CONF['ActionURL']) ?>" /></td>\r
4712         </tr><tr>\r
4713             <td><?php echo _SETTINGS_LANGUAGE?> <?php help('language'); ?>\r
4714             </td>\r
4715             <td>\r
4716 \r
4717                 <select name="Language" tabindex="10050">\r
4718                 <?php               // show a dropdown list of all available languages\r
4719                 global $DIR_LANG;\r
4720                 $dirhandle = opendir($DIR_LANG);\r
4721                 while ($filename = readdir($dirhandle)) {\r
4722                     if (ereg("^(.*)\.php$",$filename,$matches)) {\r
4723                         $name = $matches[1];\r
4724                         echo "<option value='$name'";\r
4725                         if ($name == $CONF['Language'])\r
4726                             echo " selected='selected'";\r
4727                         echo ">$name</option>";\r
4728                     }\r
4729                 }\r
4730                 closedir($dirhandle);\r
4731 \r
4732                 ?>\r
4733                 </select>\r
4734 \r
4735             </td>\r
4736         </tr><tr>\r
4737             <td><?php echo _SETTINGS_DISABLESITE?> <?php help('disablesite'); ?>\r
4738             </td>\r
4739             <td><?php $this->input_yesno('DisableSite',$CONF['DisableSite'],10060); ?>\r
4740                     <br />\r
4741                 <?php echo _SETTINGS_DISABLESITEURL ?> <input name="DisableSiteURL" tabindex="10070" size="40" value="<?php echo  htmlspecialchars($CONF['DisableSiteURL'])?>" />\r
4742             </td>\r
4743         </tr><tr>\r
4744             <td><?php echo _SETTINGS_DIRS?></td>\r
4745             <td><?php echo  htmlspecialchars($DIR_NUCLEUS) ?>\r
4746                 <i><?php echo _SETTINGS_SEECONFIGPHP?></i></td>\r
4747         </tr><tr>\r
4748             <td><?php echo _SETTINGS_DBLOGIN?></td>\r
4749             <td><i><?php echo _SETTINGS_SEECONFIGPHP?></i></td>\r
4750         </tr><tr>\r
4751             <td>\r
4752             <?php\r
4753                 echo _SETTINGS_JSTOOLBAR\r
4754                 /* =_SETTINGS_DISABLEJS\r
4755 \r
4756                     I temporary changed the meaning of DisableJsTools, until I can find a good\r
4757                     way to select the javascript version to use\r
4758 \r
4759                     now, its:\r
4760                         0 : IE\r
4761                         1 : all javascript disabled\r
4762                         2 : 'simpler' javascript (for mozilla/opera/mac)\r
4763                 */\r
4764                ?>\r
4765             </td>\r
4766             <td><?php /* $this->input_yesno('DisableJsTools',$CONF['DisableJsTools'],10075); */?>\r
4767                 <select name="DisableJsTools" tabindex="10075">\r
4768             <?php                   $extra = ($CONF['DisableJsTools'] == 1) ? 'selected="selected"' : '';\r
4769                     echo "<option $extra value='1'>",_SETTINGS_JSTOOLBAR_NONE,"</option>";\r
4770                     $extra = ($CONF['DisableJsTools'] == 2) ? 'selected="selected"' : '';\r
4771                     echo "<option $extra value='2'>",_SETTINGS_JSTOOLBAR_SIMPLE,"</option>";\r
4772                     $extra = ($CONF['DisableJsTools'] == 0) ? 'selected="selected"' : '';\r
4773                     echo "<option $extra value='0'>",_SETTINGS_JSTOOLBAR_FULL,"</option>";\r
4774             ?>\r
4775                 </select>\r
4776             </td>\r
4777         </tr><tr>\r
4778             <td><?php echo _SETTINGS_URLMODE?> <?php help('urlmode');?></td>\r
4779                        <td><?php\r
4780 \r
4781                        $this->input_yesno('URLMode',$CONF['URLMode'],10077,\r
4782                               'normal','pathinfo',_SETTINGS_URLMODE_NORMAL,_SETTINGS_URLMODE_PATHINFO);\r
4783 \r
4784                        echo ' ', _SETTINGS_URLMODE_HELP;\r
4785 \r
4786                              ?>\r
4787 \r
4788                        </td>\r
4789         </tr><tr>\r
4790             <td><?php echo _SETTINGS_DEBUGVARS?> <?php help('debugvars');?></td>\r
4791                        <td><?php\r
4792 \r
4793                         $this->input_yesno('DebugVars',$CONF['DebugVars'],10078);\r
4794 \r
4795                              ?>\r
4796 \r
4797                        </td>\r
4798         </tr><tr>\r
4799             <td><?php echo _SETTINGS_DEFAULTLISTSIZE?> <?php help('defaultlistsize');?></td>\r
4800             <td>\r
4801             <?php\r
4802                 if (!array_key_exists('DefaultListSize',$CONF)) {\r
4803                     sql_query("INSERT INTO ".sql_table('config')." VALUES ('DefaultListSize', '10')");\r
4804                     $CONF['DefaultListSize'] = 10;\r
4805                 }\r
4806             ?>\r
4807                 <input name="DefaultListSize" tabindex="10079" size="40" value="<?php echo  htmlspecialchars((intval($CONF['DefaultListSize']) < 1 ? '10' : $CONF['DefaultListSize'])) ?>" />\r
4808             </td>\r
4809         </tr><tr>\r
4810             <th colspan="2"><?php echo _SETTINGS_MEDIA?> <?php help('media'); ?></th>\r
4811         </tr><tr>\r
4812             <td><?php echo _SETTINGS_MEDIADIR?></td>\r
4813             <td><?php echo  htmlspecialchars($DIR_MEDIA) ?>\r
4814                 <i><?php echo _SETTINGS_SEECONFIGPHP?></i>\r
4815                 <?php                   if (!is_dir($DIR_MEDIA))\r
4816                         echo "<br /><b>" . _WARNING_NOTADIR . "</b>";\r
4817                     if (!is_readable($DIR_MEDIA))\r
4818                         echo "<br /><b>" . _WARNING_NOTREADABLE . "</b>";\r
4819                     if (!is_writeable($DIR_MEDIA))\r
4820                         echo "<br /><b>" . _WARNING_NOTWRITABLE . "</b>";\r
4821                 ?>\r
4822             </td>\r
4823         </tr><tr>\r
4824             <td><?php echo _SETTINGS_MEDIAURL?></td>\r
4825             <td>\r
4826                 <input name="MediaURL" tabindex="10080" size="40" value="<?php echo  htmlspecialchars($CONF['MediaURL']) ?>" />\r
4827             </td>\r
4828         </tr><tr>\r
4829             <td><?php echo _SETTINGS_ALLOWUPLOAD?></td>\r
4830             <td><?php $this->input_yesno('AllowUpload',$CONF['AllowUpload'],10090); ?></td>\r
4831         </tr><tr>\r
4832             <td><?php echo _SETTINGS_ALLOWUPLOADTYPES?></td>\r
4833             <td>\r
4834                 <input name="AllowedTypes" tabindex="10100" size="40" value="<?php echo  htmlspecialchars($CONF['AllowedTypes']) ?>" />\r
4835             </td>\r
4836         </tr><tr>\r
4837             <td><?php echo _SETTINGS_MAXUPLOADSIZE?></td>\r
4838             <td>\r
4839                 <input name="MaxUploadSize" tabindex="10105" size="40" value="<?php echo  htmlspecialchars($CONF['MaxUploadSize']) ?>" />\r
4840             </td>\r
4841         </tr><tr>\r
4842             <td><?php echo _SETTINGS_MEDIAPREFIX?></td>\r
4843             <td><?php $this->input_yesno('MediaPrefix',$CONF['MediaPrefix'],10110); ?></td>\r
4844 \r
4845         </tr><tr>\r
4846             <th colspan="2"><?php echo _SETTINGS_MEMBERS?></th>\r
4847         </tr><tr>\r
4848             <td><?php echo _SETTINGS_CHANGELOGIN?></td>\r
4849             <td><?php $this->input_yesno('AllowLoginEdit',$CONF['AllowLoginEdit'],10120); ?></td>\r
4850         </tr><tr>\r
4851             <td><?php echo _SETTINGS_ALLOWCREATE?>\r
4852                 <?php help('allowaccountcreation'); ?>\r
4853             </td>\r
4854             <td><?php $this->input_yesno('AllowMemberCreate',$CONF['AllowMemberCreate'],10130); ?>\r
4855             </td>\r
4856         </tr><tr>\r
4857             <td><?php echo _SETTINGS_NEWLOGIN?> <?php help('allownewmemberlogin'); ?>\r
4858                 <br /><?php echo _SETTINGS_NEWLOGIN2?>\r
4859             </td>\r
4860             <td><?php $this->input_yesno('NewMemberCanLogon',$CONF['NewMemberCanLogon'],10140); ?>\r
4861             </td>\r
4862         </tr><tr>\r
4863             <td><?php echo _SETTINGS_MEMBERMSGS?>\r
4864                 <?php help('messageservice'); ?>\r
4865             </td>\r
4866             <td><?php $this->input_yesno('AllowMemberMail',$CONF['AllowMemberMail'],10150); ?>\r
4867             </td>\r
4868         </tr><tr>\r
4869             <td><?php echo _SETTINGS_NONMEMBERMSGS?>\r
4870                 <?php help('messageservice'); ?>\r
4871             </td>\r
4872             <td><?php $this->input_yesno('NonmemberMail',$CONF['NonmemberMail'],10155); ?>\r
4873             </td>\r
4874         </tr><tr>\r
4875             <td><?php echo _SETTINGS_PROTECTMEMNAMES?>\r
4876                 <?php help('protectmemnames'); ?>\r
4877             </td>\r
4878             <td><?php $this->input_yesno('ProtectMemNames',$CONF['ProtectMemNames'],10156); ?>\r
4879             </td>\r
4880 \r
4881 \r
4882 \r
4883         </tr><tr>\r
4884             <th colspan="2"><?php echo _SETTINGS_COOKIES_TITLE?> <?php help('cookies'); ?></th>\r
4885         </tr><tr>\r
4886             <td><?php echo _SETTINGS_COOKIEPREFIX?></td>\r
4887             <td><input name="CookiePrefix" tabindex="10159" size="40" value="<?php echo  htmlspecialchars($CONF['CookiePrefix'])?>" /></td>\r
4888         </tr><tr>\r
4889             <td><?php echo _SETTINGS_COOKIEDOMAIN?></td>\r
4890             <td><input name="CookieDomain" tabindex="10160" size="40" value="<?php echo  htmlspecialchars($CONF['CookieDomain'])?>" /></td>\r
4891         </tr><tr>\r
4892             <td><?php echo _SETTINGS_COOKIEPATH?></td>\r
4893             <td><input name="CookiePath" tabindex="10170" size="40" value="<?php echo  htmlspecialchars($CONF['CookiePath'])?>" /></td>\r
4894         </tr><tr>\r
4895             <td><?php echo _SETTINGS_COOKIESECURE?></td>\r
4896             <td><?php $this->input_yesno('CookieSecure',$CONF['CookieSecure'],10180); ?></td>\r
4897         </tr><tr>\r
4898             <td><?php echo _SETTINGS_COOKIELIFE?></td>\r
4899             <td><?php $this->input_yesno('SessionCookie',$CONF['SessionCookie'],10190,\r
4900                               1,0,_SETTINGS_COOKIESESSION,_SETTINGS_COOKIEMONTH); ?>\r
4901             </td>\r
4902         </tr><tr>\r
4903             <td><?php echo _SETTINGS_LASTVISIT?></td>\r
4904             <td><?php $this->input_yesno('LastVisit',$CONF['LastVisit'],10200); ?></td>\r
4905 \r
4906 \r
4907 \r
4908         </tr><tr>\r
4909             <th colspan="2"><?php echo _SETTINGS_UPDATE?></th>\r
4910         </tr><tr>\r
4911             <td><?php echo _SETTINGS_UPDATE?></td>\r
4912             <td><input type="submit" tabindex="10210" value="<?php echo _SETTINGS_UPDATE_BTN?>" onclick="return checkSubmit();" /></td>\r
4913         </tr></table>\r
4914 \r
4915         </div>\r
4916         </form>\r
4917 \r
4918         <?php\r
4919             echo '<h2>',_PLUGINS_EXTRA,'</h2>';\r
4920 \r
4921             $manager->notify(\r
4922                 'GeneralSettingsFormExtras',\r
4923                 array()\r
4924             );\r
4925 \r
4926         $this->pagefoot();\r
4927     }\r
4928 \r
4929     /**\r
4930      * @todo document this\r
4931      */\r
4932     function action_settingsupdate() {\r
4933         global $member, $CONF;\r
4934 \r
4935         $member->isAdmin() or $this->disallow();\r
4936 \r
4937         // check if email address for admin is valid\r
4938         if (!isValidMailAddress(postVar('AdminEmail')))\r
4939             $this->error(_ERROR_BADMAILADDRESS);\r
4940 \r
4941 \r
4942         // save settings\r
4943         $this->updateConfig('DefaultBlog',      postVar('DefaultBlog'));\r
4944         $this->updateConfig('BaseSkin',         postVar('BaseSkin'));\r
4945         $this->updateConfig('IndexURL',         postVar('IndexURL'));\r
4946         $this->updateConfig('AdminURL',         postVar('AdminURL'));\r
4947         $this->updateConfig('PluginURL',        postVar('PluginURL'));\r
4948         $this->updateConfig('SkinsURL',         postVar('SkinsURL'));\r
4949         $this->updateConfig('ActionURL',        postVar('ActionURL'));\r
4950         $this->updateConfig('Language',         postVar('Language'));\r
4951         $this->updateConfig('AdminEmail',       postVar('AdminEmail'));\r
4952         $this->updateConfig('SessionCookie',    postVar('SessionCookie'));\r
4953         $this->updateConfig('AllowMemberCreate',postVar('AllowMemberCreate'));\r
4954         $this->updateConfig('AllowMemberMail',  postVar('AllowMemberMail'));\r
4955         $this->updateConfig('NonmemberMail',    postVar('NonmemberMail'));\r
4956         $this->updateConfig('ProtectMemNames',  postVar('ProtectMemNames'));\r
4957         $this->updateConfig('SiteName',         postVar('SiteName'));\r
4958         $this->updateConfig('NewMemberCanLogon',postVar('NewMemberCanLogon'));\r
4959         $this->updateConfig('DisableSite',      postVar('DisableSite'));\r
4960         $this->updateConfig('DisableSiteURL',   postVar('DisableSiteURL'));\r
4961         $this->updateConfig('LastVisit',        postVar('LastVisit'));\r
4962         $this->updateConfig('MediaURL',         postVar('MediaURL'));\r
4963         $this->updateConfig('AllowedTypes',     postVar('AllowedTypes'));\r
4964         $this->updateConfig('AllowUpload',      postVar('AllowUpload'));\r
4965         $this->updateConfig('MaxUploadSize',    postVar('MaxUploadSize'));\r
4966         $this->updateConfig('MediaPrefix',      postVar('MediaPrefix'));\r
4967         $this->updateConfig('AllowLoginEdit',   postVar('AllowLoginEdit'));\r
4968         $this->updateConfig('DisableJsTools',   postVar('DisableJsTools'));\r
4969         $this->updateConfig('CookieDomain',     postVar('CookieDomain'));\r
4970         $this->updateConfig('CookiePath',       postVar('CookiePath'));\r
4971         $this->updateConfig('CookieSecure',     postVar('CookieSecure'));\r
4972         $this->updateConfig('URLMode',          postVar('URLMode'));\r
4973         $this->updateConfig('CookiePrefix',     postVar('CookiePrefix'));\r
4974         $this->updateConfig('DebugVars',        postVar('DebugVars'));\r
4975         $this->updateConfig('DefaultListSize',  postVar('DefaultListSize'));\r
4976 \r
4977         // load new config and redirect (this way, the new language will be used is necessary)\r
4978         // note that when changing cookie settings, this redirect might cause the user\r
4979         // to have to log in again.\r
4980         getConfig();\r
4981         redirect($CONF['AdminURL'] . '?action=manage');\r
4982         exit;\r
4983 \r
4984     }\r
4985 \r
4986     /**\r
4987      *  Give an overview over the used system\r
4988      */\r
4989     function action_systemoverview() {\r
4990         global $member, $nucleus, $CONF;\r
4991 \r
4992         $this->pagehead();\r
4993 \r
4994         echo '<h2>' . _ADMIN_SYSTEMOVERVIEW_HEADING . "</h2>\n";\r
4995 \r
4996         if ($member->isLoggedIn() && $member->isAdmin()) {\r
4997 \r
4998             // Information about the used PHP and MySQL installation\r
4999             echo '<h3>' . _ADMIN_SYSTEMOVERVIEW_PHPANDMYSQL . "</h3>\n";\r
5000 \r
5001             // Version of PHP MySQL\r
5002             echo "<table>\n";\r
5003             echo "\t<tr>\n";\r
5004             echo "\t\t" . '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_VERSIONS . "</th>\n";\r
5005             echo "\t</tr><tr>\n";\r
5006             echo "\t\t" . '<td width="50%">' . _ADMIN_SYSTEMOVERVIEW_PHPVERSION . "</td>\n";\r
5007             echo "\t\t" . '<td>' . phpversion() . "</td>\n";\r
5008             echo "\t</tr><tr>\n";\r
5009             echo "\t\t" . '<td>' . _ADMIN_SYSTEMOVERVIEW_MYSQLVERSION . "</td>\n";\r
5010             echo "\t\t" . '<td>' . sql_get_server_info() . ' (' . sql_get_client_info() . ')' . "</td>\n";\r
5011             echo "\t</tr>";\r
5012             echo "</table>\n";\r
5013 \r
5014             // Important PHP settings\r
5015             echo "<table>\n";\r
5016             echo "\t<tr>\n";\r
5017             echo "\t\t" . '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_SETTINGS . "</th>\n";\r
5018             echo "\t</tr><tr>\n";\r
5019             echo "\t\t" . '<td width="50%">magic_quotes_gpc' . "</td>\n";\r
5020             $mqg = get_magic_quotes_gpc() ? 'On' : 'Off';\r
5021             echo "\t\t" . '<td>' . $mqg . "</td>\n";\r
5022             echo "\t</tr><tr>\n";\r
5023             echo "\t\t" . '<td>magic_quotes_runtime' . "</td>\n";\r
5024             $mqr = get_magic_quotes_runtime() ? 'On' : 'Off';\r
5025             echo "\t\t" . '<td>' . $mqr . "</td>\n";\r
5026             echo "\t</tr><tr>\n";\r
5027             echo "\t\t" . '<td>register_globals' . "</td>\n";\r
5028             $rg = ini_get('register_globals') ? 'On' : 'Off';\r
5029             echo "\t\t" . '<td>' . $rg . "</td>\n";\r
5030             echo "\t</tr>";\r
5031             echo "</table>\n";\r
5032 \r
5033             // Information about GD library\r
5034             $gdinfo = gd_info();\r
5035             echo "<table>\n";\r
5036             echo "\t<tr>";\r
5037             echo "\t\t" . '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_GDLIBRALY . "</th>\n";\r
5038             echo "\t</tr>\n";\r
5039             foreach ($gdinfo as $key=>$value) {\r
5040                 if (is_bool($value)) {\r
5041                     $value = $value ? _ADMIN_SYSTEMOVERVIEW_ENABLE : _ADMIN_SYSTEMOVERVIEW_DISABLE;\r
5042                 } else {\r
5043                     $value = htmlspecialchars($value, ENT_QUOTES);\r
5044                 }\r
5045                 echo "\t<tr>";\r
5046                 echo "\t\t" . '<td width="50%">' . $key . "</td>\n";\r
5047                 echo "\t\t" . '<td>' . $value . "</td>\n";\r
5048                 echo "\t</tr>\n";\r
5049             }\r
5050             echo "</table>\n";\r
5051 \r
5052             // Check if special modules are loaded\r
5053             ob_start();\r
5054             phpinfo(INFO_MODULES);\r
5055             $im = ob_get_contents();\r
5056             ob_clean();\r
5057             echo "<table>\n";\r
5058             echo "\t<tr>";\r
5059             echo "\t\t" . '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_MODULES . "</th>\n";\r
5060             echo "\t</tr><tr>\n";\r
5061             echo "\t\t" . '<td width="50%">mod_rewrite' . "</td>\n";\r
5062             $modrewrite = (strstr($im, 'mod_rewrite') != '') ?\r
5063                         _ADMIN_SYSTEMOVERVIEW_ENABLE :\r
5064                         _ADMIN_SYSTEMOVERVIEW_DISABLE;\r
5065             echo "\t\t" . '<td>' . $modrewrite . "</td>\n";\r
5066             echo "\t</tr>\n";\r
5067             echo "</table>\n";\r
5068 \r
5069             // Information about the used Nucleus CMS\r
5070             echo '<h3>' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSSYSTEM . "</h3>\n";\r
5071             global $nucleus;\r
5072             $nv = getNucleusVersion() / 100 . '(' . $nucleus['version'] . ')';\r
5073             $np = getNucleusPatchLevel();\r
5074             echo "<table>\n";\r
5075             echo "\t<tr>";\r
5076             echo "\t\t" . '<th colspan="2">Nucleus CMS' . "</th>\n";\r
5077             echo "\t</tr><tr>\n";\r
5078             echo "\t\t" . '<td width="50%">' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSVERSION . "</td>\n";\r
5079             echo "\t\t" . '<td>' . $nv . "</td>\n";\r
5080             echo "\t</tr><tr>\n";\r
5081             echo "\t\t" . '<td width="50%">' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSPATCHLEVEL . "</td>\n";\r
5082             echo "\t\t" . '<td>' . $np . "</td>\n";\r
5083             echo "\t</tr>\n";\r
5084             echo "</table>\n";\r
5085 \r
5086             // Important settings of the installation\r
5087             echo "<table>\n";\r
5088             echo "\t<tr>";\r
5089             echo "\t\t" . '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSSETTINGS . "</th>\n";\r
5090             echo "\t</tr><tr>\n";\r
5091             echo "\t\t" . '<td width="50%">' . '$CONF[' . "'Self']</td>\n";\r
5092             echo "\t\t" . '<td>' . $CONF['Self'] . "</td>\n";\r
5093             echo "\t</tr><tr>\n";\r
5094             echo "\t\t" . '<td width="50%">' . '$CONF[' . "'ItemURL']</td>\n";\r
5095             echo "\t\t" . '<td>' . $CONF['ItemURL'] . "</td>\n";\r
5096             echo "\t</tr><tr>\n";\r
5097             echo "\t\t" . '<td width="50%">' . '$CONF[' . "'alertOnHeadersSent']</td>\n";\r
5098             $ohs = $CONF['alertOnHeadersSent'] ?\r
5099                         _ADMIN_SYSTEMOVERVIEW_ENABLE :\r
5100                         _ADMIN_SYSTEMOVERVIEW_DISABLE;\r
5101             echo "\t\t" . '<td>' . $ohs . "</td>\n";\r
5102             echo "\t</tr>\n";\r
5103             echo "</table>\n";\r
5104 \r
5105             // Link to the online version test at the Nucleus CMS website\r
5106             echo '<h3>' . _ADMIN_SYSTEMOVERVIEW_VERSIONCHECK . "</h3>\n";\r
5107             if ($nucleus['codename'] != '') {\r
5108                 $codenamestring = ' &quot;' . $nucleus['codename'] . '&quot;';\r
5109             } else {\r
5110                 $codenamestring = '';\r
5111             }\r
5112             echo _ADMIN_SYSTEMOVERVIEW_VERSIONCHECK_TXT;\r
5113             $checkURL = sprintf(_ADMIN_SYSTEMOVERVIEW_VERSIONCHECK_URL, getNucleusVersion(), getNucleusPatchLevel());\r
5114             echo '<a href="' . $checkURL . '" title="' . _ADMIN_SYSTEMOVERVIEW_VERSIONCHECK_TITLE . '">';\r
5115             echo 'Nucleus CMS ' . $nv . $codenamestring;\r
5116             echo '</a>';\r
5117         //echo '<br />';\r
5118         }\r
5119         else {\r
5120             echo _ADMIN_SYSTEMOVERVIEW_NOT_ADMIN;\r
5121         }\r
5122 \r
5123         $this->pagefoot();\r
5124     }\r
5125 \r
5126     /**\r
5127      * @todo document this\r
5128      */\r
5129     function updateConfig($name, $val) {\r
5130         $name = addslashes($name);\r
5131         $val = trim(addslashes($val));\r
5132 \r
5133         $query = 'UPDATE '.sql_table('config')\r
5134                . " SET value='$val'"\r
5135                . " WHERE name='$name'";\r
5136 \r
5137         sql_query($query) or die(_ADMIN_SQLDIE_QUERYERROR . sql_error());\r
5138         return sql_insert_id();\r
5139     }\r
5140 \r
5141     /**\r
5142      * Error message\r
5143      * @param string $msg message that will be shown\r
5144      */\r
5145     function error($msg) {\r
5146         $this->pagehead();\r
5147         ?>\r
5148         <h2>Error!</h2>\r
5149         <?php       echo $msg;\r
5150         echo "<br />";\r
5151         echo "<a href='index.php' onclick='history.back()'>"._BACK."</a>";\r
5152         $this->pagefoot();\r
5153         exit;\r
5154     }\r
5155 \r
5156     /**\r
5157      * @todo document this\r
5158      */\r
5159     function disallow() {\r
5160         ACTIONLOG::add(WARNING, _ACTIONLOG_DISALLOWED . serverVar('REQUEST_URI'));\r
5161 \r
5162         $this->error(_ERROR_DISALLOWED);\r
5163     }\r
5164 \r
5165     /**\r
5166      * @todo document this\r
5167      */\r
5168     function pagehead($extrahead = '') {\r
5169         global $member, $nucleus, $CONF, $manager;\r
5170 \r
5171         $manager->notify(\r
5172             'AdminPrePageHead',\r
5173             array(\r
5174                 'extrahead' => &$extrahead,\r
5175                 'action' => $this->action\r
5176             )\r
5177         );\r
5178 \r
5179         $baseUrl = htmlspecialchars($CONF['AdminURL']);\r
5180 \r
5181         ?>\r
5182         <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
5183         <html <?php echo _HTML_XML_NAME_SPACE_AND_LANG_CODE; ?>>\r
5184         <head>\r
5185             <meta http-equiv="Content-Type" content="text/html; charset=<?php echo _CHARSET ?>" />\r
5186             <title><?php echo htmlspecialchars($CONF['SiteName'])?> - Admin</title>\r
5187             <link rel="stylesheet" title="Nucleus Admin Default" type="text/css" href="<?php echo $baseUrl?>styles/admin.css" />\r
5188             <link rel="stylesheet" title="Nucleus Admin Default" type="text/css"\r
5189             href="<?php echo $baseUrl?>styles/addedit.css" />\r
5190 \r
5191             <script type="text/javascript" src="<?php echo $baseUrl?>javascript/edit.js"></script>\r
5192             <script type="text/javascript" src="<?php echo $baseUrl?>javascript/admin.js"></script>\r
5193             <script type="text/javascript" src="<?php echo $baseUrl?>javascript/compatibility.js"></script>\r
5194 \r
5195       <meta http-equiv='Pragma' content='no-cache' />\r
5196       <meta http-equiv='Cache-Control' content='no-cache, must-revalidate' />\r
5197       <meta http-equiv='Expires' content='-1' />\r
5198 \r
5199             <?php echo $extrahead?>\r
5200         </head>\r
5201         <body>\r
5202         <div id="adminwrapper">\r
5203         <div class="header">\r
5204         <h1><?php echo htmlspecialchars($CONF['SiteName'])?></h1>\r
5205         </div>\r
5206         <div id="container">\r
5207         <div id="content">\r
5208         <div class="loginname">\r
5209         <?php           if ($member->isLoggedIn())\r
5210                 echo _LOGGEDINAS . ' ' . $member->getDisplayName()\r
5211                     ." - <a href='index.php?action=logout'>" . _LOGOUT. "</a>"\r
5212                     . "<br /><a href='index.php?action=overview'>" . _ADMINHOME . "</a> - ";\r
5213             else\r
5214                 echo '<a href="index.php?action=showlogin" title="Log in">' , _NOTLOGGEDIN , '</a> <br />';\r
5215 \r
5216             echo "<a href='".$CONF['IndexURL']."'>"._YOURSITE."</a>";\r
5217 \r
5218             echo '<br />(';\r
5219 \r
5220             $codenamestring = ($nucleus['codename']!='')? ' &quot;'.$nucleus['codename'].'&quot;':'';\r
5221 \r
5222             if ($member->isLoggedIn() && $member->isAdmin()) {\r
5223                 $checkURL = sprintf(_ADMIN_SYSTEMOVERVIEW_VERSIONCHECK_URL, getNucleusVersion(), getNucleusPatchLevel());\r
5224                 echo '<a href="' . $checkURL . '" title="' . _ADMIN_SYSTEMOVERVIEW_VERSIONCHECK_TITLE . '">Nucleus CMS ' . $nucleus['version'] . $codenamestring . '</a>';\r
5225                 $newestVersion = getLatestVersion();\r
5226                 $newestCompare = str_replace('/','.',$newestVersion);\r
5227                 $currentVersion = str_replace(array('/','v'),array('.',''),$nucleus['version']);\r
5228                 if ($newestVersion && version_compare($newestCompare,$currentVersion) > 0) {\r
5229                     echo '<br /><a style="color:red" href="http://nucleuscms.org/upgrade.php" title="'._ADMIN_SYSTEMOVERVIEW_LATESTVERSION_TITLE.'">'._ADMIN_SYSTEMOVERVIEW_LATESTVERSION_TEXT.$newestVersion.'</a>';\r
5230                 }\r
5231             } else {\r
5232                 echo 'Nucleus CMS ' . $nucleus['version'] . $codenamestring;\r
5233             }\r
5234             echo ')';\r
5235         echo '</div>';\r
5236     }\r
5237 \r
5238     /**\r
5239      * @todo document this\r
5240      */\r
5241     function pagefoot() {\r
5242         global $action, $member, $manager;\r
5243 \r
5244         $manager->notify(\r
5245             'AdminPrePageFoot',\r
5246             array(\r
5247                 'action' => $this->action\r
5248             )\r
5249         );\r
5250 \r
5251         if ($member->isLoggedIn() && ($action != 'showlogin')) {\r
5252             ?>\r
5253             <h2><?php echo  _LOGOUT ?></h2>\r
5254             <ul>\r
5255                 <li><a href="index.php?action=overview"><?php echo  _BACKHOME?></a></li>\r
5256                 <li><a href='index.php?action=logout'><?php echo  _LOGOUT?></a></li>\r
5257             </ul>\r
5258             <?php       }\r
5259         ?>\r
5260             <div class="foot">\r
5261                 <a href="<?php echo _ADMINPAGEFOOT_OFFICIALURL ?>">Nucleus CMS</a> &copy; 2002-<?php echo date('Y') . ' ' . _ADMINPAGEFOOT_COPYRIGHT; ?>\r
5262                 -\r
5263                 <a href="<?php echo _ADMINPAGEFOOT_DONATEURL ?>"><?php echo _ADMINPAGEFOOT_DONATE ?></a>\r
5264             </div>\r
5265 \r
5266             </div><!-- content -->\r
5267 \r
5268             <div id="quickmenu">\r
5269 \r
5270                 <?php               // ---- user settings ----\r
5271                 if (($action != 'showlogin') && ($member->isLoggedIn())) {\r
5272                     echo '<ul>';\r
5273                     echo '<li><a href="index.php?action=overview">',_QMENU_HOME,'</a></li>';\r
5274                     echo '</ul>';\r
5275 \r
5276                     echo '<h2>',_QMENU_ADD,'</h2>';\r
5277                     echo '<form method="get" action="index.php"><div>';\r
5278                     echo '<input type="hidden" name="action" value="createitem" />';\r
5279 \r
5280                         $showAll = requestVar('showall');\r
5281                         if (($member->isAdmin()) && ($showAll == 'yes')) {\r
5282                             // Super-Admins have access to all blogs! (no add item support though)\r
5283                             $query =  'SELECT bnumber as value, bname as text'\r
5284                                    . ' FROM ' . sql_table('blog')\r
5285                                    . ' ORDER BY bname';\r
5286                         } else {\r
5287                             $query =  'SELECT bnumber as value, bname as text'\r
5288                                    . ' FROM ' . sql_table('blog') . ', ' . sql_table('team')\r
5289                                    . ' WHERE tblog=bnumber and tmember=' . $member->getID()\r
5290                                    . ' ORDER BY bname';\r
5291                         }\r
5292                         $template['name'] = 'blogid';\r
5293                         $template['tabindex'] = 15000;\r
5294                         $template['extra'] = _QMENU_ADD_SELECT;\r
5295                         $template['selected'] = -1;\r
5296                         $template['shorten'] = 10;\r
5297                         $template['shortenel'] = '';\r
5298                         $template['javascript'] = 'onchange="return form.submit()"';\r
5299                         showlist($query,'select',$template);\r
5300 \r
5301                     echo '</div></form>';\r
5302 \r
5303                     echo '<h2>' . $member->getDisplayName(). '</h2>';\r
5304                     echo '<ul>';\r
5305                     echo '<li><a href="index.php?action=editmembersettings">' . _QMENU_USER_SETTINGS . '</a></li>';\r
5306                     echo '<li><a href="index.php?action=browseownitems">' . _QMENU_USER_ITEMS . '</a></li>';\r
5307                     echo '<li><a href="index.php?action=browseowncomments">' . _QMENU_USER_COMMENTS . '</a></li>';\r
5308                     echo '</ul>';\r
5309 \r
5310 \r
5311 \r
5312 \r
5313                     // ---- general settings ----\r
5314                     if ($member->isAdmin()) {\r
5315 \r
5316                         echo '<h2>',_QMENU_MANAGE,'</h2>';\r
5317 \r
5318                         echo '<ul>';\r
5319                         echo '<li><a href="index.php?action=actionlog">' . _QMENU_MANAGE_LOG . '</a></li>';\r
5320                         echo '<li><a href="index.php?action=settingsedit">' . _QMENU_MANAGE_SETTINGS . '</a></li>';\r
5321                         echo '<li><a href="index.php?action=systemoverview">' . _QMENU_MANAGE_SYSTEM . '</a></li>';\r
5322                         echo '<li><a href="index.php?action=usermanagement">' . _QMENU_MANAGE_MEMBERS . '</a></li>';\r
5323                         echo '<li><a href="index.php?action=createnewlog">' . _QMENU_MANAGE_NEWBLOG . '</a></li>';\r
5324                         echo '<li><a href="index.php?action=backupoverview">' . _QMENU_MANAGE_BACKUPS . '</a></li>';\r
5325                         echo '<li><a href="index.php?action=pluginlist">' . _QMENU_MANAGE_PLUGINS . '</a></li>';\r
5326                         echo '</ul>';\r
5327 \r
5328                         echo '<h2>',_QMENU_LAYOUT,'</h2>';\r
5329                         echo '<ul>';\r
5330                         echo '<li><a href="index.php?action=skinoverview">' . _QMENU_LAYOUT_SKINS . '</a></li>';\r
5331                         echo '<li><a href="index.php?action=templateoverview">' . _QMENU_LAYOUT_TEMPL . '</a></li>';\r
5332                         echo '<li><a href="index.php?action=skinieoverview">' . _QMENU_LAYOUT_IEXPORT . '</a></li>';\r
5333                         echo '</ul>';\r
5334 \r
5335                     }\r
5336 \r
5337                     $aPluginExtras = array();\r
5338                     $manager->notify(\r
5339                         'QuickMenu',\r
5340                         array(\r
5341                             'options' => &$aPluginExtras\r
5342                         )\r
5343                     );\r
5344                     if (count($aPluginExtras) > 0)\r
5345                     {\r
5346                         echo '<h2>', _QMENU_PLUGINS, '</h2>';\r
5347                         echo '<ul>';\r
5348                         foreach ($aPluginExtras as $aInfo)\r
5349                         {\r
5350                             echo '<li><a href="'.htmlspecialchars($aInfo['url']).'" title="'.htmlspecialchars($aInfo['tooltip']).'">'.htmlspecialchars($aInfo['title']).'</a></li>';\r
5351                         }\r
5352                         echo '</ul>';\r
5353                     }\r
5354 \r
5355                 } else if (($action == 'activate') || ($action == 'activatesetpwd')) {\r
5356 \r
5357                     echo '<h2>', _QMENU_ACTIVATE, '</h2>', _QMENU_ACTIVATE_TEXT;\r
5358                 } else {\r
5359                     // introduction text on login screen\r
5360                     echo '<h2>', _QMENU_INTRO, '</h2>', _QMENU_INTRO_TEXT;\r
5361                 }\r
5362                 ?>\r
5363             </div>\r
5364 \r
5365             <!-- content / quickmenu container -->\r
5366             <div class="clear"></div>    <!-- new -->\r
5367             </div>\r
5368 \r
5369             <!-- adminwrapper -->    <!-- new -->\r
5370             </div>     <!-- new -->\r
5371             </body>\r
5372             </html>\r
5373         <?php   }\r
5374 \r
5375     /**\r
5376      * @todo document this\r
5377      */\r
5378     function action_regfile() {\r
5379         global $member, $CONF;\r
5380 \r
5381         $blogid = intRequestVar('blogid');\r
5382 \r
5383         $member->teamRights($blogid) or $this->disallow();\r
5384 \r
5385         // header-code stolen from phpMyAdmin\r
5386         // REGEDIT and bookmarklet code stolen from GreyMatter\r
5387 \r
5388         $sjisBlogName = sprintf(_WINREGFILE_TEXT, getBlogNameFromID($blogid));\r
5389         $sjisBlogName = mb_convert_encoding($sjisBlogName, "SJIS", "auto");\r
5390 \r
5391         header('Content-Type: application/octetstream');\r
5392         header('Content-Disposition: filename="nucleus.reg"');\r
5393         header('Pragma: no-cache');\r
5394         header('Expires: 0');\r
5395 \r
5396         echo "REGEDIT4\n";\r
5397         echo "[HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\MenuExt\\" . $sjisBlogName . "]\n";\r
5398         echo '@="' . $CONF['AdminURL'] . "bookmarklet.php?action=contextmenucode&blogid=".intval($blogid)."\"\n";\r
5399         echo '"contexts"=hex:31';\r
5400     }\r
5401 \r
5402     /**\r
5403      * @todo document this\r
5404      */\r
5405     function action_bookmarklet() {\r
5406         global $member, $manager;\r
5407 \r
5408         $blogid = intRequestVar('blogid');\r
5409 \r
5410         $member->teamRights($blogid) or $this->disallow();\r
5411 \r
5412         $blog =& $manager->getBlog($blogid);\r
5413         $bm = getBookmarklet($blogid);\r
5414 \r
5415         $this->pagehead();\r
5416 \r
5417         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';\r
5418 \r
5419         ?>\r
5420 \r
5421         <h2><?php echo _BOOKMARKLET_TITLE ?></h2>\r
5422 \r
5423         <p>\r
5424         <?php echo _BOOKMARKLET_DESC1 . _BOOKMARKLET_DESC2 . _BOOKMARKLET_DESC3 . _BOOKMARKLET_DESC4 . _BOOKMARKLET_DESC5 ?>\r
5425         </p>\r
5426 \r
5427         <h3><?php echo _BOOKMARKLET_BOOKARKLET ?></h3>\r
5428         <p>\r
5429             <?php echo _BOOKMARKLET_BMARKTEXT ?><small><?php echo _BOOKMARKLET_BMARKTEST ?></small>\r
5430             <br />\r
5431             <br />\r
5432             <?php echo '<a href="' . htmlspecialchars($bm, ENT_QUOTES) . '">' . sprintf(_BOOKMARKLET_ANCHOR, htmlspecialchars($blog->getName(), ENT_QUOTES)) . '</a>' . _BOOKMARKLET_BMARKFOLLOW; ?>\r
5433         </p>\r
5434 \r
5435         <h3><?php echo _BOOKMARKLET_RIGHTCLICK ?></h3>\r
5436         <p>\r
5437             <?php\r
5438                 $url = 'index.php?action=regfile&blogid=' . intval($blogid);\r
5439                 $url = $manager->addTicketToUrl($url);\r
5440             ?>\r
5441             <?php echo _BOOKMARKLET_RIGHTTEXT1 . '<a href="' . htmlspecialchars($url, ENT_QUOTES, "SJIS") . '">' . _BOOKMARKLET_RIGHTLABEL . '</a>' . _BOOKMARKLET_RIGHTTEXT2; ?>\r
5442         </p>\r
5443 \r
5444         <p>\r
5445             <?php echo _BOOKMARKLET_RIGHTTEXT3 ?>\r
5446         </p>\r
5447 \r
5448         <h3><?php echo _BOOKMARKLET_UNINSTALLTT ?></h3>\r
5449         <p>\r
5450             <?php echo _BOOKMARKLET_DELETEBAR ?>\r
5451         </p>\r
5452 \r
5453         <p>\r
5454             <?php echo _BOOKMARKLET_DELETERIGHTT ?>\r
5455         </p>\r
5456 \r
5457         <ol>\r
5458             <li><?php echo _BOOKMARKLET_DELETERIGHT1 ?></li>\r
5459             <li><?php echo _BOOKMARKLET_DELETERIGHT2 ?></li>\r
5460             <li><?php echo _BOOKMARKLET_DELETERIGHT3 ?></li>\r
5461             <li><?php echo _BOOKMARKLET_DELETERIGHT4 ?></li>\r
5462             <li><?php echo _BOOKMARKLET_DELETERIGHT5 ?></li>\r
5463         </ol>\r
5464 \r
5465         <?php\r
5466         $this->pagefoot();\r
5467 \r
5468     }\r
5469 \r
5470     /**\r
5471      * @todo document this\r
5472      */\r
5473     function action_actionlog() {\r
5474         global $member, $manager;\r
5475 \r
5476         $member->isAdmin() or $this->disallow();\r
5477 \r
5478         $this->pagehead();\r
5479 \r
5480         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
5481 \r
5482         $url = $manager->addTicketToUrl('index.php?action=clearactionlog');\r
5483 \r
5484         ?>\r
5485             <h2><?php echo _ACTIONLOG_CLEAR_TITLE?></h2>\r
5486             <p><a href="<?php echo htmlspecialchars($url)?>"><?php echo _ACTIONLOG_CLEAR_TEXT?></a></p>\r
5487         <?php\r
5488         echo '<h2>' . _ACTIONLOG_TITLE . '</h2>';\r
5489 \r
5490         $query =  'SELECT * FROM '.sql_table('actionlog').' ORDER BY timestamp DESC';\r
5491         $template['content'] = 'actionlist';\r
5492         $amount = showlist($query,'table',$template);\r
5493 \r
5494         $this->pagefoot();\r
5495 \r
5496     }\r
5497 \r
5498     /**\r
5499      * @todo document this\r
5500      */\r
5501     function action_banlist() {\r
5502         global $member, $manager;\r
5503 \r
5504         $blogid = intRequestVar('blogid');\r
5505 \r
5506         $member->blogAdminRights($blogid) or $this->disallow();\r
5507 \r
5508         $blog =& $manager->getBlog($blogid);\r
5509 \r
5510         $this->pagehead();\r
5511 \r
5512         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';\r
5513 \r
5514         echo '<h2>' . _BAN_TITLE . " '". $this->bloglink($blog) ."'</h2>";\r
5515 \r
5516         $query =  'SELECT * FROM '.sql_table('ban').' WHERE blogid='.$blogid.' ORDER BY iprange';\r
5517         $template['content'] = 'banlist';\r
5518         $amount = showlist($query,'table',$template);\r
5519 \r
5520         if ($amount == 0)\r
5521             echo _BAN_NONE;\r
5522 \r
5523         echo '<h2>'._BAN_NEW_TITLE.'</h2>';\r
5524         echo "<p><a href='index.php?action=banlistnew&amp;blogid=$blogid'>"._BAN_NEW_TEXT."</a></p>";\r
5525 \r
5526 \r
5527         $this->pagefoot();\r
5528 \r
5529     }\r
5530 \r
5531     /**\r
5532      * @todo document this\r
5533      */\r
5534     function action_banlistdelete() {\r
5535         global $member, $manager;\r
5536 \r
5537         $blogid = intRequestVar('blogid');\r
5538         $iprange = requestVar('iprange');\r
5539 \r
5540         $member->blogAdminRights($blogid) or $this->disallow();\r
5541 \r
5542         $blog =& $manager->getBlog($blogid);\r
5543         $banBlogName =  htmlspecialchars($blog->getName(), ENT_QUOTES);\r
5544 \r
5545         $this->pagehead();\r
5546         ?>\r
5547             <h2><?php echo _BAN_REMOVE_TITLE?></h2>\r
5548 \r
5549             <form method="post" action="index.php">\r
5550 \r
5551             <h3><?php echo _BAN_IPRANGE?></h3>\r
5552 \r
5553             <p>\r
5554                 <?php echo _CONFIRMTXT_BAN?> <?php echo htmlspecialchars($iprange) ?>\r
5555                 <input name="iprange" type="hidden" value="<?php echo htmlspecialchars($iprange)?>" />\r
5556             </p>\r
5557 \r
5558             <h3><?php echo _BAN_BLOGS?></h3>\r
5559 \r
5560             <div>\r
5561                 <input type="hidden" name="blogid" value="<?php echo $blogid?>" />\r
5562                 <input name="allblogs" type="radio" value="0" id="allblogs_one" />\r
5563                 <label for="allblogs_one"><?php echo sprintf(_BAN_BANBLOGNAME, $banBlogName) ?></label>\r
5564                 <br />\r
5565                 <input name="allblogs" type="radio" value="1" checked="checked" id="allblogs_all" /><label for="allblogs_all"><?php echo _BAN_ALLBLOGS?></label>\r
5566             </div>\r
5567 \r
5568             <h3><?php echo _BAN_DELETE_TITLE?></h3>\r
5569 \r
5570             <div>\r
5571                 <?php $manager->addTicketHidden() ?>\r
5572                 <input type="hidden" name="action" value="banlistdeleteconfirm" />\r
5573                 <input type="submit" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
5574             </div>\r
5575 \r
5576             </form>\r
5577         <?php\r
5578         $this->pagefoot();\r
5579     }\r
5580 \r
5581     /**\r
5582      * @todo document this\r
5583      */\r
5584     function action_banlistdeleteconfirm() {\r
5585         global $member, $manager;\r
5586 \r
5587         $blogid = intPostVar('blogid');\r
5588         $allblogs = postVar('allblogs');\r
5589         $iprange = postVar('iprange');\r
5590 \r
5591         $member->blogAdminRights($blogid) or $this->disallow();\r
5592 \r
5593         $deleted = array();\r
5594 \r
5595         if (!$allblogs) {\r
5596             if (BAN::removeBan($blogid, $iprange))\r
5597                 array_push($deleted, $blogid);\r
5598         } else {\r
5599             // get blogs fot which member has admin rights\r
5600             $adminblogs = $member->getAdminBlogs();\r
5601             foreach ($adminblogs as $blogje) {\r
5602                 if (BAN::removeBan($blogje, $iprange))\r
5603                     array_push($deleted, $blogje);\r
5604             }\r
5605         }\r
5606 \r
5607         if (sizeof($deleted) == 0)\r
5608             $this->error(_ERROR_DELETEBAN);\r
5609 \r
5610         $this->pagehead();\r
5611 \r
5612         echo '<a href="index.php?action=banlist&amp;blogid=',$blogid,'">(',_BACK,')</a>';\r
5613         echo '<h2>'._BAN_REMOVED_TITLE.'</h2>';\r
5614         echo "<p>"._BAN_REMOVED_TEXT."</p>";\r
5615 \r
5616         echo "<ul>";\r
5617         foreach ($deleted as $delblog) {\r
5618             $b =& $manager->getBlog($delblog);\r
5619             echo "<li>" . htmlspecialchars($b->getName()). "</li>";\r
5620         }\r
5621         echo "</ul>";\r
5622 \r
5623         $this->pagefoot();\r
5624 \r
5625     }\r
5626 \r
5627     /**\r
5628      * @todo document this\r
5629      */\r
5630     function action_banlistnewfromitem() {\r
5631         $this->action_banlistnew(getBlogIDFromItemID(intRequestVar('itemid')));\r
5632     }\r
5633 \r
5634     /**\r
5635      * @todo document this\r
5636      */\r
5637     function action_banlistnew($blogid = '') {\r
5638         global $member, $manager;\r
5639 \r
5640         if ($blogid == '')\r
5641             $blogid = intRequestVar('blogid');\r
5642 \r
5643         $ip = requestVar('ip');\r
5644 \r
5645         $member->blogAdminRights($blogid) or $this->disallow();\r
5646 \r
5647         $blog =& $manager->getBlog($blogid);\r
5648 \r
5649         $this->pagehead();\r
5650         ?>\r
5651         <h2><?php echo _BAN_ADD_TITLE?></h2>\r
5652 \r
5653 \r
5654         <form method="post" action="index.php">\r
5655 \r
5656         <h3><?php echo _BAN_IPRANGE?></h3>\r
5657 \r
5658         <p><?php echo _BAN_IPRANGE_TEXT?></p>\r
5659 \r
5660         <div class="note">\r
5661             <strong><?php echo _BAN_EXAMPLE_TITLE ?></strong>\r
5662             <?php echo _BAN_EXAMPLE_TEXT ?>\r
5663         </div>\r
5664 \r
5665         <div>\r
5666         <?php\r
5667         if ($ip) {\r
5668             $iprangeVal = htmlspecialchars($ip, ENT_QUOTES);\r
5669         ?>\r
5670             <input name="iprange" type="radio" value="<?php echo $iprangeVal ?>" checked="checked" id="ip_fixed" />\r
5671             <label for="ip_fixed"><?php echo $iprangeVal ?></label>\r
5672             <br />\r
5673             <input name="iprange" type="radio" value="custom" id="ip_custom" />\r
5674             <label for="ip_custom"><?php echo _BAN_IP_CUSTOM ?></label>\r
5675             <input name='customiprange' value='<?php echo $iprangeVal ?>' maxlength='15' size='15' />\r
5676         <?php\r
5677         } else {\r
5678                 echo "<input name='iprange' value='custom' type='hidden' />";\r
5679                 echo "<input name='customiprange' value='' maxlength='15' size='15' />";\r
5680             }\r
5681         ?>\r
5682         </div>\r
5683 \r
5684         <h3><?php echo _BAN_BLOGS?></h3>\r
5685 \r
5686         <p><?php echo _BAN_BLOGS_TEXT?></p>\r
5687 \r
5688         <div>\r
5689             <input type="hidden" name="blogid" value="<?php echo $blogid?>" />\r
5690             <input name="allblogs" type="radio" value="0" id="allblogs_one" /><label for="allblogs_one">'<?php echo htmlspecialchars($blog->getName())?>'</label>\r
5691             <br />\r
5692             <input name="allblogs" type="radio" value="1" checked="checked" id="allblogs_all" /><label for="allblogs_all"><?php echo _BAN_ALLBLOGS?></label>\r
5693         </div>\r
5694 \r
5695         <h3><?php echo _BAN_REASON_TITLE?></h3>\r
5696 \r
5697         <p><?php echo _BAN_REASON_TEXT?></p>\r
5698 \r
5699         <div><textarea name="reason" cols="40" rows="5"></textarea></div>\r
5700 \r
5701         <h3><?php echo _BAN_ADD_TITLE?></h3>\r
5702 \r
5703         <div>\r
5704             <input name="action" type="hidden" value="banlistadd" />\r
5705             <?php $manager->addTicketHidden() ?>\r
5706             <input type="submit" value="<?php echo _BAN_ADD_BTN?>" />\r
5707         </div>\r
5708 \r
5709         </form>\r
5710 \r
5711         <?php       $this->pagefoot();\r
5712     }\r
5713 \r
5714     /**\r
5715      * @todo document this\r
5716      */\r
5717     function action_banlistadd() {\r
5718         global $member;\r
5719 \r
5720         $blogid =       intPostVar('blogid');\r
5721         $allblogs =     postVar('allblogs');\r
5722         $iprange =      postVar('iprange');\r
5723         if ($iprange == "custom")\r
5724             $iprange = postVar('customiprange');\r
5725         $reason =       postVar('reason');\r
5726 \r
5727         $member->blogAdminRights($blogid) or $this->disallow();\r
5728 \r
5729         // TODO: check IP range validity\r
5730 \r
5731         if (!$allblogs) {\r
5732             if (!BAN::addBan($blogid, $iprange, $reason))\r
5733                 $this->error(_ERROR_ADDBAN);\r
5734         } else {\r
5735             // get blogs fot which member has admin rights\r
5736             $adminblogs = $member->getAdminBlogs();\r
5737             $failed = 0;\r
5738             foreach ($adminblogs as $blogje) {\r
5739                 if (!BAN::addBan($blogje, $iprange, $reason))\r
5740                     $failed = 1;\r
5741             }\r
5742             if ($failed)\r
5743                 $this->error(_ERROR_ADDBAN);\r
5744         }\r
5745 \r
5746         $this->action_banlist();\r
5747 \r
5748     }\r
5749 \r
5750     /**\r
5751      * @todo document this\r
5752      */\r
5753     function action_clearactionlog() {\r
5754         global $member;\r
5755 \r
5756         $member->isAdmin() or $this->disallow();\r
5757 \r
5758         ACTIONLOG::clear();\r
5759 \r
5760         $this->action_manage(_MSG_ACTIONLOGCLEARED);\r
5761     }\r
5762 \r
5763     /**\r
5764      * @todo document this\r
5765      */\r
5766     function action_backupoverview() {\r
5767         global $member, $manager;\r
5768 \r
5769         $member->isAdmin() or $this->disallow();\r
5770 \r
5771         $this->pagehead();\r
5772 \r
5773         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
5774         ?>\r
5775         <h2><?php echo _BACKUPS_TITLE?></h2>\r
5776 \r
5777         <h3><?php echo _BACKUP_TITLE?></h3>\r
5778 \r
5779         <p><?php echo _BACKUP_INTRO?></p>\r
5780 \r
5781         <form method="post" action="index.php"><p>\r
5782         <input type="hidden" name="action" value="backupcreate" />\r
5783         <?php $manager->addTicketHidden() ?>\r
5784 \r
5785         <input type="radio" name="gzip" value="1" checked="checked" id="gzip_yes" tabindex="10" /><label for="gzip_yes"><?php echo _BACKUP_ZIP_YES?></label>\r
5786         <br />\r
5787         <input type="radio" name="gzip" value="0" id="gzip_no" tabindex="10" /><label for="gzip_no" ><?php echo _BACKUP_ZIP_NO?></label>\r
5788         <br /><br />\r
5789         <input type="submit" value="<?php echo _BACKUP_BTN?>" tabindex="20" />\r
5790 \r
5791         </p></form>\r
5792 \r
5793         <div class="note"><?php echo _BACKUP_NOTE?></div>\r
5794 \r
5795 \r
5796         <h3><?php echo _RESTORE_TITLE?></h3>\r
5797 \r
5798         <div class="note"><?php echo _RESTORE_NOTE?></div>\r
5799 \r
5800         <p><?php echo _RESTORE_INTRO?></p>\r
5801 \r
5802         <form method="post" action="index.php" enctype="multipart/form-data"><p>\r
5803             <input type="hidden" name="action" value="backuprestore" />\r
5804             <?php $manager->addTicketHidden() ?>\r
5805             <input name="backup_file" type="file" tabindex="30" />\r
5806             <br /><br />\r
5807             <input type="submit" value="<?php echo _RESTORE_BTN?>" tabindex="40" />\r
5808             <br /><input type="checkbox" name="letsgo" value="1" id="letsgo" tabindex="50" /><label for="letsgo"><?php echo _RESTORE_IMSURE?></label>\r
5809             <br /><?php echo _RESTORE_WARNING?>\r
5810         </p></form>\r
5811 \r
5812         <?php       $this->pagefoot();\r
5813     }\r
5814 \r
5815     /**\r
5816      * @todo document this\r
5817      */\r
5818     function action_backupcreate() {\r
5819         global $member, $DIR_LIBS;\r
5820 \r
5821         $member->isAdmin() or $this->disallow();\r
5822 \r
5823         // use compression ?\r
5824         $useGzip = intval(postVar('gzip'));\r
5825 \r
5826         include($DIR_LIBS . 'backup.php');\r
5827 \r
5828         // try to extend time limit\r
5829         // (creating/restoring dumps might take a while)\r
5830         @set_time_limit(1200);\r
5831 \r
5832         $bu = new Backup();\r
5833         $bu->do_backup($useGzip);\r
5834         exit;\r
5835     }\r
5836 \r
5837     /**\r
5838      * @todo document this\r
5839      */\r
5840     function action_backuprestore() {\r
5841         global $member, $DIR_LIBS;\r
5842 \r
5843         $member->isAdmin() or $this->disallow();\r
5844 \r
5845         if (intPostVar('letsgo') != 1)\r
5846             $this->error(_ERROR_BACKUP_NOTSURE);\r
5847 \r
5848         include($DIR_LIBS . 'backup.php');\r
5849 \r
5850         // try to extend time limit\r
5851         // (creating/restoring dumps might take a while)\r
5852         @set_time_limit(1200);\r
5853 \r
5854         $bu = new Backup();\r
5855         $message = $bu->do_restore();\r
5856         if ($message != '')\r
5857             $this->error($message);\r
5858 \r
5859         $this->pagehead();\r
5860         ?>\r
5861         <h2><?php echo _RESTORE_COMPLETE?></h2>\r
5862         <?php       $this->pagefoot();\r
5863 \r
5864     }\r
5865 \r
5866     /**\r
5867      * @todo document this\r
5868      */\r
5869     function action_pluginlist() {\r
5870         global $member, $manager;\r
5871 \r
5872         // check if allowed\r
5873         $member->isAdmin() or $this->disallow();\r
5874 \r
5875         $this->pagehead();\r
5876 \r
5877         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';\r
5878 \r
5879         echo '<h2>' , _PLUGS_TITLE_MANAGE , ' ', help('plugins'), '</h2>';\r
5880 \r
5881         echo '<h3>' , _PLUGS_TITLE_INSTALLED , ' &nbsp;&nbsp;<span style="font-size:smaller">', helplink('getplugins'), _PLUGS_TITLE_GETPLUGINS, '</a></span></h3>';\r
5882 \r
5883 \r
5884         $query =  'SELECT * FROM '.sql_table('plugin').' ORDER BY porder ASC';\r
5885 \r
5886         $template['content'] = 'pluginlist';\r
5887         $template['tabindex'] = 10;\r
5888         showlist($query, 'table', $template);\r
5889 \r
5890         ?>\r
5891             <h3><?php echo _PLUGS_TITLE_UPDATE?></h3>\r
5892 \r
5893             <p><?php echo _PLUGS_TEXT_UPDATE?></p>\r
5894 \r
5895             <form method="post" action="index.php"><div>\r
5896                 <input type="hidden" name="action" value="pluginupdate" />\r
5897                 <?php $manager->addTicketHidden() ?>\r
5898                 <input type="submit" value="<?php echo _PLUGS_BTN_UPDATE ?>" tabindex="20" />\r
5899             </div></form>\r
5900 \r
5901             <h3><?php echo _PLUGS_TITLE_NEW?></h3>\r
5902 \r
5903             <?php               // find a list of possibly non-installed plugins\r
5904                 $candidates = array();\r
5905                 global $DIR_PLUGINS;\r
5906                 $dirhandle = opendir($DIR_PLUGINS);\r
5907                 while ($filename = readdir($dirhandle)) {\r
5908                     if (ereg('^NP_(.*)\.php$',$filename,$matches)) {\r
5909                         $name = $matches[1];\r
5910                         // only show in list when not yet installed\r
5911                         $res = sql_query('SELECT * FROM '.sql_table('plugin').' WHERE pfile="NP_'.addslashes($name).'"');\r
5912                         if (sql_num_rows($res) == 0)\r
5913                             array_push($candidates,$name);\r
5914                     }\r
5915                 }\r
5916                 closedir($dirhandle);\r
5917 \r
5918                 if (sizeof($candidates) > 0) {\r
5919             ?>\r
5920 \r
5921             <p><?php echo _PLUGS_ADD_TEXT?></p>\r
5922 \r
5923 \r
5924             <form method='post' action='index.php'><div>\r
5925                 <input type='hidden' name='action' value='pluginadd' />\r
5926                 <?php $manager->addTicketHidden() ?>\r
5927                 <select name="filename" tabindex="30">\r
5928                 <?php                   foreach($candidates as $name)\r
5929                         echo '<option value="NP_',$name,'">',htmlspecialchars($name),'</option>';\r
5930                 ?>\r
5931                 </select>\r
5932                 <input type='submit' tabindex="40" value='<?php echo _PLUGS_BTN_INSTALL?>' />\r
5933             </div></form>\r
5934 \r
5935         <?php           } else {    // sizeof(candidates) == 0\r
5936                 echo '<p>',_PLUGS_NOCANDIDATES,'</p>';\r
5937             }\r
5938 \r
5939         $this->pagefoot();\r
5940     }\r
5941 \r
5942     /**\r
5943      * @todo document this\r
5944      */\r
5945     function action_pluginhelp() {\r
5946         global $member, $manager, $DIR_PLUGINS, $CONF;\r
5947 \r
5948         // check if allowed\r
5949         $member->isAdmin() or $this->disallow();\r
5950 \r
5951         $plugid = intGetVar('plugid');\r
5952 \r
5953         if (!$manager->pidInstalled($plugid))\r
5954             $this->error(_ERROR_NOSUCHPLUGIN);\r
5955 \r
5956         $plugName = getPluginNameFromPid($plugid);\r
5957 \r
5958         $this->pagehead();\r
5959 \r
5960         echo '<p><a href="index.php?action=pluginlist">(',_PLUGS_BACK,')</a></p>';\r
5961 \r
5962         echo '<h2>',_PLUGS_HELP_TITLE,': ',htmlspecialchars($plugName),'</h2>';\r
5963 \r
5964         $plug =& $manager->getPlugin($plugName);\r
5965         $helpFile = $DIR_PLUGINS.$plug->getShortName().'/help.html';\r
5966 \r
5967         if (($plug->supportsFeature('HelpPage') > 0) && (@file_exists($helpFile))) {\r
5968             @readfile($helpFile);\r
5969         } else {\r
5970             echo '<p>' . _ERROR .': ', _ERROR_PLUGNOHELPFILE,'</p>';\r
5971             echo '<p><a href="index.php?action=pluginlist">(',_BACK,')</a></p>';\r
5972         }\r
5973 \r
5974 \r
5975         $this->pagefoot();\r
5976     }\r
5977 \r
5978     /**\r
5979      * @todo document this\r
5980      */\r
5981     function action_pluginadd() {\r
5982         global $member, $manager, $DIR_PLUGINS;\r
5983 \r
5984         // check if allowed\r
5985         $member->isAdmin() or $this->disallow();\r
5986 \r
5987         $name = postVar('filename');\r
5988 \r
5989         if ($manager->pluginInstalled($name))\r
5990             $this->error(_ERROR_DUPPLUGIN);\r
5991         if (!checkPlugin($name))\r
5992             $this->error(_ERROR_PLUGFILEERROR . ' (' . htmlspecialchars($name) . ')');\r
5993 \r
5994         // get number of currently installed plugins\r
5995         $res = sql_query('SELECT * FROM '.sql_table('plugin'));\r
5996         $numCurrent = sql_num_rows($res);\r
5997 \r
5998         // plugin will be added as last one in the list\r
5999         $newOrder = $numCurrent + 1;\r
6000 \r
6001         $manager->notify(\r
6002             'PreAddPlugin',\r
6003             array(\r
6004                 'file' => &$name\r
6005             )\r
6006         );\r
6007 \r
6008         // do this before calling getPlugin (in case the plugin id is used there)\r
6009         $query = 'INSERT INTO '.sql_table('plugin').' (porder, pfile) VALUES ('.$newOrder.',"'.addslashes($name).'")';\r
6010         sql_query($query);\r
6011         $iPid = sql_insert_id();\r
6012 \r
6013         $manager->clearCachedInfo('installedPlugins');\r
6014 \r
6015         // Load the plugin for condition checking and instalation\r
6016         $plugin =& $manager->getPlugin($name);\r
6017 \r
6018         // check if it got loaded (could have failed)\r
6019         if (!$plugin)\r
6020         {\r
6021             sql_query('DELETE FROM ' . sql_table('plugin') . ' WHERE pid='. intval($iPid));\r
6022             $manager->clearCachedInfo('installedPlugins');\r
6023             $this->error(_ERROR_PLUGIN_LOAD);\r
6024         }\r
6025 \r
6026         // check if plugin needs a newer Nucleus version\r
6027         if (getNucleusVersion() < $plugin->getMinNucleusVersion())\r
6028         {\r
6029             // uninstall plugin again...\r
6030             $this->deleteOnePlugin($plugin->getID());\r
6031 \r
6032             // ...and show error\r
6033             $this->error(_ERROR_NUCLEUSVERSIONREQ . htmlspecialchars($plugin->getMinNucleusVersion()));\r
6034         }\r
6035 \r
6036         // check if plugin needs a newer Nucleus version\r
6037         if ((getNucleusVersion() == $plugin->getMinNucleusVersion()) && (getNucleusPatchLevel() < $plugin->getMinNucleusPatchLevel()))\r
6038         {\r
6039             // uninstall plugin again...\r
6040             $this->deleteOnePlugin($plugin->getID());\r
6041 \r
6042             // ...and show error\r
6043             $this->error(_ERROR_NUCLEUSVERSIONREQ . htmlspecialchars( $plugin->getMinNucleusVersion() . ' patch ' . $plugin->getMinNucleusPatchLevel() ) );\r
6044         }\r
6045 \r
6046         $pluginList = $plugin->getPluginDep();\r
6047         foreach ($pluginList as $pluginName)\r
6048         {\r
6049 \r
6050             $res = sql_query('SELECT * FROM '.sql_table('plugin') . ' WHERE pfile="' . $pluginName . '"');\r
6051             if (sql_num_rows($res) == 0)\r
6052             {\r
6053                 // uninstall plugin again...\r
6054                 $this->deleteOnePlugin($plugin->getID());\r
6055 \r
6056                 $this->error(sprintf(_ERROR_INSREQPLUGIN, htmlspecialchars($pluginName, ENT_QUOTES)));\r
6057             }\r
6058         }\r
6059 \r
6060         // call the install method of the plugin\r
6061         $plugin->install();\r
6062 \r
6063         $manager->notify(\r
6064             'PostAddPlugin',\r
6065             array(\r
6066                 'plugin' => &$plugin\r
6067             )\r
6068         );\r
6069 \r
6070         // update all events\r
6071         $this->action_pluginupdate();\r
6072     }\r
6073 \r
6074     /**\r
6075      * @todo document this\r
6076      */\r
6077     function action_pluginupdate() {\r
6078         global $member, $manager, $CONF;\r
6079 \r
6080         // check if allowed\r
6081         $member->isAdmin() or $this->disallow();\r
6082 \r
6083         // delete everything from plugin_events\r
6084         sql_query('DELETE FROM '.sql_table('plugin_event'));\r
6085 \r
6086         // loop over all installed plugins\r
6087         $res = sql_query('SELECT pid, pfile FROM '.sql_table('plugin'));\r
6088         while($o = sql_fetch_object($res)) {\r
6089             $pid = $o->pid;\r
6090             $plug =& $manager->getPlugin($o->pfile);\r
6091             if ($plug)\r
6092             {\r
6093                 $eventList = $plug->getEventList();\r
6094                 foreach ($eventList as $eventName)\r
6095                     sql_query('INSERT INTO '.sql_table('plugin_event').' (pid, event) VALUES ('.$pid.', \''.addslashes($eventName).'\')');\r
6096             }\r
6097         }\r
6098 \r
6099         redirect($CONF['AdminURL'] . '?action=pluginlist');\r
6100 //              $this->action_pluginlist();\r
6101     }\r
6102 \r
6103     /**\r
6104      * @todo document this\r
6105      */\r
6106     function action_plugindelete() {\r
6107         global $member, $manager;\r
6108 \r
6109         // check if allowed\r
6110         $member->isAdmin() or $this->disallow();\r
6111 \r
6112         $pid = intGetVar('plugid');\r
6113 \r
6114         if (!$manager->pidInstalled($pid))\r
6115             $this->error(_ERROR_NOSUCHPLUGIN);\r
6116 \r
6117         $this->pagehead();\r
6118         ?>\r
6119             <h2><?php echo _DELETE_CONFIRM?></h2>\r
6120 \r
6121             <p><?php echo _CONFIRMTXT_PLUGIN?> <strong><?php echo getPluginNameFromPid($pid)?></strong>?</p>\r
6122 \r
6123             <form method="post" action="index.php"><div>\r
6124             <?php $manager->addTicketHidden() ?>\r
6125             <input type="hidden" name="action" value="plugindeleteconfirm" />\r
6126             <input type="hidden" name="plugid" value="<?php echo $pid; ?>" />\r
6127             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN?>" />\r
6128             </div></form>\r
6129         <?php\r
6130         $this->pagefoot();\r
6131     }\r
6132 \r
6133     /**\r
6134      * @todo document this\r
6135      */\r
6136     function action_plugindeleteconfirm() {\r
6137         global $member, $manager, $CONF;\r
6138 \r
6139         // check if allowed\r
6140         $member->isAdmin() or $this->disallow();\r
6141 \r
6142         $pid = intPostVar('plugid');\r
6143 \r
6144         $error = $this->deleteOnePlugin($pid, 1);\r
6145         if ($error) {\r
6146             $this->error($error);\r
6147         }\r
6148 \r
6149         redirect($CONF['AdminURL'] . '?action=pluginlist');\r
6150 //              $this->action_pluginlist();\r
6151     }\r
6152 \r
6153     /**\r
6154      * @todo document this\r
6155      */\r
6156     function deleteOnePlugin($pid, $callUninstall = 0) {\r
6157         global $manager;\r
6158 \r
6159         $pid = intval($pid);\r
6160 \r
6161         if (!$manager->pidInstalled($pid))\r
6162             return _ERROR_NOSUCHPLUGIN;\r
6163 \r
6164         $name = quickQuery('SELECT pfile as result FROM '.sql_table('plugin').' WHERE pid='.$pid);\r
6165 \r
6166 /*              // call the unInstall method of the plugin\r
6167         if ($callUninstall) {\r
6168             $plugin =& $manager->getPlugin($name);\r
6169             if ($plugin) $plugin->unInstall();\r
6170         }*/\r
6171 \r
6172         // check dependency before delete\r
6173         $res = sql_query('SELECT pfile FROM '.sql_table('plugin'));\r
6174         while($o = sql_fetch_object($res)) {\r
6175             $plug =& $manager->getPlugin($o->pfile);\r
6176             if ($plug)\r
6177             {\r
6178                 $depList = $plug->getPluginDep();\r
6179                 foreach ($depList as $depName)\r
6180                 {\r
6181                     if ($name == $depName)\r
6182                     {\r
6183                         return sprintf(_ERROR_DELREQPLUGIN, $o->pfile);\r
6184                     }\r
6185                 }\r
6186             }\r
6187         }\r
6188 \r
6189         $manager->notify('PreDeletePlugin', array('plugid' => $pid));\r
6190 \r
6191         // call the unInstall method of the plugin\r
6192         if ($callUninstall) {\r
6193             $plugin =& $manager->getPlugin($name);\r
6194             if ($plugin) $plugin->unInstall();\r
6195         }\r
6196 \r
6197         // delete all subscriptions\r
6198         sql_query('DELETE FROM '.sql_table('plugin_event').' WHERE pid=' . $pid);\r
6199 \r
6200         // delete all options\r
6201         // get OIDs from plugin_option_desc\r
6202         $res = sql_query('SELECT oid FROM ' . sql_table('plugin_option_desc') . ' WHERE opid=' . $pid);\r
6203         $aOIDs = array();\r
6204         while ($o = sql_fetch_object($res)) {\r
6205             array_push($aOIDs, $o->oid);\r
6206         }\r
6207 \r
6208         // delete from plugin_option and plugin_option_desc\r
6209         sql_query('DELETE FROM '.sql_table('plugin_option_desc').' WHERE opid=' . $pid);\r
6210         if (count($aOIDs) > 0)\r
6211             sql_query('DELETE FROM '.sql_table('plugin_option').' WHERE oid in ('.implode(',',$aOIDs).')');\r
6212 \r
6213         // update order numbers\r
6214         $res = sql_query('SELECT porder FROM '.sql_table('plugin').' WHERE pid=' . $pid);\r
6215         $o = sql_fetch_object($res);\r
6216         sql_query('UPDATE '.sql_table('plugin').' SET porder=(porder - 1) WHERE porder>'.$o->porder);\r
6217 \r
6218         // delete row\r
6219         sql_query('DELETE FROM '.sql_table('plugin').' WHERE pid='.$pid);\r
6220 \r
6221         $manager->clearCachedInfo('installedPlugins');\r
6222         $manager->notify('PostDeletePlugin', array('plugid' => $pid));\r
6223 \r
6224         return '';\r
6225     }\r
6226 \r
6227     /**\r
6228      * @todo document this\r
6229      */\r
6230     function action_pluginup() {\r
6231         global $member, $manager, $CONF;\r
6232 \r
6233         // check if allowed\r
6234         $member->isAdmin() or $this->disallow();\r
6235 \r
6236         $plugid = intGetVar('plugid');\r
6237 \r
6238         if (!$manager->pidInstalled($plugid))\r
6239             $this->error(_ERROR_NOSUCHPLUGIN);\r
6240 \r
6241         // 1. get old order number\r
6242         $res = sql_query('SELECT porder FROM '.sql_table('plugin').' WHERE pid='.$plugid);\r
6243         $o = sql_fetch_object($res);\r
6244         $oldOrder = $o->porder;\r
6245 \r
6246         // 2. calculate new order number\r
6247         $newOrder = ($oldOrder > 1) ? ($oldOrder - 1) : 1;\r
6248 \r
6249         // 3. update plug numbers\r
6250         sql_query('UPDATE '.sql_table('plugin').' SET porder='.$oldOrder.' WHERE porder='.$newOrder);\r
6251         sql_query('UPDATE '.sql_table('plugin').' SET porder='.$newOrder.' WHERE pid='.$plugid);\r
6252 \r
6253         //$this->action_pluginlist();\r
6254         // To avoid showing ticket in the URL, redirect to pluginlist, instead.\r
6255         redirect($CONF['AdminURL'] . '?action=pluginlist');\r
6256     }\r
6257 \r
6258     /**\r
6259      * @todo document this\r
6260      */\r
6261     function action_plugindown() {\r
6262         global $member, $manager, $CONF;\r
6263 \r
6264         // check if allowed\r
6265         $member->isAdmin() or $this->disallow();\r
6266 \r
6267         $plugid = intGetVar('plugid');\r
6268         if (!$manager->pidInstalled($plugid))\r
6269             $this->error(_ERROR_NOSUCHPLUGIN);\r
6270 \r
6271         // 1. get old order number\r
6272         $res = sql_query('SELECT porder FROM '.sql_table('plugin').' WHERE pid='.$plugid);\r
6273         $o = sql_fetch_object($res);\r
6274         $oldOrder = $o->porder;\r
6275 \r
6276         $res = sql_query('SELECT * FROM '.sql_table('plugin'));\r
6277         $maxOrder = sql_num_rows($res);\r
6278 \r
6279         // 2. calculate new order number\r
6280         $newOrder = ($oldOrder < $maxOrder) ? ($oldOrder + 1) : $maxOrder;\r
6281 \r
6282         // 3. update plug numbers\r
6283         sql_query('UPDATE '.sql_table('plugin').' SET porder='.$oldOrder.' WHERE porder='.$newOrder);\r
6284         sql_query('UPDATE '.sql_table('plugin').' SET porder='.$newOrder.' WHERE pid='.$plugid);\r
6285 \r
6286         //$this->action_pluginlist();\r
6287         // To avoid showing ticket in the URL, redirect to pluginlist, instead.\r
6288         redirect($CONF['AdminURL'] . '?action=pluginlist');\r
6289     }\r
6290 \r
6291     /**\r
6292      * @todo document this\r
6293      */\r
6294     function action_pluginoptions($message = '') {\r
6295         global $member, $manager;\r
6296 \r
6297         // check if allowed\r
6298         $member->isAdmin() or $this->disallow();\r
6299 \r
6300         $pid = intRequestVar('plugid');\r
6301         if (!$manager->pidInstalled($pid))\r
6302             $this->error(_ERROR_NOSUCHPLUGIN);\r
6303 \r
6304         $extrahead = '<script type="text/javascript" src="javascript/numbercheck.js"></script>';\r
6305         $pluginName = htmlspecialchars(getPluginNameFromPid($pid), ENT_QUOTES);\r
6306         $this->pagehead($extrahead);\r
6307 \r
6308         ?>\r
6309             <p><a href="index.php?action=pluginlist">(<?php echo _PLUGS_BACK?>)</a></p>\r
6310 \r
6311             <h2><?php echo sprintf(_PLUGIN_OPTIONS_TITLE, $pluginName) ?></h2>\r
6312 \r
6313             <?php if  ($message) echo $message?>\r
6314 \r
6315             <form action="index.php" method="post">\r
6316             <div>\r
6317                 <input type="hidden" name="action" value="pluginoptionsupdate" />\r
6318                 <input type="hidden" name="plugid" value="<?php echo $pid?>" />\r
6319 \r
6320         <?php\r
6321 \r
6322         $manager->addTicketHidden();\r
6323 \r
6324         $aOptions = array();\r
6325         $aOIDs = array();\r
6326         $query = 'SELECT * FROM ' . sql_table('plugin_option_desc') . ' WHERE ocontext=\'global\' and opid=' . $pid . ' ORDER BY oid ASC';\r
6327         $r = sql_query($query);\r
6328         while ($o = sql_fetch_object($r)) {\r
6329             array_push($aOIDs, $o->oid);\r
6330             $aOptions[$o->oid] = array(\r
6331                         'oid' => $o->oid,\r
6332                         'value' => $o->odef,\r
6333                         'name' => $o->oname,\r
6334                         'description' => $o->odesc,\r
6335                         'type' => $o->otype,\r
6336                         'typeinfo' => $o->oextra,\r
6337                         'contextid' => 0\r
6338             );\r
6339         }\r
6340         // fill out actual values\r
6341         if (count($aOIDs) > 0) {\r
6342             $r = sql_query('SELECT oid, ovalue FROM ' . sql_table('plugin_option') . ' WHERE oid in ('.implode(',',$aOIDs).')');\r
6343             while ($o = sql_fetch_object($r))\r
6344                 $aOptions[$o->oid]['value'] = $o->ovalue;\r
6345         }\r
6346 \r
6347         // call plugins\r
6348         $manager->notify('PrePluginOptionsEdit',array('context' => 'global', 'plugid' => $pid, 'options'=>&$aOptions));\r
6349 \r
6350         $template['content'] = 'plugoptionlist';\r
6351         $amount = showlist($aOptions,'table',$template);\r
6352         if ($amount == 0)\r
6353             echo '<p>',_ERROR_NOPLUGOPTIONS,'</p>';\r
6354 \r
6355         ?>\r
6356             </div>\r
6357             </form>\r
6358         <?php       $this->pagefoot();\r
6359 \r
6360 \r
6361 \r
6362     }\r
6363 \r
6364     /**\r
6365      * @todo document this\r
6366      */\r
6367     function action_pluginoptionsupdate() {\r
6368         global $member, $manager;\r
6369 \r
6370         // check if allowed\r
6371         $member->isAdmin() or $this->disallow();\r
6372 \r
6373         $pid = intRequestVar('plugid');\r
6374         if (!$manager->pidInstalled($pid))\r
6375             $this->error(_ERROR_NOSUCHPLUGIN);\r
6376 \r
6377         $aOptions = requestArray('plugoption');\r
6378         NucleusPlugin::_applyPluginOptions($aOptions);\r
6379 \r
6380         $manager->notify('PostPluginOptionsUpdate',array('context' => 'global', 'plugid' => $pid));\r
6381 \r
6382         $this->action_pluginoptions(_PLUGS_OPTIONS_UPDATED);\r
6383     }\r
6384 \r
6385     /**\r
6386      * @static\r
6387      * @todo document this\r
6388      */\r
6389     function _insertPluginOptions($context, $contextid = 0) {\r
6390         // get all current values for this contextid\r
6391         // (note: this might contain doubles for overlapping contextids)\r
6392         $aIdToValue = array();\r
6393         $res = sql_query('SELECT oid, ovalue FROM ' . sql_table('plugin_option') . ' WHERE ocontextid=' . intval($contextid));\r
6394         while ($o = sql_fetch_object($res)) {\r
6395             $aIdToValue[$o->oid] = $o->ovalue;\r
6396         }\r
6397 \r
6398         // get list of oids per pid\r
6399         $query = 'SELECT * FROM ' . sql_table('plugin_option_desc') . ',' . sql_table('plugin')\r
6400                . ' WHERE opid=pid and ocontext=\''.addslashes($context).'\' ORDER BY porder, oid ASC';\r
6401         $res = sql_query($query);\r
6402         $aOptions = array();\r
6403         while ($o = sql_fetch_object($res)) {\r
6404             if (in_array($o->oid, array_keys($aIdToValue)))\r
6405                 $value = $aIdToValue[$o->oid];\r
6406             else\r
6407                 $value = $o->odef;\r
6408 \r
6409             array_push($aOptions, array(\r
6410                 'pid' => $o->pid,\r
6411                 'pfile' => $o->pfile,\r
6412                 'oid' => $o->oid,\r
6413                 'value' => $value,\r
6414                 'name' => $o->oname,\r
6415                 'description' => $o->odesc,\r
6416                 'type' => $o->otype,\r
6417                 'typeinfo' => $o->oextra,\r
6418                 'contextid' => $contextid,\r
6419                 'extra' => ''\r
6420             ));\r
6421         }\r
6422 \r
6423         global $manager;\r
6424         $manager->notify('PrePluginOptionsEdit',array('context' => $context, 'contextid' => $contextid, 'options'=>&$aOptions));\r
6425 \r
6426 \r
6427         $iPrevPid = -1;\r
6428         foreach ($aOptions as $aOption) {\r
6429 \r
6430             // new plugin?\r
6431             if ($iPrevPid != $aOption['pid']) {\r
6432                 $iPrevPid = $aOption['pid'];\r
6433 \r
6434 \r
6435 \r
6436                 echo '<tr><th colspan="2">'.sprintf(_PLUGIN_OPTIONS_TITLE, htmlspecialchars($aOption['pfile'], ENT_QUOTES)).'</th></tr>';\r
6437             }\r
6438 \r
6439             $meta = NucleusPlugin::getOptionMeta($aOption['typeinfo']);\r
6440             if (@$meta['access'] != 'hidden') {\r
6441                 echo '<tr>';\r
6442                 listplug_plugOptionRow($aOption);\r
6443                 echo '</tr>';\r
6444             }\r
6445 \r
6446         }\r
6447 \r
6448 \r
6449     }\r
6450 \r
6451     /**\r
6452      * Helper functions to create option forms etc.\r
6453      * @todo document parameters\r
6454      */\r
6455     function input_yesno($name, $checkedval,$tabindex = 0, $value1 = 1, $value2 = 0, $yesval = _YES, $noval = _NO, $isAdmin = 0) {\r
6456         $id = htmlspecialchars($name);\r
6457         $id = str_replace('[','-',$id);\r
6458         $id = str_replace(']','-',$id);\r
6459         $id1 = $id . htmlspecialchars($value1);\r
6460         $id2 = $id . htmlspecialchars($value2);\r
6461 \r
6462         if ($name=="admin") {\r
6463             echo '<input onclick="selectCanLogin(true);" type="radio" name="', htmlspecialchars($name),'" value="', htmlspecialchars($value1),'" ';\r
6464         } else {\r
6465             echo '<input type="radio" name="', htmlspecialchars($name),'" value="', htmlspecialchars($value1),'" ';\r
6466         }\r
6467 \r
6468             if ($checkedval == $value1)\r
6469                 echo "tabindex='$tabindex' checked='checked'";\r
6470             echo ' id="'.$id1.'" /><label for="'.$id1.'">' . $yesval . '</label>';\r
6471         echo ' ';\r
6472         if ($name=="admin") {\r
6473             echo '<input onclick="selectCanLogin(false);" type="radio" name="', htmlspecialchars($name),'" value="', htmlspecialchars($value2),'" ';\r
6474         } else {\r
6475             echo '<input type="radio" name="', htmlspecialchars($name),'" value="', htmlspecialchars($value2),'" ';\r
6476         }\r
6477             if ($checkedval != $value1)\r
6478                 echo "tabindex='$tabindex' checked='checked'";\r
6479             if ($isAdmin && $name=="canlogin")\r
6480                 echo ' disabled="disabled"';\r
6481             echo ' id="'.$id2.'" /><label for="'.$id2.'">' . $noval . '</label>';\r
6482     }\r
6483 \r
6484 } // class ADMIN\r
6485 \r
6486 ?>