OSDN Git Service

91b4ca4d95948b0562501823a32b4bff555c5f3d
[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         $manager->notify('PreDeleteCategory', array('catid' => $catid));\r
2820 \r
2821         $blogid = getBlogIDFromCatID($catid);\r
2822 \r
2823         if (!$member->blogAdminRights($blogid))\r
2824             return ERROR_DISALLOWED;\r
2825 \r
2826         // get blog\r
2827         $blog =& $manager->getBlog($blogid);\r
2828 \r
2829         // check if the category is valid\r
2830         if (!$blog || !$blog->isValidCategory($catid))\r
2831             return _ERROR_NOSUCHCATEGORY;\r
2832 \r
2833         $destcatid = $blog->getDefaultCategory();\r
2834 \r
2835         // don't allow deletion of default category\r
2836         if ($blog->getDefaultCategory() == $catid)\r
2837             return _ERROR_DELETEDEFCATEGORY;\r
2838 \r
2839         // check if catid is the only category left for blogid\r
2840         $query = 'SELECT catid FROM '.sql_table('category').' WHERE cblog=' . $blogid;\r
2841         $res = sql_query($query);\r
2842         if (sql_num_rows($res) == 1)\r
2843             return _ERROR_DELETELASTCATEGORY;\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