OSDN Git Service

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