OSDN Git Service

Merge branch 'skinnable-master'
[nucleus-jp/nucleus-next.git] / nucleus / libs / ADMIN.php
1 <?php
2 /**
3  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
4  * Copyright (C) 2002-2009 The Nucleus Group
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  * (see nucleus/documentation/index.html#license for more info)
11  */
12 /**
13  * The code for the Nucleus admin area
14  *
15  * @license http://nucleuscms.org/license.txt GNU General Public License
16  * @copyright Copyright (C) 2002-2009 The Nucleus Group
17  * @version $Id: ADMIN.php 1661 2012-02-12 11:55:39Z sakamocchi $
18  */
19
20 if ( !function_exists('requestVar') ) exit;
21 require_once dirname(__FILE__) . '/showlist.php';
22
23 class Admin
24 {
25 <<<<<<< HEAD
26         private $xml_version_info = '1.0';
27         private $formal_public_identifier = '-//W3C//DTD XHTML 1.0 Strict//EN';
28         private $system_identifier = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd';
29         private $xhtml_namespace = 'http://www.w3.org/1999/xhtml';
30         
31     /**
32      * @var string $action action currently being executed ($action=xxxx -> action_xxxx method)
33      */
34     var $action;
35
36     /**
37      * Class constructor
38      */
39     function ADMIN() {
40
41     }
42
43     /**
44      * Executes an action
45      *
46      * @param string $action action to be performed
47      */
48     function action($action) {
49         global $CONF, $manager;
50
51         // list of action aliases
52         $alias = array(
53             'login' => 'overview',
54             '' => 'overview'
55         );
56
57         if (isset($alias[$action]))
58             $action = $alias[$action];
59
60         $methodName = 'action_' . $action;
61
62         $this->action = strtolower($action);
63
64         // check ticket. All actions need a ticket, unless they are considered to be safe (a safe action
65         // is an action that requires user interaction before something is actually done)
66         // all safe actions are in this array:
67         $aActionsNotToCheck = array(
68             'showlogin',
69             'login',
70             'overview',
71             'itemlist',
72             'blogcommentlist',
73             'bookmarklet',
74             'blogsettings',
75             'banlist',
76             'deleteblog',
77             'editmembersettings',
78             'browseownitems',
79             'browseowncomments',
80             'createitem',
81             'itemedit',
82             'itemmove',
83             'categoryedit',
84             'categorydelete',
85             'manage',
86             'actionlog',
87             'settingsedit',
88             'backupoverview',
89             'pluginlist',
90             'createnewlog',
91             'usermanagement',
92             'skinoverview',
93             'templateoverview',
94             'skinieoverview',
95             'itemcommentlist',
96             'commentedit',
97             'commentdelete',
98             'banlistnewfromitem',
99             'banlistdelete',
100             'itemdelete',
101             'manageteam',
102             'teamdelete',
103             'banlistnew',
104             'memberedit',
105             'memberdelete',
106             'pluginhelp',
107             'pluginoptions',
108             'plugindelete',
109             'skinedittype',
110             'skinremovetype',
111             'skindelete',
112             'skinedit',
113             'templateedit',
114             'templatedelete',
115             'activate',
116             'systemoverview'
117         );
118 /*
119         // the rest of the actions needs to be checked
120         $aActionsToCheck = array('additem', 'itemupdate', 'itemmoveto', 'categoryupdate', 'categorydeleteconfirm', 'itemdeleteconfirm', 'commentdeleteconfirm', 'teamdeleteconfirm', 'memberdeleteconfirm', 'templatedeleteconfirm', 'skindeleteconfirm', 'banlistdeleteconfirm', 'plugindeleteconfirm', 'batchitem', 'batchcomment', 'batchmember', 'batchcategory', 'batchteam', 'commentupdate', 'banlistadd', 'changemembersettings', 'clearactionlog', 'settingsupdate', 'blogsettingsupdate', 'categorynew', 'teamchangeadmin', 'teamaddmember', 'memberadd', 'addnewlog', 'addnewlog2', 'backupcreate', 'backuprestore', 'pluginup', 'plugindown', 'pluginupdate', 'pluginadd', 'pluginoptionsupdate', 'skinupdate', 'skinclone', 'skineditgeneral', 'templateclone', 'templatenew', 'templateupdate', 'skinieimport', 'skinieexport', 'skiniedoimport', 'skinnew', 'deleteblogconfirm', 'activatesetpwd');
121 */
122         if (!in_array($this->action, $aActionsNotToCheck))
123         {
124             if (!$manager->checkTicket())
125                 $this->error(_ERROR_BADTICKET);
126         }
127
128         if (method_exists($this, $methodName))
129             call_user_func(array(&$this, $methodName));
130         else
131             $this->error(_BADACTION . Entity::hsc(" ($action)"));
132
133     }
134
135     /**
136      * @todo document this
137      */
138     function action_showlogin() {
139         global $error;
140         $this->action_login($error);
141     }
142
143     /**
144      * @todo document this
145      */
146     function action_login($msg = '', $passvars = 1) {
147         global $member;
148
149         // skip to overview when allowed
150         if ($member->isLoggedIn() && $member->canLogin()) {
151             $this->action_overview();
152             exit;
153         }
154
155         $this->pagehead();
156
157         echo '<h2>', _LOGIN ,'</h2>';
158         if ($msg) echo _MESSAGE , ': ', Entity::hsc($msg);
159         ?>
160
161         <form action="index.php" method="post"><p>
162         <?php echo _LOGIN_NAME; ?> <br /><input name="login"  tabindex="10" />
163         <br />
164         <?php echo _LOGIN_PASSWORD; ?> <br /><input name="password"  tabindex="20" type="password" />
165         <br />
166         <input name="action" value="login" type="hidden" />
167         <br />
168         <input type="submit" value="<?php echo _LOGIN ?>" tabindex="30" />
169         <br />
170         <small>
171             <input type="checkbox" value="1" name="shared" tabindex="40" id="shared" /><label for="shared"><?php echo _LOGIN_SHARED ?></label>
172             <br /><a href="forgotpassword.html"><?php echo _LOGIN_FORGOT ?></a>
173         </small>
174         <?php           // pass through vars
175
176             $oldaction = postVar('oldaction');
177             if (  ($oldaction != 'logout')  && ($oldaction != 'login')  && $passvars ) {
178                 passRequestVars();
179             }
180
181
182         ?>
183         </p></form>
184         <?php       $this->pagefoot();
185     }
186
187
188     /**
189      * provides a screen with the overview of the actions available
190      * @todo document parameter
191      */
192     function action_overview($msg = '') {
193         global $member;
194
195         $this->pagehead();
196
197         if ($msg)
198             echo _MESSAGE , ': ', $msg;
199
200         /* ---- add items ---- */
201         echo '<h2>' . _OVERVIEW_YRBLOGS . '</h2>';
202
203         $showAll = requestVar('showall');
204
205         if (($member->isAdmin()) && ($showAll == 'yes')) {
206             // Super-Admins have access to all blogs! (no add item support though)
207             $query =  'SELECT bnumber, bname, 1 as tadmin, burl, bshortname'
208                    . ' FROM ' . sql_table('blog')
209                    . ' ORDER BY bname';
210         } else {
211             $query =  'SELECT bnumber, bname, tadmin, burl, bshortname'
212                    . ' FROM ' . sql_table('blog') . ', ' . sql_table('team')
213                    . ' WHERE tblog=bnumber and tmember=' . $member->getID()
214                    . ' ORDER BY bname';
215         }
216         $template['content'] = 'bloglist';
217         $template['superadmin'] = $member->isAdmin();
218         $amount = showlist($query,'table',$template);
219
220         if (($showAll != 'yes') && ($member->isAdmin())) {
221             $total = DB::getValue('SELECT COUNT(*) as result FROM ' . sql_table('blog'));
222             if ($total > $amount)
223                 echo '<p><a href="index.php?action=overview&amp;showall=yes">' . _OVERVIEW_SHOWALL . '</a></p>';
224         }
225
226         if ($amount == 0)
227             echo _OVERVIEW_NOBLOGS;
228
229         if ($amount != 0) {
230             echo '<h2>' . _OVERVIEW_YRDRAFTS . '</h2>';
231             $query =  'SELECT ititle, inumber, bshortname'
232                    . ' FROM ' . sql_table('item'). ', ' . sql_table('blog')
233                    . ' WHERE iauthor='.$member->getID().' and iblog=bnumber and idraft=1';
234             $template['content'] = 'draftlist';
235             $amountdrafts = showlist($query, 'table', $template);
236             if ($amountdrafts == 0)
237                 echo _OVERVIEW_NODRAFTS;
238         }
239                                 
240                 if ($amount != 0) {
241                         $yrBlogs = $member->getAdminBlogs();
242                         if ($showAll != 'yes') {
243                                 $admBlogs = array();
244                                 foreach ($yrBlogs as $value) {
245                                         if ($member->isBlogAdmin(intval($value))) {
246                                                 $admBlogs[] = intval($value);
247                                         }
248                                 }
249                                 $yrBlogs = $admBlogs;
250                         }
251                         
252                         if (count($yrBlogs) > 0) {
253                                 echo '<h2>' . _OVERVIEW_OTHER_DRAFTS . '</h2>';
254                                 $query =  'SELECT ititle, inumber, bshortname, mname'
255                                            . ' FROM ' . sql_table('item'). ', ' . sql_table('blog'). ', ' . sql_table('member')
256                                            . ' WHERE iauthor<>'.$member->getID().' and iblog IN ('.implode(",",$yrBlogs).') and iblog=bnumber and iauthor=mnumber and idraft=1'
257                                            . ' ORDER BY iblog ASC';
258                                 $template['content'] = 'otherdraftlist';
259                                 $amountdrafts = showlist($query, 'table', $template);
260                                 if ($amountdrafts == 0)
261                                         echo _OVERVIEW_NODRAFTS;
262                         }
263         }
264
265         /* ---- user settings ---- */
266         echo '<h2>' . _OVERVIEW_YRSETTINGS . '</h2>';
267         echo '<ul>';
268         echo '<li><a href="index.php?action=editmembersettings">' . _OVERVIEW_EDITSETTINGS. '</a></li>';
269         echo '<li><a href="index.php?action=browseownitems">' . _OVERVIEW_BROWSEITEMS.'</a></li>';
270         echo '<li><a href="index.php?action=browseowncomments">'._OVERVIEW_BROWSECOMM.'</a></li>';
271         echo '</ul>';
272
273         /* ---- general settings ---- */
274         if ($member->isAdmin()) {
275             echo '<h2>' . _OVERVIEW_MANAGEMENT. '</h2>';
276             echo '<ul>';
277             echo '<li><a href="index.php?action=manage">',_OVERVIEW_MANAGE,'</a></li>';
278             echo '</ul>';
279         }
280
281
282         $this->pagefoot();
283     }
284
285     /**
286      * Returns a link to a weblog
287      * @param object BLOG
288      */
289     function bloglink(&$blog) {
290         return '<a href="'.Entity::hsc($blog->getURL()).'" title="'._BLOGLIST_TT_VISIT.'">'. Entity::hsc( $blog->getName() ) .'</a>';
291     }
292
293     /**
294      * @todo document this
295      */
296     function action_manage($msg = '') {
297         global $member;
298
299         $member->isAdmin() or $this->disallow();
300
301         $this->pagehead();
302
303         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';
304
305         if ($msg)
306             echo '<p>' , _MESSAGE , ': ', $msg , '</p>';
307
308
309         echo '<h2>' . _MANAGE_GENERAL. '</h2>';
310
311         echo '<ul>';
312         echo '<li><a href="index.php?action=createnewlog">'._OVERVIEW_NEWLOG.'</a></li>';
313         echo '<li><a href="index.php?action=settingsedit">'._OVERVIEW_SETTINGS.'</a></li>';
314         echo '<li><a href="index.php?action=usermanagement">'._OVERVIEW_MEMBERS.'</a></li>';
315         echo '<li><a href="index.php?action=actionlog">'._OVERVIEW_VIEWLOG.'</a></li>';
316         echo '</ul>';
317
318         echo '<h2>' . _MANAGE_SKINS . '</h2>';
319         echo '<ul>';
320         echo '<li><a href="index.php?action=skinoverview">'._OVERVIEW_SKINS.'</a></li>';
321         echo '<li><a href="index.php?action=templateoverview">'._OVERVIEW_TEMPLATES.'</a></li>';
322         echo '<li><a href="index.php?action=skinieoverview">'._OVERVIEW_SKINIMPORT.'</a></li>';
323         echo '</ul>';
324
325         echo '<h2>' . _MANAGE_EXTRA . '</h2>';
326         echo '<ul>';
327         echo '<li><a href="index.php?action=backupoverview">'._OVERVIEW_BACKUP.'</a></li>';
328         echo '<li><a href="index.php?action=pluginlist">'._OVERVIEW_PLUGINS.'</a></li>';
329         echo '</ul>';
330
331         $this->pagefoot();
332     }
333
334         /**
335          * Admin::action_itemlist()
336          * 
337          * @param       integer $blogid ID for weblog
338          * @return      void
339          */
340         public function action_itemlist($blogid = '')
341 =======
342         static private $skin;
343         
344         static public $action;
345         static public $aOptions;
346         static public $blog;
347         static public $contents;
348         static public $extrahead;
349         static public $headMess;
350         static public $passvar;
351         
352         static private $skinless_actions = array(
353                 'plugindeleteconfirm',
354                 'pluginoptionsupdate',
355                 'blogsettingsupdate',
356                 'settingsupdate',
357                 'addnewlog2',
358                 'additem',
359                 'banlistnewfromitem',
360                 'itemdeleteconfirm',
361                 'itemupdate',
362                 'changemembersettings',
363                 'clearactionlog',
364                 'memberedit',
365                 'login',
366                 
367                 'skinremovetypeconfirm',
368                 'skinclone',
369                 'skindeleteconfirm',
370                 'skinnew',
371                 'skineditgeneral',
372                 'skinupdate',
373                 
374                 'skinieexport',
375                 
376                 'templateupdate',
377                 'templatedeleteconfirm',
378                 'templatenew',
379                 'templateclone',
380                 
381                 'adminskinremovetypeconfirm',
382                 'adminskinclone',
383                 'adminskindeleteconfirm',
384                 'adminskinnew',
385                 'adminskineditgeneral',
386                 'adminskinupdate',
387                 
388                 'adminskinieexport',
389                 
390                 'admintemplateupdate',
391                 'admintemplatedeleteconfirm',
392                 'admintemplatenew',
393                 'admintemplateclone'
394         );
395         
396         static private $ticketless_actions = array(
397                 'showlogin',
398                 'login',
399                 'overview',
400                 'itemlist',
401                 'blogcommentlist',
402                 'bookmarklet',
403                 'blogsettings',
404                 'banlist',
405                 'createaccount',
406                 'deleteblog',
407                 'editmembersettings',
408                 'createaccount',
409                 'forgotpassword',
410                 'browseowncomments',
411                 'createitem',
412                 'browseownitems',
413                 'itemedit',
414                 'itemmove',
415                 'categoryedit',
416                 'categorydelete',
417                 'manage',
418                 'actionlog',
419                 'settingsedit',
420                 'backupoverview',
421                 'pluginlist',
422                 'createnewlog',
423                 'usermanagement',
424                 'itemcommentlist',
425                 'commentedit',
426                 'commentdelete',
427                 'banlistnewfromitem',
428                 'banlistdelete',
429                 'itemdelete',
430                 'manageteam',
431                 'teamdelete',
432                 'banlistnew',
433                 'memberedit',
434                 'memberdelete',
435                 'pluginhelp',
436                 'pluginoptions',
437                 'plugindelete',
438                 
439                 'activate',
440                 'systemoverview',
441                 'activatesetpwd',
442                 
443                 'skinoverview',
444                 'skinclone',
445                 'skindelete',
446                 'skinedit',
447                 'skinedittype',
448                 'skinnew',
449                 'skinremovetype',
450                 
451                 'skinieoverview',
452                 
453                 'templateoverview',
454                 'templateclone',
455                 'templateedit',
456                 'templatedelete',
457                 
458                 'adminskinoverview',
459                 'adminskinclone',
460                 'adminskindelete',
461                 'adminskinedit',
462                 'adminskinedittype',
463                 'adminskinnew',
464                 'adminskinremovetype',
465                 
466                 'adminskinieoverview',
467                 
468                 'admintemplateoverview',
469                 'admintemplateclone',
470                 'admintemplateedit',
471                 'admintemplatedelete'
472         );
473         
474         /**
475          * NOTE: This is for condition of admin/normal skin actions
476          */
477         static public $adminskin_actions = array(
478                 /* ticketless */
479                 'adminskinoverview',
480                 'adminskinclone',
481                 'adminskindelete',
482                 'adminskinedit',
483                 'adminskinedittype',
484                 'adminskinnew',
485                 'adminskinremovetype',
486                 
487                 'adminskinieoverview',
488                 
489                 'admintemplateoverview',
490                 'admintemplateclone',
491                 'admintemplateedit',
492                 'admintemplatedelete',
493                 
494                 /* ticket needed */
495                 'adminskineditgeneral',
496                 'adminskinupdate',
497                 'adminskindeleteconfirm',
498                 'adminskinremovetypeconfirm',
499                 
500                 'adminskinieoverview',
501                 'adminskiniedoimport',
502                 'adminskinieexport',
503                 'adminskinieimport',
504                 
505                 'admintemplatenew',
506                 'admintemplatedeleteconfirm',
507                 'admintemplateupdate'
508         );
509         
510         static public function initialize()
511         {
512                 global $CONF, $manager, $member;
513                 
514                 /* NOTE: 1. decide which skinid to use */
515                 $skinid = $CONF['AdminSkin'];
516                 if ( $member->isLoggedIn() )
517                 {
518                         $memskin = $member->getAdminSkin();
519                         if ( $memskin && Skin::existsID($memskin))
520                         {
521                                 $skinid = $memskin;
522                         }
523                 }
524                 
525                 /* NOTE: 2. make an instance of skin object */
526                 if ( !Skin::existsID($skinid) )
527                 {
528                         return FALSE;
529                 }
530                 
531                 /* NOTE: 3. initializing each members */
532                 self::$skin                     =& $manager->getSkin($skinid, 'AdminActions', 'AdminSkin');
533                 self::$action           = '';
534                 self::$extrahead        = '';
535                 self::$passvar          = '';
536                 self::$headMess         = '';
537                 self::$aOptions         = '';
538                 return TRUE;
539         }
540         
541         /**
542          * Admin::action()
543          * Executes an action
544          *
545          * @param       string  $action action to be performed
546          * @return      void
547          */
548         static public function action($action)
549         {
550                 global $CONF, $manager, $member;
551                 
552                 /* 1. decide action name */
553                 $customAction = postvar('customaction');
554                 if ( empty($customAction) )
555                 {
556                         $alias = array(
557                                 'login' => 'overview',
558                                 ''              => 'overview',
559                         );
560                 }
561                 else
562                 {
563                         $alias = array(
564                                 'login' => $customAction,
565                                 ''              => $customAction
566                         );
567                 }
568                 if ( array_key_exists($action, $alias) && isset($alias[$action]) )
569                 {
570                         $action = $alias[$action];
571                 }
572                 $method_name = "action_{$action}";
573                 self::$action = strtolower($action);
574                 
575                 /* 2. check ticket-needed action */
576                 if ( !in_array(self::$action, self::$ticketless_actions) && !$manager->checkTicket() )
577                 {
578                         self::error(_ERROR_BADTICKET);
579                         return;
580                 }
581                 
582                 /* 3. parse according to the action */
583                 else if ( method_exists('Admin', $method_name) )
584                 {
585                         call_user_func(array(__CLASS__, $method_name));
586                         return;
587                 }
588                 /* 4. parse special admin skin */
589                 elseif ( in_array(self::$action, self::$skinless_actions) )
590                 {
591                         /* TODO: need to be implemented or not?
592                         self::action_parseSpecialskin();
593                         */
594                 }
595                 else
596                 {
597                         self::error(_BADACTION . ENTITY::hsc($action));
598                         return;
599                 }
600                 
601                 return;
602         }
603         
604         /**
605          * Action::action_showlogin()
606          * 
607          * @param       void
608          * @return      void
609          */
610         static private function action_showlogin()
611         {
612                 global $error;
613                 self::action_login($error);
614                 return;
615         }
616         
617         /**
618          * Action::action_login()
619          * 
620          * @param       string  $msg            message for pageheader
621          * @param       integer $passvars       ???
622          */
623         static private function action_login($msg = '', $passvars = 1)
624         {
625                 global $member;
626                 
627                 // skip to overview when allowed
628                 if ( $member->isLoggedIn() && $member->canLogin() )
629                 {
630                         self::action_overview();
631                         return;
632                 }
633                 
634                 /* TODO: needless variable??? */
635                 self::$passvar = $passvars;
636                 if ( $msg )
637                 {
638                         self::$headMess = $msg;
639                 }
640                 
641                 self::$skin->parse('showlogin');
642         }
643         
644         /**
645          * Action::action_overview()
646          * provides a screen with the overview of the actions available
647          * 
648          * @param       string  $msg    message for pageheader
649          * @return      void
650          */
651         static private function action_overview($msg = '')
652         {
653                 if ( $msg )
654                 {
655                         self::$headMess = $msg;
656                 }
657                 
658                 self::$skin->parse('overview');
659                 return;
660         }
661         
662         /**
663          * Admin::action_manage()
664          * 
665          * @param       string  $msg    message for pageheader
666          * @retrn       void
667          */
668         static private function action_manage($msg = '')
669         {
670                 global $member;
671                 
672                 if ( $msg )
673                 {
674                         self::$headMess = $msg;
675                 }
676                 $member->isAdmin() or self::disallow();
677                 
678                 self::$skin->parse('manage');
679                 return;
680         }
681         
682         /**
683          * Action::action_itemlist()
684          * 
685          * @param       integer id for weblod
686          * @return      void
687          */
688         static private function action_itemlist($blogid = '')
689 >>>>>>> skinnable-master
690         {
691                 global $member, $manager, $CONF;
692                 
693                 if ( $blogid == '' )
694                 {
695                         $blogid = intRequestVar('blogid');
696                 }
697                 
698 <<<<<<< HEAD
699                 $member->teamRights($blogid) or $member->isAdmin() or $this->disallow();
700                 
701                 $this->pagehead();
702                 $blog =& $manager->getBlog($blogid);
703                 
704                 echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';
705                 echo '<h2>' . _ITEMLIST_BLOG . ' ' . $this->bloglink($blog) . '</h2>';
706                 
707                 // start index
708                 if ( postVar('start') )
709                 {
710                         $start = intPostVar('start');
711                 }
712                 else
713                 {
714                         $start = 0;
715                 }
716                 
717                 if ( $start == 0 )
718                 {
719                         echo '<p><a href="index.php?action=createitem&amp;blogid='.$blogid.'">' . _ITEMLIST_ADDNEW . "</a></p>\n";
720                 }
721                 
722                 // amount of items to show
723                 if ( postVar('amount') )
724                 {
725                         $amount = intPostVar('amount');
726                 }
727                 else
728                 {
729                         $amount = intval($CONF['DefaultListSize']);
730                         if ( $amount < 1 )
731                         {
732                                 $amount = 10;
733                         }
734                 }
735                 
736                 $search = postVar('search');    // search through items
737                 
738                 $query = 'SELECT bshortname, cname, mname, ititle, ibody, inumber, idraft, itime'
739                        . ' FROM ' . sql_table('item') . ', ' . sql_table('blog') . ', ' . sql_table('member') . ', ' . sql_table('category')
740                        . ' WHERE iblog=bnumber and iauthor=mnumber and icat=catid and iblog=' . $blogid;
741                 
742                 if ( $search )
743                 {
744                         $query .= " AND ((ititle LIKE " . DB::quoteValue('%'.$search.'%') . ") OR (ibody LIKE " . DB::quoteValue('%'.$search.'%') . ") OR (imore LIKE " . DB::quoteValue('%'.$search.'%') . "))";
745                 }
746                 
747                 // non-blog-admins can only edit/delete their own items
748                 if ( !$member->blogAdminRights($blogid) )
749                 {
750                         $query .= ' and iauthor=' . $member->getID();
751                 }
752                 
753                 $query .= ' ORDER BY itime DESC'
754                         . " LIMIT $start, $amount";
755                 
756                 $template['content'] = 'itemlist';
757                 $template['now'] = $blog->getCorrectTime(time());
758                 
759                 $manager->loadClass("ENCAPSULATE");
760                 $navList = new NavList('itemlist', $start, $amount, 0, 1000, $blogid, $search, 0);
761                 $navList->showBatchList('item',$query,'table',$template);
762                 
763                 $this->pagefoot();
764                 return;
765         }
766
767     /**
768      * @todo document this
769      */
770     function action_batchitem() {
771         global $member, $manager;
772
773         // check if logged in
774         $member->isLoggedIn() or $this->disallow();
775
776         // more precise check will be done for each performed operation
777
778         // get array of itemids from request
779         $selected = requestIntArray('batch');
780         $action = requestVar('batchaction');
781
782         // Show error when no items were selected
783         if (!is_array($selected) || sizeof($selected) == 0)
784             $this->error(_BATCH_NOSELECTION);
785
786         // On move: when no destination blog/category chosen, show choice now
787         $destCatid = intRequestVar('destcatid');
788         if (($action == 'move') && (!$manager->existsCategory($destCatid)))
789             $this->batchMoveSelectDestination('item',$selected);
790
791         // On delete: check if confirmation has been given
792         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))
793             $this->batchAskDeleteConfirmation('item',$selected);
794
795         $this->pagehead();
796
797         echo '<a href="index.php?action=overview">(',_BACKHOME,')</a>';
798         echo '<h2>',_BATCH_ITEMS,'</h2>';
799         echo '<p>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b></p>';
800         echo '<ul>';
801
802
803         // walk over all itemids and perform action
804         foreach ($selected as $itemid) {
805             $itemid = intval($itemid);
806             echo '<li>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b> ',_BATCH_ONITEM,' <b>', $itemid, '</b>...';
807
808             // perform action, display errors if needed
809             switch($action) {
810                 case 'delete':
811                     $error = $this->deleteOneItem($itemid);
812                     break;
813                 case 'move':
814                     $error = $this->moveOneItem($itemid, $destCatid);
815                     break;
816                 default:
817                     $error = _BATCH_UNKNOWN . Entity::hsc($action);
818             }
819
820             echo '<b>',($error ? $error : _BATCH_SUCCESS),'</b>';
821             echo '</li>';
822         }
823
824         echo '</ul>';
825         echo '<b>',_BATCH_DONE,'</b>';
826
827         $this->pagefoot();
828
829
830     }
831
832     /**
833      * @todo document this
834      */
835     function action_batchcomment() {
836         global $member;
837
838         // check if logged in
839         $member->isLoggedIn() or $this->disallow();
840
841         // more precise check will be done for each performed operation
842
843         // get array of itemids from request
844         $selected = requestIntArray('batch');
845         $action = requestVar('batchaction');
846
847         // Show error when no items were selected
848         if (!is_array($selected) || sizeof($selected) == 0)
849             $this->error(_BATCH_NOSELECTION);
850
851         // On delete: check if confirmation has been given
852         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))
853             $this->batchAskDeleteConfirmation('comment',$selected);
854
855         $this->pagehead();
856
857         echo '<a href="index.php?action=overview">(',_BACKHOME,')</a>';
858         echo '<h2>',_BATCH_COMMENTS,'</h2>';
859         echo '<p>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b></p>';
860         echo '<ul>';
861
862         // walk over all itemids and perform action
863         foreach ($selected as $commentid) {
864             $commentid = intval($commentid);
865             echo '<li>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b> ',_BATCH_ONCOMMENT,' <b>', $commentid, '</b>...';
866
867             // perform action, display errors if needed
868             switch($action) {
869                 case 'delete':
870                     $error = $this->deleteOneComment($commentid);
871                     break;
872                 default:
873                     $error = _BATCH_UNKNOWN . Entity::hsc($action);
874             }
875
876             echo '<b>',($error ? $error : _BATCH_SUCCESS),'</b>';
877             echo '</li>';
878         }
879
880         echo '</ul>';
881         echo '<b>',_BATCH_DONE,'</b>';
882
883         $this->pagefoot();
884
885
886     }
887
888     /**
889      * @todo document this
890      */
891     function action_batchmember() {
892         global $member;
893
894         // check if logged in and admin
895         ($member->isLoggedIn() && $member->isAdmin()) or $this->disallow();
896
897         // get array of itemids from request
898         $selected = requestIntArray('batch');
899         $action = requestVar('batchaction');
900
901         // Show error when no members selected
902         if (!is_array($selected) || sizeof($selected) == 0)
903             $this->error(_BATCH_NOSELECTION);
904
905         // On delete: check if confirmation has been given
906         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))
907             $this->batchAskDeleteConfirmation('member',$selected);
908
909         $this->pagehead();
910
911         echo '<a href="index.php?action=usermanagement">(',_MEMBERS_BACKTOOVERVIEW,')</a>';
912         echo '<h2>',_BATCH_MEMBERS,'</h2>';
913         echo '<p>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b></p>';
914         echo '<ul>';
915
916         // walk over all itemids and perform action
917         foreach ($selected as $memberid) {
918             $memberid = intval($memberid);
919             echo '<li>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b> ',_BATCH_ONMEMBER,' <b>', $memberid, '</b>...';
920
921             // perform action, display errors if needed
922             switch($action) {
923                 case 'delete':
924                     $error = $this->deleteOneMember($memberid);
925                     break;
926                 case 'setadmin':
927                     // always succeeds
928                     DB::execute('UPDATE ' . sql_table('member') . ' SET madmin=1 WHERE mnumber='.$memberid);
929                     $error = '';
930                     break;
931                 case 'unsetadmin':
932                     // there should always remain at least one super-admin
933                     $r = DB::getResult('SELECT * FROM '.sql_table('member'). ' WHERE madmin=1 and mcanlogin=1');
934                     if ($r->rowCount() < 2)
935                         $error = _ERROR_ATLEASTONEADMIN;
936                     else
937                         DB::execute('UPDATE ' . sql_table('member') .' SET madmin=0 WHERE mnumber='.$memberid);
938                     break;
939                 default:
940                     $error = _BATCH_UNKNOWN . Entity::hsc($action);
941             }
942
943             echo '<b>',($error ? $error : _BATCH_SUCCESS),'</b>';
944             echo '</li>';
945         }
946
947         echo '</ul>';
948         echo '<b>',_BATCH_DONE,'</b>';
949
950         $this->pagefoot();
951
952
953     }
954
955     /**
956      * @todo document this
957      */
958     function action_batchteam() {
959         global $member;
960
961         $blogid = intRequestVar('blogid');
962
963         // check if logged in and admin
964         ($member->isLoggedIn() && $member->blogAdminRights($blogid)) or $this->disallow();
965
966         // get array of itemids from request
967         $selected = requestIntArray('batch');
968         $action = requestVar('batchaction');
969
970         // Show error when no members selected
971         if (!is_array($selected) || sizeof($selected) == 0)
972             $this->error(_BATCH_NOSELECTION);
973
974         // On delete: check if confirmation has been given
975         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))
976             $this->batchAskDeleteConfirmation('team',$selected);
977
978         $this->pagehead();
979
980         echo '<p><a href="index.php?action=manageteam&amp;blogid=',$blogid,'">(',_BACK,')</a></p>';
981
982         echo '<h2>',_BATCH_TEAM,'</h2>';
983         echo '<p>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b></p>';
984         echo '<ul>';
985
986         // walk over all itemids and perform action
987         foreach ($selected as $memberid) {
988             $memberid = intval($memberid);
989             echo '<li>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b> ',_BATCH_ONTEAM,' <b>', $memberid, '</b>...';
990
991             // perform action, display errors if needed
992             switch($action) {
993                 case 'delete':
994                     $error = $this->deleteOneTeamMember($blogid, $memberid);
995                     break;
996                 case 'setadmin':
997                     // always succeeds
998                     DB::execute('UPDATE '.sql_table('team').' SET tadmin=1 WHERE tblog='.$blogid.' and tmember='.$memberid);
999                     $error = '';
1000                     break;
1001                 case 'unsetadmin':
1002                     // there should always remain at least one admin
1003                     $r = DB::getResult('SELECT * FROM '.sql_table('team').' WHERE tadmin=1 and tblog='.$blogid);
1004                     if ($r->rowCount() < 2)
1005                         $error = _ERROR_ATLEASTONEBLOGADMIN;
1006                     else
1007                         DB::execute('UPDATE '.sql_table('team').' SET tadmin=0 WHERE tblog='.$blogid.' and tmember='.$memberid);
1008                     break;
1009                 default:
1010                     $error = _BATCH_UNKNOWN . Entity::hsc($action);
1011             }
1012
1013             echo '<b>',($error ? $error : _BATCH_SUCCESS),'</b>';
1014             echo '</li>';
1015         }
1016
1017         echo '</ul>';
1018         echo '<b>',_BATCH_DONE,'</b>';
1019
1020         $this->pagefoot();
1021
1022
1023     }
1024
1025     /**
1026      * @todo document this
1027      */
1028     function action_batchcategory() {
1029         global $member, $manager;
1030
1031         // check if logged in
1032         $member->isLoggedIn() or $this->disallow();
1033
1034         // more precise check will be done for each performed operation
1035
1036         // get array of itemids from request
1037         $selected = requestIntArray('batch');
1038         $action = requestVar('batchaction');
1039
1040         // Show error when no items were selected
1041         if (!is_array($selected) || sizeof($selected) == 0)
1042             $this->error(_BATCH_NOSELECTION);
1043
1044         // On move: when no destination blog chosen, show choice now
1045         $destBlogId = intRequestVar('destblogid');
1046         if (($action == 'move') && (!$manager->existsBlogID($destBlogId)))
1047             $this->batchMoveCategorySelectDestination('category',$selected);
1048
1049         // On delete: check if confirmation has been given
1050         if (($action == 'delete') && (requestVar('confirmation') != 'yes'))
1051             $this->batchAskDeleteConfirmation('category',$selected);
1052
1053         $this->pagehead();
1054
1055         echo '<a href="index.php?action=overview">(',_BACKHOME,')</a>';
1056         echo '<h2>',BATCH_CATEGORIES,'</h2>';
1057         echo '<p>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b></p>';
1058         echo '<ul>';
1059
1060         // walk over all itemids and perform action
1061         foreach ($selected as $catid) {
1062             $catid = intval($catid);
1063             echo '<li>',_BATCH_EXECUTING,' <b>',Entity::hsc($action),'</b> ',_BATCH_ONCATEGORY,' <b>', $catid, '</b>...';
1064
1065             // perform action, display errors if needed
1066             switch($action) {
1067                 case 'delete':
1068                     $error = $this->deleteOneCategory($catid);
1069                     break;
1070                 case 'move':
1071                     $error = $this->moveOneCategory($catid, $destBlogId);
1072                     break;
1073                 default:
1074                     $error = _BATCH_UNKNOWN . Entity::hsc($action);
1075             }
1076
1077             echo '<b>',($error ? _ERROR . ': '.$error : _BATCH_SUCCESS),'</b>';
1078             echo '</li>';
1079         }
1080
1081         echo '</ul>';
1082         echo '<b>',_BATCH_DONE,'</b>';
1083
1084         $this->pagefoot();
1085
1086     }
1087
1088     /**
1089      * @todo document this
1090      */
1091     function batchMoveSelectDestination($type, $ids) {
1092         global $manager;
1093         $this->pagehead();
1094         ?>
1095         <h2><?php echo _MOVE_TITLE ?></h2>
1096         <form method="post" action="index.php"><div>
1097
1098             <input type="hidden" name="action" value="batch<?php echo $type ?>" />
1099             <input type="hidden" name="batchaction" value="move" />
1100             <?php
1101                 $manager->addTicketHidden();
1102
1103                 // insert selected item numbers
1104                 $idx = 0;
1105                 foreach ($ids as $id)
1106                     echo '<input type="hidden" name="batch[',($idx++),']" value="',intval($id),'" />';
1107
1108                 // show blog/category selection list
1109                 $this->selectBlogCategory('destcatid');
1110
1111             ?>
1112
1113
1114             <input type="submit" value="<?php echo _MOVE_BTN ?>" onclick="return checkSubmit();" />
1115
1116         </div></form>
1117         <?php       $this->pagefoot();
1118         exit;
1119     }
1120
1121     /**
1122      * @todo document this
1123      */
1124     function batchMoveCategorySelectDestination($type, $ids) {
1125         global $manager;
1126         $this->pagehead();
1127         ?>
1128         <h2><?php echo _MOVECAT_TITLE ?></h2>
1129         <form method="post" action="index.php"><div>
1130
1131             <input type="hidden" name="action" value="batch<?php echo $type ?>" />
1132             <input type="hidden" name="batchaction" value="move" />
1133             <?php
1134                 $manager->addTicketHidden();
1135
1136                 // insert selected item numbers
1137                 $idx = 0;
1138                 foreach ($ids as $id)
1139                     echo '<input type="hidden" name="batch[',($idx++),']" value="',intval($id),'" />';
1140
1141                 // show blog/category selection list
1142                 $this->selectBlog('destblogid');
1143
1144             ?>
1145
1146
1147             <input type="submit" value="<?php echo _MOVECAT_BTN ?>" onclick="return checkSubmit();" />
1148
1149         </div></form>
1150         <?php       $this->pagefoot();
1151         exit;
1152     }
1153
1154     /**
1155      * @todo document this
1156      */
1157     function batchAskDeleteConfirmation($type, $ids) {
1158         global $manager;
1159
1160         $this->pagehead();
1161         ?>
1162         <h2><?php echo _BATCH_DELETE_CONFIRM ?></h2>
1163         <form method="post" action="index.php"><div>
1164
1165             <input type="hidden" name="action" value="batch<?php echo $type ?>" />
1166             <?php $manager->addTicketHidden() ?>
1167             <input type="hidden" name="batchaction" value="delete" />
1168             <input type="hidden" name="confirmation" value="yes" />
1169             <?php               // insert selected item numbers
1170                 $idx = 0;
1171                 foreach ($ids as $id)
1172                     echo '<input type="hidden" name="batch[',($idx++),']" value="',intval($id),'" />';
1173
1174                 // add hidden vars for team & comment
1175                 if ($type == 'team')
1176                 {
1177                     echo '<input type="hidden" name="blogid" value="',intRequestVar('blogid'),'" />';
1178                 }
1179                 if ($type == 'comment')
1180                 {
1181                     echo '<input type="hidden" name="itemid" value="',intRequestVar('itemid'),'" />';
1182                 }
1183
1184             ?>
1185
1186             <input type="submit" value="<?php echo _BATCH_DELETE_CONFIRM_BTN ?>" onclick="return checkSubmit();" />
1187
1188         </div></form>
1189         <?php       $this->pagefoot();
1190         exit;
1191     }
1192
1193
1194     /**
1195      * Inserts a HTML select element with choices for all categories to which the current
1196      * member has access
1197      * @see function selectBlog
1198      */
1199     function selectBlogCategory($name, $selected = 0, $tabindex = 0, $showNewCat = 0, $iForcedBlogInclude = -1) {
1200         Admin::selectBlog($name, 'category', $selected, $tabindex, $showNewCat, $iForcedBlogInclude);
1201     }
1202
1203         /**
1204          * Admin::selectBlog()
1205          * Inserts a HTML select element with choices for all blogs to which the user has access
1206          *  mode = 'blog' => shows blognames and values are blogids
1207          *  mode = 'category' => show category names and values are catids
1208          * 
1209          * @param       string  $name                           name of 
1210          * @param       string  $mode                           blog/category
1211          * @param       integer $selected                       category ID to be selected
1212          * @param       integer $tabindex                       tab index value
1213          * @param       integer $showNewCat                     show category to newly be created
1214          * @param       integer $iForcedBlogInclude     ID of a blog that always needs to be included,
1215          *                                              without checking if the member is on the blog team (-1 = none)
1216          * @return      void
1217          */
1218         public function selectBlog($name, $mode='blog', $selected = 0, $tabindex = 0, $showNewCat = 0, $iForcedBlogInclude = -1)
1219         {
1220                 global $member, $CONF;
1221                 
1222                 // 0. get IDs of blogs to which member can post items (+ forced blog)
1223                 $aBlogIds = array();
1224                 if ( $iForcedBlogInclude != -1 )
1225                 {
1226                         $aBlogIds[] = intval($iForcedBlogInclude);
1227                 }
1228                 
1229                 if ( !$member->isAdmin() || !array_key_exists('ShowAllBlogs', $CONF) || !$CONF['ShowAllBlogs'] )
1230                 {
1231                         $query = "SELECT bnumber FROM %s,%s WHERE tblog=bnumber and tmember=%d;";
1232                         $query = sprintf($query, sql_table('blog'), sql_table('team'), (integer) $member->getID());
1233                 }
1234                 else
1235                 {
1236                         $query = "SELECT bnumber FROM %s ORDER BY bname;";
1237                         $query = sprintf($query, sql_table('blog'));
1238                 }
1239                 
1240                 $rblogids = DB::getResult($query);
1241                 foreach ( $rblogids as $row )
1242                 {
1243                         if ( $row['bnumber'] != $iForcedBlogInclude )
1244                         {
1245                                 $aBlogIds[] = (integer) $row['bnumber'];
1246                         }
1247                 }
1248                 if ( count($aBlogIds) == 0 )
1249                 {
1250                         return;
1251                 }
1252                 
1253                 echo "<select name=\"{$name}\" tabindex=\"{$tabindex}\">\n";
1254                 
1255                 // 1. select blogs (we'll create optiongroups)
1256                 // (only select those blogs that have the user on the team)
1257                 $query = "SELECT bnumber, bname FROM %s WHERE bnumber in (%s) ORDER BY bname;";
1258                 $query = sprintf($query, sql_table('blog'), implode(',',$aBlogIds));
1259                 $blogs = DB::getResult($query);
1260                 
1261                 if ( $mode == 'category' )
1262                 {
1263                         $multipleBlogs = ($blogs->rowCount() > 1);
1264                         
1265                         foreach ( $blogs as $row )
1266                         {
1267                                 if ( $multipleBlogs )
1268                                 {
1269                                         echo '<optgroup label="' . Entity::hsc($row['bname']) . '">' . "\n";
1270                                 }
1271                                 
1272                                 // show selection to create new category when allowed/wanted
1273                                 if ( $showNewCat )
1274                                 {
1275                                         // check if allowed to do so
1276                                         if ( $member->blogAdminRights($row['bnumber']) )
1277                                         {
1278                                                 echo "<option value=\"newcat-{$row['bnumber']}\">" . _ADD_NEWCAT . "</option>\n";
1279                                         }
1280                                 }
1281                                 
1282                                 // 2. for each category in that blog
1283                                 $query = "SELECT cname, catid FROM %s WHERE cblog=%d ORDER BY cname ASC;";
1284                                 $query = sprintf($query, sql_table('category'), (integer) $row['bnumber']);
1285                                 $categories = DB::getResult($query);
1286                                 foreach ( $categories as $cat )
1287                                 {
1288                                         if ( $cat['catid'] != $selected )
1289                                         {
1290                                         echo "<option value=\"{$cat['catid']}\" {$selectText} >" . Entity::hsc($cat['cname']) . "</option>\n";
1291                                         }
1292                                         else
1293                                         {
1294                                         echo "<option value=\"{$cat['catid']}\" selected=\"selected\" >" . Entity::hsc($cat['cname']) . "</option>\n";
1295                                         }
1296                                 }
1297                                 
1298                                 if ( $multipleBlogs )
1299                                 {
1300                                         echo "</optgroup>\n";
1301                                 }
1302                         }
1303                 }
1304                 else
1305                 {
1306                         // blog mode
1307                         foreach ( $blogs as $row )
1308                         {
1309                                 if ( $row['bnumber'] != $selected )
1310                                 {
1311                                         echo "<option value=\"{$row['bnumber']}\">" . Entity::hsc($row['bname']) . "</option>\n";
1312                                 }
1313                                 else
1314                                 {
1315                                         echo "<option value=\"{$row['bnumber']}\" selected=\"selected\">" . Entity::hsc($row['bname']) . "</option>\n";
1316                                 }
1317                         }
1318                 }
1319                 echo "</select>\n";
1320 =======
1321                 $member->teamRights($blogid) or $member->isAdmin() or self::disallow();
1322                 
1323                 self::$skin->parse('itemlist');
1324                 return;
1325         }
1326         
1327         /**
1328          * Action::action_batchitem()
1329          * 
1330          * @param       void
1331          * @return      void
1332          */
1333         static private function action_batchitem()
1334         {
1335                 global $member, $manager;
1336                 
1337                 $member->isLoggedIn() or self::disallow();
1338                 
1339                 $selected       = requestIntArray('batch');
1340                 $action         = requestVar('batchaction');
1341                 
1342                 if ( !is_array($selected) || sizeof($selected) == 0 )
1343                 {
1344                         self::error(_BATCH_NOSELECTION);
1345                         return;
1346                 }
1347                 
1348                 // On move: when no destination blog/category chosen, show choice now
1349                 $destCatid = intRequestVar('destcatid');
1350                 if ( ($action == 'move') && (!$manager->existsCategory($destCatid)) )
1351                 {
1352                         self::batchMoveSelectDestination('item', $selected);
1353                 }
1354                 
1355                 // On delete: check if confirmation has been given
1356                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )
1357                 {
1358                         self::batchAskDeleteConfirmation('item', $selected);
1359                 }
1360                 
1361                 self::$skin->parse('batchitem');
1362                 return;
1363         }
1364         
1365         /**
1366          * Action::action_batchcomment()
1367          * 
1368          * @param       void
1369          * @return      void
1370          */
1371         static private function action_batchcomment()
1372         {
1373                 global $member;
1374                 
1375                 $member->isLoggedIn() or self::disallow();
1376                 
1377                 $selected       = requestIntArray('batch');
1378                 $action         = requestVar('batchaction');
1379                 
1380                 // Show error when no items were selected
1381                 if ( !is_array($selected) || sizeof($selected) == 0 )
1382                 {
1383                         self::error(_BATCH_NOSELECTION);
1384                         return;
1385                 }
1386                 
1387                 // On delete: check if confirmation has been given
1388                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )
1389                 {
1390                         self::batchAskDeleteConfirmation('comment', $selected);
1391                 }
1392                 
1393                 self::$skin->parse('batchcomment');
1394                 return;
1395         }
1396         
1397         /**
1398          * Admin::action_batchmember()
1399          * 
1400          * @param       void
1401          * @return      void
1402          */
1403         static private function action_batchmember()
1404         {
1405                 global $member;
1406                 
1407                 ($member->isLoggedIn() && $member->isAdmin()) or self::disallow();
1408                 
1409                 $selected       = requestIntArray('batch');
1410                 $action         = requestVar('batchaction');
1411                 
1412                 // Show error when no members selected
1413                 if ( !is_array($selected) || sizeof($selected) == 0 )
1414                 {
1415                         self::error(_BATCH_NOSELECTION);
1416                         return;
1417                 }
1418                 
1419                 // On delete: check if confirmation has been given
1420                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )
1421                 {
1422                         self::batchAskDeleteConfirmation('member',$selected);
1423                 }
1424                 
1425                 self::$skin->parse('batchmember');
1426                 return;
1427         }
1428         
1429         /**
1430          * Admin::action_batchteam()
1431          * 
1432          * @param       void
1433          * @return      void
1434          */
1435         static private function action_batchteam()
1436         {
1437                 global $member;
1438                 
1439                 $blogid = intRequestVar('blogid');
1440                 
1441                 ($member->isLoggedIn() && $member->blogAdminRights($blogid)) or self::disallow();
1442                 
1443                 $selected       = requestIntArray('batch');
1444                 $action         = requestVar('batchaction');
1445                 
1446                 if ( !is_array($selected) || sizeof($selected) == 0 )
1447                 {
1448                         self::error(_BATCH_NOSELECTION);
1449                         return;
1450                 }
1451                 
1452                 // On delete: check if confirmation has been given
1453                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )
1454                 {
1455                         self::batchAskDeleteConfirmation('team',$selected);
1456                 }
1457                 
1458                 self::$skin->parse('batchteam');
1459                 return;
1460         }
1461         
1462         /**
1463          * Admin::action_batchcategory()
1464          * 
1465          * @param       void
1466          * @return      void
1467          */
1468         static private function action_batchcategory()
1469         {
1470                 global $member, $manager;
1471                 
1472                 $member->isLoggedIn() or self::disallow();
1473                 
1474                 $selected       = requestIntArray('batch');
1475                 $action         = requestVar('batchaction');
1476                 
1477                 if ( !is_array($selected) || sizeof($selected) == 0 )
1478                 {
1479                         self::error(_BATCH_NOSELECTION);
1480                         return;
1481                 }
1482                 
1483                 // On move: when no destination blog chosen, show choice now
1484                 $destBlogId = intRequestVar('destblogid');
1485                 if ( ($action == 'move') && (!$manager->existsBlogID($destBlogId)) )
1486                 {
1487                         self::batchMoveCategorySelectDestination('category', $selected);
1488                 }
1489                 
1490                 // On delete: check if confirmation has been given
1491                 if ( ($action == 'delete') && (requestVar('confirmation') != 'yes') )
1492                 {
1493                         self::batchAskDeleteConfirmation('category', $selected);
1494                 }
1495                 
1496                 self::$skin->parse('batchcategory');
1497                 return;
1498         }
1499         
1500         /**
1501          * Admin::batchMoveSelectDestination()
1502          * 
1503          * @param       string  $type   type of batch action
1504          * @param       integer $ids    needless???
1505          * @return      void
1506          * 
1507          * TODO: remove needless argument
1508          */
1509         static private function batchMoveSelectDestination($type, $ids)
1510         {
1511                 $_POST['batchmove'] = $type;
1512                 self::$skin->parse('batchmove');
1513                 return;
1514         }
1515         
1516         /**
1517          * Admin::batchMoveCategorySelectDestination()
1518          * 
1519          * @param       string  $type   type of batch action
1520          * @param       integer $ids    needless???
1521          * @return      void
1522          * 
1523          * TODO: remove needless argument
1524          */
1525         static private function batchMoveCategorySelectDestination($type, $ids)
1526         {
1527                 $_POST['batchmove'] = $type;
1528                 global $manager;
1529                 self::$skin->parse('batchmovecat');
1530                 return;
1531         }
1532         
1533         /**
1534          * Admin::batchAskDeleteConfirmation()
1535          * 
1536          * @param       string  $type   type of batch action
1537          * @param       integer $ids    needless???
1538          * @return      void
1539          * 
1540          * TODO: remove needless argument
1541          */
1542         static private function batchAskDeleteConfirmation($type, $ids)
1543         {
1544                 self::$skin->parse('batchdelete');
1545                 return;
1546         }
1547         
1548         /**
1549          * Admin::action_browseownitems()
1550          * 
1551          * @param       void
1552          * @return      void
1553          */
1554         static private function action_browseownitems()
1555         {
1556                 global $member, $manager, $CONF;
1557                 
1558                 self::$skin->parse('browseownitems');
1559                 return;
1560         }
1561         
1562         /**
1563          * Admin::action_itemcommentlist()
1564          * Show all the comments for a given item
1565          * 
1566          * @param       integer $itemid ID for item
1567          * @return      void
1568          */
1569         static private function action_itemcommentlist($itemid = '')
1570         {
1571                 global $member, $manager, $CONF;
1572                 
1573                 if ( $itemid == '' )
1574                 {
1575                         $itemid = intRequestVar('itemid');
1576                 }
1577                 
1578                 // only allow if user is allowed to alter item
1579                 $member->canAlterItem($itemid) or self::disallow();
1580                 
1581                 $item =& $manager->getItem($itemid, 1, 1);
1582                 $_REQUEST['itemid'] = $item['itemid'];
1583                 $_REQUEST['blogid'] = $item['blogid'];
1584                 
1585                 self::$skin->parse('itemcommentlist');
1586                 return;
1587         }
1588         
1589         /**
1590          * Admin::action_browseowncomments()
1591          * Browse own comments
1592          * 
1593          * @param       void
1594          * @return      void
1595          */
1596         static private function action_browseowncomments()
1597         {
1598                 self::$skin->parse('browseowncomments');
1599                 return;
1600         }
1601         
1602         /**
1603          * Admin::action_blogcommentlist()
1604          * Browse all comments for a weblog
1605          * 
1606          * @param       integer $blogid ID for weblog
1607          * @return      void
1608          */
1609         static private function action_blogcommentlist($blogid = '')
1610         {
1611                 global $member, $manager, $CONF;
1612                 
1613                 if ( $blogid == '' )
1614                 {
1615                         $blogid = intRequestVar('blogid');
1616                 }
1617                 else
1618                 {
1619                         $blogid = intval($blogid);
1620                 }
1621                 
1622                 $member->teamRights($blogid) or $member->isAdmin() or self::disallow();
1623                 
1624                 /* TODO: we consider to use the other way insterad of this */
1625                 $_REQUEST['blogid'] = $blogid;
1626                 
1627                 self::$skin->parse('blogcommentlist');
1628                 return;
1629         }
1630         
1631         /**
1632          * Admin::action_createaccount()
1633          * 
1634          * @param       void
1635          * @return      void
1636          */
1637         static private function action_createaccount()
1638         {
1639                 global $CONF;
1640                 
1641                 if ( $CONF['AllowMemberCreate'] != 1 )
1642                 {
1643                         self::$skin->parse('createaccountdisable');
1644                         return;
1645                 }
1646                 
1647                 $name = '';
1648                 $realname ='';
1649                 $email = '';
1650                 $url = '';
1651                 
1652                 $contents = array(
1653                         'name'          => '',
1654                         'realname'      => '',
1655                         'email'         => '',
1656                         'url'           => ''
1657                 );
1658                 
1659                 if ( array_key_exists('showform', $_POST) && $_POST['showform'] == 1 )
1660                 {
1661                         $action = new Action();
1662                         $message = $action->createAccount();
1663                         if ( $message === 1 )
1664                         {
1665                                 self::$headMess = $message;
1666                                 self::$skin->parse('createaccountsuccess');
1667                                 return;
1668                         }
1669                         
1670                         /* TODO: validation */
1671                         if ( array_key_exists('name', $_POST) )
1672                         {
1673                                 $contents['name'] = $_POST['name'];
1674                         }
1675                         if ( array_key_exists('realname', $_POST) )
1676                         {
1677                                 $contents['realname'] = $_POST['realname'];
1678                         }
1679                         if ( array_key_exists('email', $_POST) )
1680                         {
1681                                 $contents['email'] = $_POST['email'];
1682                         }
1683                         if ( array_key_exists('url', $_POST) )
1684                         {
1685                                 $contents['url'] = $_POST['url'];
1686                         }
1687                         
1688                         self::$contents = $contents;
1689                         
1690                 }
1691                 
1692                 self::$skin->parse('createaccountinput');
1693                 return;
1694         }
1695         
1696         /**
1697          * Admin::action_createitem()
1698          * Provide a page to item a new item to the given blog
1699          * 
1700          * @param       void
1701          * @return      void
1702          */
1703         static private function action_createitem()
1704         {
1705                 global $member, $manager;
1706                 
1707                 $blogid = intRequestVar('blogid');
1708                 
1709                 // check if allowed
1710                 $member->teamRights($blogid) or self::disallow();
1711                 
1712                 $blog =& $manager->getBlog($blogid);
1713                 $contents = array();
1714                 
1715                 $data = array(
1716                         'blog'          => &$blog,
1717                         'contents'      => &$contents
1718                 );
1719                 $manager->notify('PreAddItemForm', $data);
1720                 
1721                 if ( $blog->convertBreaks() )
1722                 {
1723                         if ( array_key_exists('body', $contents) && !empty($contents['body']) )
1724                         {
1725                                 $contents['body'] = removeBreaks($contents['body']);
1726                         }
1727                         if ( array_key_exists('more', $contents) && !empty($contents['more']) )
1728                         {
1729                                 $contents['more'] = removeBreaks($contents['more']);
1730                         }
1731                 }
1732                 
1733                 self::$blog = &$blog;
1734                 self::$contents = &$contents;
1735                 
1736                 self::$skin->parse('createitem');
1737                 return;
1738         }
1739         
1740         /**
1741          * Admin::action_itemedit()
1742          * 
1743          * @param       void
1744          * @return      void
1745          */
1746         static private function action_itemedit()
1747         {
1748                 global $member, $manager;
1749                 
1750                 $itemid = intRequestVar('itemid');
1751                 
1752                 // only allow if user is allowed to alter item
1753                 $member->canAlterItem($itemid) or self::disallow();
1754                 
1755                 $item =& $manager->getItem($itemid, 1, 1);
1756                 $blog =& $manager->getBlog($item['blogid']);
1757                 $data = array('blog'=> &$blog, 'item' => &$item);
1758                 $manager->notify('PrepareItemForEdit', $data);
1759                 
1760                 if ( $blog->convertBreaks() )
1761                 {
1762                         if ( array_key_exists('body', $item) && !empty($item['body']) )
1763                         {
1764                                 $item['body'] = removeBreaks($item['body']);
1765                         }
1766                         if ( array_key_exists('more', $item) && !empty($item['more']) )
1767                         {
1768                                 $item['more'] = removeBreaks($item['more']);
1769                         }
1770                 }
1771                 
1772                 self::$blog = &$blog;
1773                 self::$contents = &$item;
1774                 
1775                 self::$skin->parse('itemedit');
1776                 return;
1777         }
1778         
1779         /**
1780          * Admin::action_itemupdate()
1781          * 
1782          * @param       void
1783          * @return      void
1784          */
1785         static private function action_itemupdate()
1786         {
1787                 global $member, $manager, $CONF;
1788                 
1789                 $itemid = intRequestVar('itemid');
1790                 $catid  = postVar('catid');
1791                 
1792                 // only allow if user is allowed to alter item
1793                 $member->canUpdateItem($itemid, $catid) or self::disallow();
1794                 
1795                 $actiontype = postVar('actiontype');
1796                 
1797                 // delete actions are handled by itemdelete (which has confirmation)
1798                 if ( $actiontype == 'delete' )
1799                 {
1800                         self::action_itemdelete();
1801                         return;
1802                 }
1803                 
1804                 $body           = postVar('body');
1805                 $title          = postVar('title');
1806                 $more           = postVar('more');
1807                 $closed         = intPostVar('closed');
1808                 $draftid        = intPostVar('draftid');
1809                 
1810                 // default action = add now
1811                 if ( !$actiontype )
1812                 {
1813                         $actiontype='addnow';
1814                 }
1815                 
1816                 // create new category if needed
1817                 if ( i18n::strpos($catid,'newcat') === 0 )
1818                 {
1819                         // get blogid
1820                         list($blogid) = sscanf($catid,"newcat-%d");
1821                         
1822                         // create
1823                         $blog =& $manager->getBlog($blogid);
1824                         $catid = $blog->createNewCategory();
1825                         
1826                         // show error when sth goes wrong
1827                         if ( !$catid )
1828                         {
1829                                 self::doError(_ERROR_CATCREATEFAIL);
1830                         }
1831                 }
1832                 
1833                 /**
1834                  * set some variables based on actiontype
1835                  * 
1836                  * actiontypes:
1837                  *      draft items -> addnow, addfuture, adddraft, delete
1838                  *      non-draft items -> edit, changedate, delete
1839                  * 
1840                  * variables set:
1841                  *      $timestamp: set to a nonzero value for future dates or date changes
1842                  *      $wasdraft: set to 1 when the item used to be a draft item
1843                  *      $publish: set to 1 when the edited item is not a draft
1844                  */
1845                 $blogid =  getBlogIDFromItemID($itemid);
1846                 $blog =& $manager->getBlog($blogid);
1847                 
1848                 $wasdrafts = array('adddraft', 'addfuture', 'addnow');
1849                 $wasdraft  = in_array($actiontype, $wasdrafts) ? 1 : 0;
1850                 $publish   = ($actiontype != 'adddraft' && $actiontype != 'backtodrafts') ? 1 : 0;
1851                 if ( $actiontype == 'addfuture' || $actiontype == 'changedate' )
1852                 {
1853                         $timestamp = mktime(intPostVar('hour'), intPostVar('minutes'), 0, intPostVar('month'), intPostVar('day'), intPostVar('year'));
1854                 }
1855                 else
1856                 {
1857                         $timestamp =0;
1858                 }
1859                 
1860                 // edit the item for real
1861                 Item::update($itemid, $catid, $title, $body, $more, $closed, $wasdraft, $publish, $timestamp);
1862                 
1863                 self::updateFuturePosted($blogid);
1864                 
1865                 if ( $draftid > 0 )
1866                 {
1867                         // delete permission is checked inside Item::delete()
1868                         Item::delete($draftid);
1869                 }
1870                 
1871                 if ( $catid != intPostVar('catid') )
1872                 {
1873                         self::action_categoryedit(
1874                                 $catid,
1875                                 $blog->getID(),
1876                                 $CONF['AdminURL'] . 'index.php?action=itemlist&blogid=' . getBlogIDFromItemID($itemid)
1877                         );
1878                 }
1879                 else
1880                 {
1881                         // TODO: set start item correctly for itemlist
1882                         $item =& $manager->getitem($itemid, 1, 1);
1883                         $query = "SELECT COUNT(*) FROM %s WHERE unix_timestamp(itime) <= '%s';";
1884                         $query = sprintf($query, sql_table('item'), $item['timestamp']);
1885                         $cnt  = DB::getValue($query);
1886                         $_REQUEST['start'] = $cnt + 1;
1887                         self::action_itemlist(getBlogIDFromItemID($itemid));
1888                 }
1889                 return;
1890         }
1891         
1892         /**
1893          * Admin::action_itemdelete()
1894          * Delete item
1895          * 
1896          * @param       Void
1897          * @return      Void
1898          */
1899         static private function action_itemdelete()
1900         {
1901                 global $member, $manager;
1902                 
1903                 $itemid = intRequestVar('itemid');
1904                 
1905                 // only allow if user is allowed to alter item
1906                 $member->canAlterItem($itemid) or self::disallow();
1907                 
1908                 if ( !$manager->existsItem($itemid,1,1) )
1909                 {
1910                         self::error(_ERROR_NOSUCHITEM);
1911                         return;
1912                 }
1913                 
1914                 self::$skin->parse('itemdelete');
1915                 return;
1916         }
1917         
1918         /**
1919          * Admin::action_itemdeleteconfirm()
1920          * 
1921          * @param       void
1922          * @return      void
1923          */
1924         static private function action_itemdeleteconfirm()
1925         {
1926                 global $member, $manager;
1927                 
1928                 $itemid = intRequestVar('itemid');
1929                 
1930                 // only allow if user is allowed to alter item
1931                 $member->canAlterItem($itemid) or self::disallow();
1932                 
1933                 // get item first
1934                 $item =& $manager->getItem($itemid, 1, 1);
1935                 
1936                 // delete item (note: some checks will be performed twice)
1937                 self::deleteOneItem($item['itemid']);
1938                 
1939                 self::action_itemlist($item['blogid']);
1940                 return;
1941         }
1942         
1943         /**
1944          * Admin::deleteOneItem()
1945          * Deletes one item and returns error if something goes wrong
1946          * 
1947          * @param       integer $itemid ID for item
1948          * @return      void
1949          */
1950         static public function deleteOneItem($itemid)
1951         {
1952                 global $member, $manager;
1953                 
1954                 // only allow if user is allowed to alter item (also checks if itemid exists)
1955                 if ( !$member->canAlterItem($itemid) )
1956                 {
1957                         return _ERROR_DISALLOWED;
1958                 }
1959                 
1960                 // need to get blogid before the item is deleted
1961                 $item =& $manager->getItem($itemid, 1, 1);
1962                 
1963                 $manager->loadClass('ITEM');
1964                 Item::delete($item['itemid']);
1965                 
1966                 // update blog's futureposted
1967                 self::updateFuturePosted($item['itemid']);
1968                 return;
1969         }
1970         
1971         /**
1972          * Admin::updateFuturePosted()
1973          * Update a blog's future posted flag
1974          * 
1975          * @param integer $blogid
1976          * @return      void
1977          */
1978         static private function updateFuturePosted($blogid)
1979         {
1980                 global $manager;
1981                 
1982                 $blogid                 =  intval($blogid);
1983                 $blog                   =& $manager->getBlog($blogid);
1984                 $currenttime    =  $blog->getCorrectTime(time());
1985                 
1986                 $query = "SELECT * FROM %s WHERE iblog=%d AND iposted=0 AND itime>'%s'";
1987                 $query = sprintf($query, sql_table('item'), (integer) $blogid, i18n::formatted_datetime('mysql', $currenttime));
1988                 $result = DB::getResult($query);
1989                 
1990                 if ( $result->rowCount() > 0 )
1991                 {
1992                                 $blog->setFuturePost();
1993                 }
1994                 else
1995                 {
1996                                 $blog->clearFuturePost();
1997                 }
1998                 return;
1999         }
2000
2001         /**
2002          * Admin::action_itemmove()
2003          * 
2004          * @param       void
2005          * @return      void
2006          */
2007         static private function action_itemmove()
2008         {
2009                 global $member, $manager;
2010                 
2011                 $itemid = intRequestVar('itemid');
2012                 
2013                 $member->canAlterItem($itemid) or self::disallow();
2014                 
2015                 self::$skin->parse('itemmove');
2016                 return;
2017         }
2018         
2019         /**
2020          * Admin::action_itemmoveto()
2021          * 
2022          * @param       void
2023          * @return      void
2024          */
2025         static private function action_itemmoveto()
2026         {
2027                 global $member, $manager;
2028                 
2029                 $itemid = intRequestVar('itemid');
2030                 $catid = requestVar('catid');
2031                 
2032                 // create new category if needed
2033                 if ( i18n::strpos($catid,'newcat') === 0 )
2034                 {
2035                         // get blogid
2036                         list($blogid) = sscanf($catid,'newcat-%d');
2037                         
2038                         // create
2039                         $blog =& $manager->getBlog($blogid);
2040                         $catid = $blog->createNewCategory();
2041                         
2042                         // show error when sth goes wrong
2043                         if ( !$catid )
2044                         {
2045                                 self::doError(_ERROR_CATCREATEFAIL);
2046                         }
2047                 }
2048                 
2049                 // only allow if user is allowed to alter item
2050                 $member->canUpdateItem($itemid, $catid) or self::disallow();
2051                 
2052                 $old_blogid = getBlogIDFromItemId($itemid);
2053                 
2054                 Item::move($itemid, $catid);
2055                 
2056                 // set the futurePosted flag on the blog
2057                 self::updateFuturePosted(getBlogIDFromItemId($itemid));
2058                 
2059                 // reset the futurePosted in case the item is moved from one blog to another
2060                 self::updateFuturePosted($old_blogid);
2061                 
2062                 if ( $catid != intRequestVar('catid') )
2063                 {
2064                         self::action_categoryedit($catid, $blog->getID());
2065                 }
2066                 else
2067                 {
2068                         self::action_itemlist(getBlogIDFromCatID($catid));
2069                 }
2070                 return;
2071         }
2072         
2073         /**
2074          * Admin::moveOneItem()
2075          * Moves one item to a given category (category existance should be checked by caller)
2076          * errors are returned
2077          * 
2078          * @param       integer $itemid         ID for item
2079          * @param       integer $destCatid      ID for category to which the item will be moved
2080          * @return      void
2081          */
2082         static public function moveOneItem($itemid, $destCatid)
2083         {
2084                 global $member;
2085                 
2086                 // only allow if user is allowed to move item
2087                 if ( !$member->canUpdateItem($itemid, $destCatid) )
2088                 {
2089                         return _ERROR_DISALLOWED;
2090                 }
2091                 
2092                 Item::move($itemid, $destCatid);
2093                 return;
2094         }
2095         
2096         /**
2097          * Admin::action_additem()
2098          * Adds a item to the chosen blog
2099          * 
2100          * @param       void
2101          * @return      void
2102          */
2103         static private function action_additem()
2104         {
2105                 global $manager, $CONF;
2106                 
2107                 $manager->loadClass('ITEM');
2108                 
2109                 $result = Item::createFromRequest();
2110                 
2111                 if ( $result['status'] == 'error' )
2112                 {
2113                         self::error($result['message']);
2114                         return;
2115                 }
2116                 
2117                 $item =& $manager->getItem($result['itemid'], 0, 0);
2118                 
2119                 if ( $result['status'] == 'newcategory' )
2120                 {
2121                         $distURI = $manager->addTicketToUrl($CONF['AdminURL'] . 'index.php?action=itemList&blogid=' . $item['blogid']);
2122                         self::action_categoryedit($result['catid'], $item['blogid'], $distURI);
2123                 }
2124                 else
2125                 {
2126                         $methodName = 'action_itemlist';
2127                         self::action_itemlist($item['blogid']);
2128                 }
2129                 return;
2130         }
2131         
2132         /**
2133          * Admin::action_commentedit()
2134          * Allows to edit previously made comments
2135          * 
2136          * @param       void
2137          * @return      void
2138          */
2139         static private function action_commentedit()
2140         {
2141                 global $member, $manager;
2142                 
2143                 $commentid = intRequestVar('commentid');
2144                 
2145                 $member->canAlterComment($commentid) or self::disallow();
2146                 
2147                 $comment = Comment::getComment($commentid);
2148                 $data = array('comment' => &$comment);
2149                 $manager->notify('PrepareCommentForEdit', $data);
2150                 
2151                 self::$contents = $comment;
2152                 self::$skin->parse('commentedit');
2153                 return;
2154         }
2155         
2156         /**
2157          * Admin::action_commentupdate()
2158          * 
2159          * @param       void
2160          * @return      void
2161          */
2162         static private function action_commentupdate()
2163         {
2164                 global $member, $manager;
2165                 
2166                 $commentid = intRequestVar('commentid');
2167                 
2168                 $member->canAlterComment($commentid) or self::disallow();
2169                 
2170                 $url    = postVar('url');
2171                 $email  = postVar('email');
2172                 $body   = postVar('body');
2173                 
2174                 // intercept words that are too long
2175                 if (preg_match('#[a-zA-Z0-9|\.,;:!\?=\/\\\\]{90,90}#', $body) != FALSE)
2176                 {
2177                         self::error(_ERROR_COMMENT_LONGWORD);
2178                         return;
2179                 }
2180                 
2181                 // check length
2182                 if ( i18n::strlen($body) < 3 )
2183                 {
2184                         self::error(_ERROR_COMMENT_NOCOMMENT);
2185                         return;
2186                 }
2187                 
2188                 if ( i18n::strlen($body) > 5000 )
2189                 {
2190                         self::error(_ERROR_COMMENT_TOOLONG);
2191                         return;
2192                 }
2193                 
2194                 // prepare body
2195                 $body = Comment::prepareBody($body);
2196                 
2197                 // call plugins
2198                 $data = array(
2199                         'body' => &$body
2200                 );
2201                 $manager->notify('PreUpdateComment', $data);
2202                 
2203                 $query = "UPDATE %s SET cmail=%s, cemail=%s, cbody=%s WHERE cnumber=%d;";
2204                 $query = sprintf($query, sql_table('comment'), DB::quoteValue($url), DB::quoteValue($email), DB::quoteValue($body), (integer) $commentid);
2205                 DB::execute($query);
2206                 
2207                 // get itemid
2208                 $query = "SELECT citem FROM %s WHERE cnumber=%d;";
2209                 $query = sprintf($query, sql_table('comment'), (integer) $commentid);
2210                 
2211                 $itemid = DB::getValue($query);
2212                 
2213                 if ( $member->canAlterItem($itemid) )
2214                 {
2215                         self::action_itemcommentlist($itemid);
2216                 }
2217                 else
2218                 {
2219                         self::action_browseowncomments();
2220                 }
2221                 return;
2222         }
2223         
2224         /**
2225          * Admin::action_commentdelete()
2226          * Update comment
2227          * 
2228          * @param       void
2229          * @return      void
2230          */
2231         static private function action_commentdelete()
2232         {
2233                 global $member, $manager;
2234                 
2235                 $commentid = intRequestVar('commentid');
2236                 $member->canAlterComment($commentid) or self::disallow();
2237                 
2238                 self::$skin->parse('commentdelete');
2239                 return;
2240         }
2241         
2242         /**
2243          * Admin::action_commentdeleteconfirm()
2244          * 
2245          * @param       void
2246          * @return      void
2247          */
2248         static private function action_commentdeleteconfirm()
2249         {
2250                 global $member;
2251                 
2252                 $commentid = intRequestVar('commentid');
2253                 
2254                 // get item id first
2255                 $query = "SELECT citem FROM %s WHERE cnumber=%d;";
2256                 $query = sprintf($query, sql_table('comment'), (integer) $commentid);
2257                 
2258                 $itemid = DB::getValue($query);
2259                 
2260                 $error = self::deleteOneComment($commentid);
2261                 if ( $error )
2262                 {
2263                         self::doError($error);
2264                 }
2265                 
2266                 if ( $member->canAlterItem($itemid) )
2267                 {
2268                         self::action_itemcommentlist($itemid);
2269                 }
2270                 else
2271                 {
2272                         self::action_browseowncomments();
2273                 }
2274                 return;
2275         }
2276         
2277         /**
2278          * Admin::deleteOneComment()
2279          * 
2280          * @param       integer $commentid      ID for comment
2281          * @return      void
2282          */
2283         static public function deleteOneComment($commentid)
2284         {
2285                 global $member, $manager;
2286                 
2287                 $commentid = (integer) $commentid;
2288                 
2289                 if ( !$member->canAlterComment($commentid) )
2290                 {
2291                         return _ERROR_DISALLOWED;
2292                 }
2293                 
2294                 $data = array(
2295                         'commentid' => $commentid
2296                 );
2297                 
2298                 $manager->notify('PreDeleteComment', $data);
2299                 
2300                 // delete the comments associated with the item
2301                 $query = "DELETE FROM %s WHERE cnumber=%d;";
2302                 $query = sprintf($query, sql_table('comment'), (integer) $commentid);
2303                 DB::execute($query);
2304                 
2305                 $data = array(
2306                         'commentid' => $commentid
2307                 );
2308                 
2309                 $manager->notify('PostDeleteComment', $data);
2310                 
2311                 return '';
2312         }
2313         
2314         /**
2315          * Admin::action_usermanagement()
2316          * Usermanagement main
2317          * 
2318          * @param       void
2319          * @return      void
2320          */
2321         static private function action_usermanagement()
2322         {
2323                 global $member, $manager;
2324                 
2325                 // check if allowed
2326                 $member->isAdmin() or self::disallow();
2327                 
2328                 self::$skin->parse('usermanagement');
2329                 return;
2330         }
2331         
2332         /**
2333          * Admin::action_memberedit()
2334          * Edit member settings
2335          * 
2336          * @param       void
2337          * @return      void
2338          */
2339         static private function action_memberedit()
2340         {
2341                 self::action_editmembersettings(intRequestVar('memberid'));
2342                 return;
2343         }
2344         
2345         /**
2346          * Admin::action_editmembersettings()
2347          * 
2348          * @param       integer $memberid       ID for member
2349          * @return      void
2350          * 
2351          */
2352         static private function action_editmembersettings($memberid = '')
2353         {
2354                 global $member, $manager, $CONF;
2355                 
2356                 if ( $memberid == '' )
2357                 {
2358                         $memberid = $member->getID();
2359                 }
2360                 
2361                 /* TODO: we should consider to use the other way insterad of this */
2362                 $_REQUEST['memberid'] = $memberid;
2363                 
2364                 // check if allowed
2365                 ($member->getID() == $memberid) or $member->isAdmin() or self::disallow();
2366                 
2367                 self::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";
2368                 
2369                 self::$skin->parse('editmembersettings');
2370                 return;
2371         }
2372         
2373         /**
2374          * Admin::action_changemembersettings()
2375          * 
2376          * @param       void
2377          * @return      void
2378          */
2379         static private function action_changemembersettings()
2380         {
2381                 global $member, $CONF, $manager;
2382                 
2383                 $memberid = intRequestVar('memberid');
2384                 
2385                 // check if allowed
2386                 ($member->getID() == $memberid) or $member->isAdmin() or self::disallow();
2387                 
2388                 $name                   = trim(strip_tags(postVar('name')));
2389                 $realname               = trim(strip_tags(postVar('realname')));
2390                 $password               = postVar('password');
2391                 $repeatpassword = postVar('repeatpassword');
2392                 $email                  = strip_tags(postVar('email'));
2393                 $url                    = strip_tags(postVar('url'));
2394                 $adminskin              = intPostVar('adminskin');
2395                 $bookmarklet    = intPostVar('bookmarklet');
2396                 
2397                 // begin if: sometimes user didn't prefix the URL with http:// or https://, this cause a malformed URL. Let's fix it.
2398                 if ( !preg_match('#^https?://#', $url) )
2399                 {
2400                         $url = 'http://' . $url;
2401                 }
2402                 
2403                 $admin          = postVar('admin');
2404                 $canlogin       = postVar('canlogin');
2405                 $notes          = strip_tags(postVar('notes'));
2406                 $locale         = postVar('locale');
2407                 
2408                 $mem =& $manager->getMember($memberid);
2409                 
2410                 if ( $CONF['AllowLoginEdit'] || $member->isAdmin() )
2411                 {
2412                         if ( !isValidDisplayName($name) )
2413                         {
2414                                 self::error(_ERROR_BADNAME);
2415                                 return;
2416                         }
2417                         
2418                         if ( ($name != $mem->getDisplayName()) && Member::exists($name) )
2419                         {
2420                                 self::error(_ERROR_NICKNAMEINUSE);
2421                                 return;
2422                         }
2423                         
2424                         if ( $password != $repeatpassword )
2425                         {
2426                                 self::error(_ERROR_PASSWORDMISMATCH);
2427                                 return;
2428                         }
2429                         
2430                         if ( $password && (i18n::strlen($password) < 6) )
2431                         {
2432                                 self::error(_ERROR_PASSWORDTOOSHORT);
2433                                 return;
2434                         }
2435                                 
2436                         if ( $password )
2437                         {
2438                                 $pwdvalid = true;
2439                                 $pwderror = '';
2440                                 
2441                                 $data = array(
2442                                         'password'     => $password,
2443                                         'errormessage' => &$pwderror,
2444                                         'valid'        => &$pwdvalid
2445                                 );
2446                                 $manager->notify('PrePasswordSet', $data);
2447                                 
2448                                 if ( !$pwdvalid )
2449                                 {
2450                                         self::error($pwderror);
2451                                         return;
2452                                 }
2453                         }
2454                 }
2455                 
2456                 if ( !NOTIFICATION::address_validation($email) )
2457                 {
2458                         self::error(_ERROR_BADMAILADDRESS);
2459                         return;
2460                 }
2461                 if ( !$realname )
2462                 {
2463                         self::error(_ERROR_REALNAMEMISSING);
2464                         return;
2465                 }
2466                 if ( ($locale != '') && (!in_array($locale, i18n::get_available_locale_list())) )
2467                 {
2468                         self::error(_ERROR_NOSUCHTRANSLATION);
2469                         return;
2470                 }
2471                 
2472                 // check if there will remain at least one site member with both the logon and admin rights
2473                 // (check occurs when taking away one of these rights from such a member)
2474                 if (    (!$admin && $mem->isAdmin() && $mem->canLogin())
2475                         ||      (!$canlogin && $mem->isAdmin() && $mem->canLogin())
2476                         )
2477                 {
2478                         $r = DB::getResult('SELECT * FROM '.sql_table('member').' WHERE madmin=1 and mcanlogin=1');
2479                         if ( $r->rowCount() < 2 )
2480                         {
2481                                 self::error(_ERROR_ATLEASTONEADMIN);
2482                                 return;
2483                         }
2484                 }
2485                 
2486                 if ( $CONF['AllowLoginEdit'] || $member->isAdmin() )
2487                 {
2488                         $mem->setDisplayName($name);
2489                         if ( $password )
2490                         {
2491                                 $mem->setPassword($password);
2492                         }
2493                 }
2494                 
2495                 $oldEmail = $mem->getEmail();
2496                 
2497                 $mem->setRealName($realname);
2498                 $mem->setEmail($email);
2499                 $mem->setURL($url);
2500                 $mem->setNotes($notes);
2501                 $mem->setLocale($locale);
2502                 $mem->setAdminSkin($adminskin);
2503                 $mem->setBookmarklet($bookmarklet);
2504
2505                 // only allow super-admins to make changes to the admin status
2506                 if ( $member->isAdmin() )
2507                 {
2508                         $mem->setAdmin($admin);
2509                         $mem->setCanLogin($canlogin);
2510                 }
2511                 
2512                 $autosave = postVar('autosave');
2513                 $mem->setAutosave($autosave);
2514                 
2515                 $mem->write();
2516                 
2517                 // store plugin options
2518                 $aOptions = requestArray('plugoption');
2519                 NucleusPlugin::apply_plugin_options($aOptions);
2520                 $data = array(
2521                         'context'  => 'member',
2522                         'memberid' => $memberid,
2523                         'member'   => &$mem
2524                 );
2525                 $manager->notify('PostPluginOptionsUpdate', $data);
2526                 
2527                 // if email changed, generate new password
2528                 if ( $oldEmail != $mem->getEmail() )
2529                 {
2530                         $mem->sendActivationLink('addresschange', $oldEmail);
2531                         // logout member
2532                         $mem->newCookieKey();
2533                         
2534                         // only log out if the member being edited is the current member.
2535                         if ( $member->getID() == $memberid )
2536                         {
2537                                 $member->logout();
2538                         }
2539                         self::action_login(_MSG_ACTIVATION_SENT, 0);
2540                         return;
2541                 }
2542                 
2543                 if ( ($mem->getID() == $member->getID())
2544                         && ($mem->getDisplayName() != $member->getDisplayName()) )
2545                 {
2546                         $mem->newCookieKey();
2547                         $member->logout();
2548                         self::action_login(_MSG_LOGINAGAIN, 0);
2549                 }
2550                 else
2551                 {
2552                         self::action_overview(_MSG_SETTINGSCHANGED);
2553                 }
2554                 return;
2555         }
2556
2557         /**
2558          * Admin::action_memberadd()
2559          * 
2560          * @param       void
2561          * @return      void
2562          * 
2563          */
2564         static private function action_memberadd()
2565         {
2566                 global $member, $manager;
2567                 
2568                 // check if allowed
2569                 $member->isAdmin() or self::disallow();
2570                 
2571                 if ( postVar('password') != postVar('repeatpassword') )
2572                 {
2573                         self::error(_ERROR_PASSWORDMISMATCH);
2574                         return;
2575                 }
2576                 
2577                 if ( i18n::strlen(postVar('password')) < 6 )
2578                 {
2579                         self::error(_ERROR_PASSWORDTOOSHORT);
2580                         return;
2581                 }
2582                 
2583                 $res = Member::create(
2584                         postVar('name'),
2585                         postVar('realname'),
2586                         postVar('password'),
2587                         postVar('email'),
2588                         postVar('url'),
2589                         postVar('admin'),
2590                         postVar('canlogin'),
2591                         postVar('notes')
2592                 );
2593                 
2594                 if ( $res != 1 )
2595                 {
2596                         self::error($res);
2597                         return;
2598                 }
2599                 
2600                 // fire PostRegister event
2601                 $newmem = new Member();
2602                 $newmem->readFromName(postVar('name'));
2603                 $data = array(
2604                         'member' => &$newmem
2605                 );
2606                 $manager->notify('PostRegister', $data);
2607                 
2608                 self::action_usermanagement();
2609                 return;
2610         }
2611         
2612         /**
2613          * Admin::action_forgotpassword()
2614          * 
2615          * @param       void
2616          * @return      void
2617          */
2618         static private function action_forgotpassword()
2619         {
2620                 self::$skin->parse('forgotpassword');
2621                 return;
2622         }
2623         
2624         /**
2625          * Admin::action_activate()
2626          * Account activation
2627          * 
2628          * @param       void
2629          * @return      void
2630          */
2631         static private function action_activate()
2632         {
2633                 $key = getVar('key');
2634                 self::showActivationPage($key);
2635                 return;
2636         }
2637         
2638         /**
2639          * Admin::showActivationPage()
2640          * 
2641          * @param       void
2642          * @return      void
2643          */
2644         static private function showActivationPage($key, $message = '')
2645         {
2646                 global $manager;
2647                 
2648                 // clean up old activation keys
2649                 Member::cleanupActivationTable();
2650                 
2651                 // get activation info
2652                 $info = Member::getActivationInfo($key);
2653                 
2654                 if ( !$info )
2655                 {
2656                         self::error(_ERROR_ACTIVATE);
2657                         return;
2658                 }
2659                 
2660                 $mem =& $manager->getMember($info->vmember);
2661                 
2662                 if ( !$mem )
2663                 {
2664                         self::error(_ERROR_ACTIVATE);
2665                         return;
2666                 }
2667                 
2668                 /* TODO: we should consider to use the other way insterad of this */
2669                 $_POST['ackey']                                 = $key;
2670                 $_POST['bNeedsPasswordChange']  = TRUE;
2671                 
2672                 self::$headMess = $message;
2673                 self::$skin->parse('activate');
2674                 return;
2675         }
2676         
2677         /**
2678          * Admin::action_activatesetpwd()
2679          * Account activation - set password part
2680          * 
2681          * @param       void
2682          * @return      void
2683          */
2684         static private function action_activatesetpwd()
2685         {
2686                 global $manager;
2687                 $key = postVar('key');
2688                 
2689                 // clean up old activation keys
2690                 Member::cleanupActivationTable();
2691                 
2692                 // get activation info
2693                 $info = Member::getActivationInfo($key);
2694                 
2695                 if ( !$info || ($info->type == 'addresschange') )
2696                 {
2697                         return self::showActivationPage($key, _ERROR_ACTIVATE);
2698                 }
2699                 
2700                 $mem =& $manager->getMember($info->vmember);
2701                 
2702                 if ( !$mem )
2703                 {
2704                         return self::showActivationPage($key, _ERROR_ACTIVATE);
2705                 }
2706                 
2707                 $password               = postVar('password');
2708                 $repeatpassword = postVar('repeatpassword');
2709                 
2710                 if ( $password != $repeatpassword )
2711                 {
2712                         return self::showActivationPage($key, _ERROR_PASSWORDMISMATCH);
2713                 }
2714                 
2715                 if ( $password && (i18n::strlen($password) < 6) )
2716                 {
2717                         return self::showActivationPage($key, _ERROR_PASSWORDTOOSHORT);
2718                 }
2719                         
2720                 if ( $password )
2721                 {
2722                         $pwdvalid = true;
2723                         $pwderror = '';
2724                         
2725                         $data = array(
2726                                 'password'              => $password,
2727                                 'errormessage'  => &$pwderror,
2728                                 'valid'                 => &$pwdvalid
2729                         );
2730                         $manager->notify('PrePasswordSet', $data);
2731                         if ( !$pwdvalid )
2732                         {
2733                                 return self::showActivationPage($key,$pwderror);
2734                         }
2735                 }
2736                 
2737                 $error = '';
2738                 
2739                 $data = array(
2740                         'type'   => 'activation',
2741                         'member' => $mem,
2742                         'error'  => &$error
2743                 );
2744                 $manager->notify('ValidateForm', $data);
2745                 if ( $error != '' )
2746                 {
2747                         return self::showActivationPage($key, $error);
2748                 }
2749                 
2750                 // set password
2751                 $mem->setPassword($password);
2752                 $mem->write();
2753                 
2754                 // do the activation
2755                 Member::activate($key);
2756                 
2757                 self::$skin->parse('activatesetpwd');
2758                 return;
2759         }
2760         
2761         /**
2762          * Admin::action_manageteam()
2763          * Manage team
2764          * 
2765          * @param       void
2766          * @return      void
2767          */
2768         static private function action_manageteam()
2769         {
2770                 global $member, $manager;
2771                 
2772                 $blogid = intRequestVar('blogid');
2773                 
2774                 // check if allowed
2775                 $member->blogAdminRights($blogid) or self::disallow();
2776                 
2777                 self::$skin->parse('manageteam');
2778                 return;
2779         }
2780         
2781         /**
2782          * Admin::action_teamaddmember()
2783          * Add member to team
2784          * 
2785          * @param       void
2786          * @return      void
2787          */
2788         static private function action_teamaddmember()
2789         {
2790                 global $member, $manager;
2791                 
2792                 $memberid       = intPostVar('memberid');
2793                 $blogid         = intPostVar('blogid');
2794                 $admin          = intPostVar('admin');
2795                 
2796                 // check if allowed
2797                 $member->blogAdminRights($blogid) or self::disallow();
2798                 
2799                 $blog =& $manager->getBlog($blogid);
2800                 if ( !$blog->addTeamMember($memberid, $admin) )
2801                 {
2802                         self::error(_ERROR_ALREADYONTEAM);
2803                         return;
2804                 }
2805                 
2806                 self::action_manageteam();
2807                 return;
2808         }
2809         
2810         /**
2811          * Admin::action_teamdelete()
2812          * 
2813          * @param       void
2814          * @return      void
2815          */
2816         static private function action_teamdelete()
2817         {
2818                 global $member, $manager;
2819                 
2820                 $memberid       = intRequestVar('memberid');
2821                 $blogid         = intRequestVar('blogid');
2822                 
2823                 // check if allowed
2824                 $member->blogAdminRights($blogid) or self::disallow();
2825                 
2826                 $teammem =& $manager->getMember($memberid);
2827                 $blog =& $manager->getBlog($blogid);
2828                 
2829                 self::$skin->parse('teamdelete');
2830                 return;
2831         }
2832         
2833         /**
2834          * Admin::action_teamdeleteconfirm()
2835          * 
2836          * @param       void
2837          * @return      void
2838          */
2839         static private function action_teamdeleteconfirm()
2840         {
2841                 global $member;
2842                 
2843                 $memberid = intRequestVar('memberid');
2844                 $blogid = intRequestVar('blogid');
2845                 
2846                 $error = self::deleteOneTeamMember($blogid, $memberid);
2847                 if ( $error )
2848                 {
2849                         self::error($error);
2850                         return;
2851                 }
2852                 self::action_manageteam();
2853                 return;
2854         }
2855         
2856         /**
2857          * Admin::deleteOneTeamMember()
2858          * 
2859          * @param       void
2860          * @return      void
2861          */
2862         static public function deleteOneTeamMember($blogid, $memberid)
2863         {
2864                 global $member, $manager;
2865                 
2866                 $blogid   = intval($blogid);
2867                 $memberid = intval($memberid);
2868                 
2869                 // check if allowed
2870                 if ( !$member->blogAdminRights($blogid) )
2871                 {
2872                         return _ERROR_DISALLOWED;
2873                 }
2874                 
2875                 // check if: - there remains at least one blog admin
2876                 //           - (there remains at least one team member)
2877                 $tmem =& $manager->getMember($memberid);
2878                 
2879                 
2880                 $data = array(
2881                         'member' => &$tmem,
2882                         'blogid' => $blogid
2883                 );
2884                 $manager->notify('PreDeleteTeamMember', $data);
2885                 
2886                 if ( $tmem->isBlogAdmin($blogid) )
2887                 {
2888                         /* TODO: why we did double check? */
2889                         // check if there are more blog members left and at least one admin
2890                         // (check for at least two admins before deletion)
2891                         $query = "SELECT * FROM %s WHERE tblog=%d and tadmin=1;";
2892                         $query = sprintf($query, sql_table('team'), (integer) $blogid);
2893                         $r     = DB::getResult($query);
2894                         if ( $r->rowCount() < 2 )
2895                         {
2896                                 return _ERROR_ATLEASTONEBLOGADMIN;
2897                         }
2898                 }
2899                 
2900                 $query = "DELETE FROM %s WHERE tblog=%d AND tmember=%d;";
2901                 $query = sprintf($query, sql_table('team'), (integer) $blogid, (integer) $memberid);
2902                 DB::execute($query);
2903                 
2904                 $data = array(
2905                         'member' => &$tmem,
2906                         'blogid' => $blogid
2907                 );
2908                 $manager->notify('PostDeleteTeamMember', $data);
2909                 
2910                 return '';
2911         }
2912         
2913         /**
2914          * Admin::action_teamchangeadmin()
2915          * 
2916          * @param       void
2917          * @return      void
2918          */
2919         static private function action_teamchangeadmin()
2920         {
2921                 global $manager, $member;
2922                 
2923                 $blogid         = intRequestVar('blogid');
2924                 $memberid       = intRequestVar('memberid');
2925                 
2926                 // check if allowed
2927                 $member->blogAdminRights($blogid) or self::disallow();
2928                 
2929                 $mem =& $manager->getMember($memberid);
2930                 
2931                 // don't allow when there is only one admin at this moment
2932                 if ( $mem->isBlogAdmin($blogid) )
2933                 {
2934                         $query = "SELECT * FROM %s WHERE tblog=%d AND tadmin=1;";
2935                         $query = sprintf($query, sql_table('team'), (integer) $blogid);
2936                         $r = DB::getResult($query);
2937                         if ( $r->rowCount() == 1 )
2938                         {
2939                                 self::error(_ERROR_ATLEASTONEBLOGADMIN);
2940                                 return;
2941                         }
2942                 }
2943                 
2944                 if ( $mem->isBlogAdmin($blogid) )
2945                 {
2946                         $newval = 0;
2947                 }
2948                 else
2949                 {
2950                         $newval = 1;
2951                 }
2952                 
2953                 $query = "UPDATE %s SET tadmin=%d WHERE tblog=%d and tmember=%d;";
2954                 $query = sprintf($query, (integer) $blogid, (integer) $newval, (integer) $blogid, (integer) $memberid);
2955                 DB::execute($query);
2956                 
2957                 // only show manageteam if member did not change its own admin privileges
2958                 if ( $member->isBlogAdmin($blogid) )
2959                 {
2960                         self::action_manageteam();
2961                 }
2962                 else
2963                 {
2964                         self::action_overview(_MSG_ADMINCHANGED);
2965                 }
2966                 return;
2967         }
2968         
2969         /**
2970          * Admin::action_blogsettings()
2971          * 
2972          * @param       void
2973          * @return      void
2974          */
2975         static private function action_blogsettings()
2976         {
2977                 global $member, $manager;
2978                 
2979                 $blogid = intRequestVar('blogid');
2980                 
2981                 // check if allowed
2982                 $member->blogAdminRights($blogid) or self::disallow();
2983                 
2984                 $blog =& $manager->getBlog($blogid);
2985                 
2986                 self::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";
2987                 
2988                 self::$skin->parse('blogsettings');
2989                 return;
2990         }
2991         
2992         /**
2993          * Admin::action_categorynew()
2994          * 
2995          * @param       void
2996          * @return      void
2997          */
2998         static private function action_categorynew()
2999         {
3000                 global $member, $manager;
3001                 
3002                 $blogid = intRequestVar('blogid');
3003                 
3004                 $member->blogAdminRights($blogid) or self::disallow();
3005                 
3006                 $cname = postVar('cname');
3007                 $cdesc = postVar('cdesc');
3008                 
3009                 if ( !isValidCategoryName($cname) )
3010                 {
3011                         self::error(_ERROR_BADCATEGORYNAME);
3012                         return;
3013                 }
3014                 
3015                 $query = "SELECT * FROM %s WHERE cname=%s AND cblog=%d;";
3016                 $query = sprintf($query, sql_table('category'), DB::quoteValue($cname), (integer) $blogid);
3017                 $res = DB::getResult($query);
3018                 if ( $res->rowCount() > 0 )
3019                 {
3020                         self::error(_ERROR_DUPCATEGORYNAME);
3021                         return;
3022                 }
3023                 
3024                 $blog           =& $manager->getBlog($blogid);
3025                 $newCatID       =  $blog->createNewCategory($cname, $cdesc);
3026                 
3027                 self::action_blogsettings();
3028                 return;
3029         }
3030         
3031         /**
3032          * Admin::action_categoryedit()
3033          * 
3034          * @param       void
3035          * @return      void
3036          */
3037         static private function action_categoryedit($catid = '', $blogid = '', $desturl = '')
3038         {
3039                 global $member, $manager;
3040                 
3041                 if ( $blogid == '' )
3042                 {
3043                         $blogid = intGetVar('blogid');
3044                 }
3045                 else
3046                 {
3047                         $blogid = intval($blogid);
3048                 }
3049                 if ( $catid == '' )
3050                 {
3051                         $catid = intGetVar('catid');
3052                 }
3053                 else
3054                 {
3055                         $catid = intval($catid);
3056                 }
3057                 
3058                 /* TODO: we should consider to use the other way insterad of this */
3059                 $_REQUEST['blogid']             = $blogid;
3060                 $_REQUEST['catid']              = $catid;
3061                 $_REQUEST['desturl']    = $desturl;
3062                 $member->blogAdminRights($blogid) or self::disallow();
3063                 
3064                 self::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";
3065                 
3066                 self::$skin->parse('categoryedit');
3067                 return;
3068         }
3069         
3070         /**
3071          * Admin::action_categoryupdate()
3072          * 
3073          * @param       void
3074          * @return      void
3075          */
3076         static private function action_categoryupdate()
3077         {
3078                 global $member, $manager;
3079                 
3080                 $blogid         = intPostVar('blogid');
3081                 $catid          = intPostVar('catid');
3082                 $cname          = postVar('cname');
3083                 $cdesc          = postVar('cdesc');
3084                 $desturl        = postVar('desturl');
3085                 
3086                 $member->blogAdminRights($blogid) or self::disallow();
3087                 
3088                 if ( !isValidCategoryName($cname) )
3089                 {
3090                         self::error(_ERROR_BADCATEGORYNAME);
3091                         return;
3092                 }
3093                 
3094                 $query  = "SELECT * FROM %s WHERE cname=%s AND cblog=%d AND not(catid=%d);";
3095                 $query  = sprintf($query, sql_table('category'), DB::quoteValue($cname), (integer) $blogid, (integer) $catid);
3096                 $res    = DB::getResult($query);
3097                 if ( $res->rowCount() > 0 )
3098                 {
3099                         self::error(_ERROR_DUPCATEGORYNAME);
3100                         return;
3101                 }
3102                 
3103                 $query =  "UPDATE %s SET cname=%s, cdesc=%s WHERE catid=%d;";
3104                 $query = sprintf($query, sql_table('category'), DB::quoteValue($cname), DB::quoteValue($cdesc), (integer) $catid);
3105                 DB::execute($query);
3106                 
3107                 // store plugin options
3108                 $aOptions = requestArray('plugoption');
3109                 NucleusPlugin::apply_plugin_options($aOptions);
3110                 $data = array(
3111                         'context'       => 'category',
3112                         'catid'         => $catid
3113                 );
3114                 $manager->notify('PostPluginOptionsUpdate', $data);
3115                 
3116                 if ( $desturl )
3117                 {
3118                         redirect($desturl);
3119                         return;
3120                 }
3121                 
3122                 self::action_blogsettings();
3123                 
3124                 return;
3125         }
3126         
3127         /**
3128          * Admin::action_categorydelete()
3129          * 
3130          * @param       void
3131          * @return      void
3132          */
3133         static private function action_categorydelete()
3134         {
3135                 global $member, $manager;
3136                 
3137                 $blogid = intRequestVar('blogid');
3138                 $catid  = intRequestVar('catid');
3139                 
3140                 $member->blogAdminRights($blogid) or self::disallow();
3141                 
3142                 $blog =& $manager->getBlog($blogid);
3143                 
3144                 // check if the category is valid
3145                 if ( !$blog->isValidCategory($catid) )
3146                 {
3147                         self::error(_ERROR_NOSUCHCATEGORY);
3148                         return;
3149                 }
3150                 
3151                 // don't allow deletion of default category
3152                 if ( $blog->getDefaultCategory() == $catid )
3153                 {
3154                         self::error(_ERROR_DELETEDEFCATEGORY);
3155                         return;
3156                 }
3157                 
3158                 // check if catid is the only category left for blogid
3159                 $query = "SELECT catid FROM %s WHERE cblog=%d;";
3160                 $query = sprintf($query, sql_table('category'), $blogid);
3161                 $res = DB::getResult($query);
3162                 if ( $res->rowCount() == 1 )
3163                 {
3164                         self::error(_ERROR_DELETELASTCATEGORY);
3165                         return;
3166                 }
3167                 
3168                 self::$skin->parse('categorydelete');
3169 >>>>>>> skinnable-master
3170                 return;
3171         }
3172         
3173         /**
3174 <<<<<<< HEAD
3175          * Admin::action_browseownitems()
3176 =======
3177          * Admin::action_categorydeleteconfirm()
3178 >>>>>>> skinnable-master
3179          * 
3180          * @param       void
3181          * @return      void
3182          */
3183 <<<<<<< HEAD
3184         public function action_browseownitems()
3185         {
3186                 global $member, $manager, $CONF;
3187                 
3188                 $this->pagehead();
3189                 
3190                 echo '<p><a href="index.php?action=overview">(' . _BACKHOME . ")</a></p>\n";
3191                 echo '<h2>' . _ITEMLIST_YOUR . "</h2>\n";
3192                 
3193                 // start index
3194                 if ( postVar('start') )
3195                 {
3196                         $start = intPostVar('start');
3197                 }
3198                 else
3199                 {
3200                         $start = 0;
3201                 }
3202                 
3203                 // amount of items to show
3204                 if ( postVar('amount') )
3205                 {
3206                         $amount = intPostVar('amount');
3207                 }
3208                 else
3209                 {
3210                         $amount = (integer) $CONF['DefaultListSize'];
3211                         if ( $amount < 1 )
3212                         {
3213                                 $amount = 10;
3214                         }
3215                 }
3216                 
3217                 $search = postVar('search');    // search through items
3218                 
3219                 $query = 'SELECT bshortname, cname, mname, ititle, ibody, idraft, inumber, itime'
3220                        . ' FROM '.sql_table('item').', '.sql_table('blog') . ', '.sql_table('member') . ', '.sql_table('category')
3221                        . ' WHERE iauthor='. $member->getID() .' and iauthor=mnumber and iblog=bnumber and icat=catid';
3222                 
3223                 if ( $search )
3224                 {
3225                         $query .= " and ((ititle LIKE " . DB::quoteValue('%'.$search.'%') . ") or (ibody LIKE " . DB::quoteValue('%'.$search.'%') . ") or (imore LIKE " . DB::quoteValue('%'.$search.'%') . "))";
3226                 }
3227                 
3228                 $query .= ' ORDER BY itime DESC'
3229                         . " LIMIT $start, $amount";
3230                 
3231                 $template['content'] = 'itemlist';
3232                 $template['now'] = time();
3233                 
3234                 $manager->loadClass("ENCAPSULATE");
3235                 $navList = new NavList('browseownitems', $start, $amount, 0, 1000, /*$blogid*/ 0, $search, 0);
3236                 $navList->showBatchList('item',$query,'table',$template);
3237                 
3238                 $this->pagefoot();
3239 =======
3240         static private function action_categorydeleteconfirm()
3241         {
3242                 global $member, $manager;
3243                 
3244                 $blogid = intRequestVar('blogid');
3245                 $catid  = intRequestVar('catid');
3246                 
3247                 $member->blogAdminRights($blogid) or self::disallow();
3248                 
3249                 $error = self::deleteOneCategory($catid);
3250                 if ( $error )
3251                 {
3252                         self::error($error);
3253                         return;
3254                 }
3255                 
3256                 self::action_blogsettings();
3257                 return;
3258         }
3259         
3260         /**
3261          * Admin::deleteOneCategory()
3262          * Delete a category by its id
3263          * 
3264          * @param       String  $catid  category id for deleting
3265          * @return      Void
3266          */
3267         static public function deleteOneCategory($catid)
3268         {
3269                 global $manager, $member;
3270                 
3271                 $catid  = intval($catid);
3272                 $blogid = getBlogIDFromCatID($catid);
3273                 
3274                 if ( !$member->blogAdminRights($blogid) )
3275                 {
3276                         return ERROR_DISALLOWED;
3277                 }
3278                 
3279                 // get blog
3280                 $blog =& $manager->getBlog($blogid);
3281                 
3282                 // check if the category is valid
3283                 if ( !$blog || !$blog->isValidCategory($catid) )
3284                 {
3285                         return _ERROR_NOSUCHCATEGORY;
3286                 }
3287                 
3288                 $destcatid = $blog->getDefaultCategory();
3289                 
3290                 // don't allow deletion of default category
3291                 if ( $blog->getDefaultCategory() == $catid )
3292                 {
3293                         return _ERROR_DELETEDEFCATEGORY;
3294                 }
3295                 
3296                 // check if catid is the only category left for blogid
3297                 $query = "SELECT catid FROM %s WHERE cblog=%d;";
3298                 $query = sprintf($query, sql_table('category'), (integer) $blogid);
3299                 
3300                 $res = DB::getResult($query);
3301                 if ( $res->rowCount() == 1 )
3302                 {
3303                         return _ERROR_DELETELASTCATEGORY;
3304                 }
3305                 
3306                 $data = array('catid' => $catid);
3307                 $manager->notify('PreDeleteCategory', $data);
3308                 
3309                 // change category for all items to the default category
3310                 $query = "UPDATE %s SET icat=%d WHERE icat=%d;";
3311                 $query =sprintf($query, sql_table('item'), (integer) $destcatid, (integer) $catid);
3312                 DB::execute($query);
3313                 
3314                 // delete all associated plugin options
3315                 NucleusPlugin::delete_option_values('category', (integer) $catid);
3316                 
3317                 // delete category
3318                 $query = "DELETE FROM %s WHERE catid=%d;";
3319                 $query = sprintf($query, sql_table('category'), (integer) $catid);
3320                 DB::execute($query);
3321                 
3322                 $data = array('catid' => $catid);
3323                 $manager->notify('PostDeleteCategory', $data);
3324 >>>>>>> skinnable-master
3325                 return;
3326         }
3327         
3328         /**
3329 <<<<<<< HEAD
3330          * Admin::action_itemcommentlist()
3331          * 
3332          * Show all the comments for a given item
3333          * @param       integer $itemid ID for item
3334          * @return      void
3335          */
3336         public function action_itemcommentlist($itemid = '')
3337         {
3338                 global $member, $manager, $CONF;
3339                 
3340                 if ( $itemid == '' )
3341                 {
3342                         $itemid = intRequestVar('itemid');
3343                 }
3344                 
3345                 // only allow if user is allowed to alter item
3346                 $member->canAlterItem($itemid) or $this->disallow();
3347                 
3348                 $blogid = getBlogIdFromItemId($itemid);
3349                 
3350                 $this->pagehead();
3351                 
3352                 // start index
3353                 if ( postVar('start') )
3354                 {
3355                         $start = intPostVar('start');
3356                 }
3357                 else
3358                 {
3359                         $start = 0;
3360                 }
3361                 
3362                 // amount of items to show
3363                 if ( postVar('amount') )
3364                 {
3365                         $amount = intPostVar('amount');
3366                 }
3367                 else
3368                 {
3369                         $amount = (integer) $CONF['DefaultListSize'];
3370                         if ( $amount < 1 )
3371                         {
3372                                 $amount = 10;
3373                         }
3374                 }
3375                 
3376                 $search = postVar('search');
3377                 
3378                 echo '<p>(<a href="index.php?action=itemlist&amp;blogid=' . $blogid . '">' . _BACKTOOVERVIEW . "</a>)</p>\n";
3379                 echo '<h2>',_COMMENTS,'</h2>';
3380                 
3381                 $query = 'SELECT cbody, cuser, cmail, cemail, mname, ctime, chost, cnumber, cip, citem FROM ' . sql_table('comment') . ' LEFT OUTER JOIN ' . sql_table('member') . ' ON mnumber = cmember WHERE citem = ' . $itemid;
3382                 
3383                 if ( $search )
3384                 {
3385                         $query .= " and cbody LIKE " . DB::quoteValue('%'.$search.'%');
3386                 }
3387                 
3388                 $query .= ' ORDER BY ctime ASC'
3389                         . " LIMIT $start,$amount";
3390                 
3391                 $template['content'] = 'commentlist';
3392                 $template['canAddBan'] = $member->blogAdminRights(getBlogIDFromItemID($itemid));
3393                 
3394                 $manager->loadClass("ENCAPSULATE");
3395                 $navList = new NavList('itemcommentlist', $start, $amount, 0, 1000, 0, $search, $itemid);
3396                 $navList->showBatchList('comment',$query,'table',$template,_NOCOMMENTS);
3397                 
3398                 $this->pagefoot();
3399 =======
3400          * Admin::moveOneCategory()
3401          * Delete a category by its id
3402          * 
3403          * @param       int     $catid          category id for move
3404          * @param       int     $destblogid     blog id for destination
3405          * @return      void
3406          */
3407         static public function moveOneCategory($catid, $destblogid)
3408         {
3409                 global $manager, $member;
3410                 $catid      = intval($catid);
3411                 $destblogid = intval($destblogid);
3412                 $blogid     = getBlogIDFromCatID($catid);
3413                 // mover should have admin rights on both blogs
3414                 if (!$member->blogAdminRights($blogid)) {
3415                         return _ERROR_DISALLOWED;
3416                 }
3417                 if (!$member->blogAdminRights($destblogid)) {
3418                         return _ERROR_DISALLOWED;
3419                 }
3420                 // cannot move to self
3421                 if ($blogid == $destblogid) {
3422                         return _ERROR_MOVETOSELF;
3423                 }
3424                 // get blogs
3425                 $blog     =& $manager->getBlog($blogid);
3426                 $destblog =& $manager->getBlog($destblogid);
3427                 // check if the category is valid
3428                 if (!$blog || !$blog->isValidCategory($catid)) {
3429                         return _ERROR_NOSUCHCATEGORY;
3430                 }
3431                 // don't allow default category to be moved
3432                 if ($blog->getDefaultCategory() == $catid) {
3433                         return _ERROR_MOVEDEFCATEGORY;
3434                 }
3435                 $data = array(
3436                         'catid'                 => &$catid,
3437                         'sourceblog'    => &$blog,
3438                         'destblog'              => &$destblog
3439                 );
3440                 $manager->notify('PreMoveCategory', $data);
3441                 // update comments table (cblog)
3442                 $query = 'SELECT '
3443                 . '    inumber '
3444                 . 'FROM '
3445                 .      sql_table('item') . ' '
3446                 . 'WHERE '
3447                 . '    icat = %d';
3448                 $items = sql_query(sprintf($query, $catid));
3449                 while ($oItem = sql_fetch_object($items)) {
3450                         $query = 'UPDATE '
3451                         .      sql_table('comment') . ' '
3452                         . 'SET '
3453                         . '    cblog = %d' . ' '
3454                         . 'WHERE '
3455                         . '    citem = %d';
3456                         sql_query(sprintf($query, $destblogid, $oItem->inumber));
3457                 }
3458         
3459                 // update items (iblog)
3460                 $query = 'UPDATE '
3461                 .      sql_table('item') . ' '
3462                 . 'SET '
3463                 . '    iblog = %d '
3464                 . 'WHERE '
3465                 . '    icat = %d';
3466                 sql_query(sprintf($query, $destblogid, $catid));
3467         
3468                 // move category
3469                 $query = 'UPDATE '
3470                 .      sql_table('category') . ' '
3471                 . 'SET '
3472                 . '    cblog = %d' . ' '
3473                 . 'WHERE '
3474                 . '    catid = %d';
3475                 sql_query(sprintf($query, $destblogid, $catid));
3476                 
3477                 $data = array(
3478                         'catid'                 => &$catid,
3479                         'sourceblog'    => &$blog,
3480                         'destblog'              =>  $destblog
3481                 );
3482                 $manager->notify('PostMoveCategory', $data);
3483                 return;
3484         }
3485
3486         /**
3487          * Admin::action_blogsettingsupdate
3488          * Updating blog settings
3489          * 
3490          * @param       Void
3491          * @return      Void
3492          */
3493         static private function action_blogsettingsupdate()
3494         {
3495                 global $member, $manager;
3496                 
3497                 $blogid = intRequestVar('blogid');
3498                 
3499                 $member->blogAdminRights($blogid) or self::disallow();
3500                 
3501                 $blog =& $manager->getBlog($blogid);
3502                 
3503                 $notify_address = trim(postVar('notify'));
3504                 $shortname              = trim(postVar('shortname'));
3505                 $updatefile             = trim(postVar('update'));
3506                 
3507                 $notifyComment  = intPostVar('notifyComment');
3508                 $notifyVote             = intPostVar('notifyVote');
3509                 $notifyNewItem  = intPostVar('notifyNewItem');
3510                 
3511                 if ( $notifyComment == 0 )
3512                 {
3513                         $notifyComment = 1;
3514                 }
3515                 if ( $notifyVote == 0 )
3516                 {
3517                         $notifyVote = 1;
3518                 }
3519                 if ( $notifyNewItem == 0 )
3520                 {
3521                         $notifyNewItem = 1;
3522                 }
3523                 $notifyType = $notifyComment * $notifyVote * $notifyNewItem;
3524                 
3525                 if ( $notify_address && !NOTIFICATION::address_validation($notify_address) )
3526                 {
3527                         self::error(_ERROR_BADNOTIFY);
3528                         return;
3529                 }
3530                 
3531                 if ( !isValidShortName($shortname) )
3532                 {
3533                         self::error(_ERROR_BADSHORTBLOGNAME);
3534                         return;
3535                 }
3536                 
3537                 if ( ($blog->getShortName() != $shortname) && $manager->existsBlog($shortname) )
3538                 {
3539                         self::error(_ERROR_DUPSHORTBLOGNAME);
3540                         return;
3541                 }
3542                 // check if update file is writable
3543                 if ( $updatefile && !is_writeable($updatefile) )
3544                 {
3545                         self::error(_ERROR_UPDATEFILE);
3546                         return;
3547                 }
3548                 
3549                 $blog->setName(trim(postVar('name')));
3550                 $blog->setShortName($shortname);
3551                 $blog->setNotifyAddress($notify_address);
3552                 $blog->setNotifyType($notifyType);
3553                 $blog->setMaxComments(postVar('maxcomments'));
3554                 $blog->setCommentsEnabled(postVar('comments'));
3555                 $blog->setTimeOffset(postVar('timeoffset'));
3556                 $blog->setUpdateFile($updatefile);
3557                 $blog->setURL(trim(postVar('url')));
3558                 $blog->setDefaultSkin(intPostVar('defskin'));
3559                 $blog->setDescription(trim(postVar('desc')));
3560                 $blog->setPublic(postVar('public'));
3561                 $blog->setConvertBreaks(intPostVar('convertbreaks'));
3562                 $blog->setAllowPastPosting(intPostVar('allowpastposting'));
3563                 $blog->setDefaultCategory(intPostVar('defcat'));
3564                 $blog->setSearchable(intPostVar('searchable'));
3565                 $blog->setEmailRequired(intPostVar('reqemail'));
3566                 $blog->writeSettings();
3567                 
3568                 // store plugin options
3569                 $aOptions = requestArray('plugoption');
3570                 NucleusPlugin::apply_plugin_options($aOptions);
3571                 
3572                 $data = array(
3573                         'context' => 'blog',
3574                         'blogid'  => $blogid,
3575                         'blog'    => &$blog
3576                 );
3577                 $manager->notify('PostPluginOptionsUpdate', $data);
3578                 
3579                 self::action_overview(_MSG_SETTINGSCHANGED);
3580 >>>>>>> skinnable-master
3581                 return;
3582         }
3583         
3584         /**
3585 <<<<<<< HEAD
3586          * Admin::action_browseowncomments()
3587          * Browse own comments
3588 =======
3589          * Admin::action_deleteblog()
3590 >>>>>>> skinnable-master
3591          * 
3592          * @param       void
3593          * @return      void
3594          */
3595 <<<<<<< HEAD
3596         public function action_browseowncomments()
3597         {
3598                 global $member, $manager, $CONF;
3599                 
3600                 // start index
3601                 if ( postVar('start') )
3602                 {
3603                         $start = intPostVar('start');
3604                 }
3605                 else
3606                 {
3607                         $start = 0;
3608                 }
3609                 
3610                 // amount of items to show
3611                 if ( postVar('amount') )
3612                 {
3613                         $amount = intPostVar('amount');
3614                 }
3615                 else
3616                 {
3617                         $amount = intval($CONF['DefaultListSize']);
3618                         if ( $amount < 1 )
3619                         {
3620                                 $amount = 10;
3621                         }
3622                 }
3623                 
3624                 $search = postVar('search');
3625                 
3626                 $query =  'SELECT cbody, cuser, cmail, mname, ctime, chost, cnumber, cip, citem FROM '.sql_table('comment').' LEFT OUTER JOIN '.sql_table('member').' ON mnumber=cmember WHERE cmember=' . $member->getID();
3627                 
3628                 if ( $search )
3629                 {
3630                         $query .= " and cbody LIKE " . DB::quoteValue('%'.$search.'%');
3631                 }
3632                 
3633                 $query .= ' ORDER BY ctime DESC'
3634                         . " LIMIT $start,$amount";
3635                 
3636                 $this->pagehead();
3637                 
3638                 echo '<p><a href="index.php?action=overview">(' . _BACKHOME . ")</a></p>\n";
3639                 echo '<h2>' . _COMMENTS_YOUR . "</h2>\n";
3640                 
3641                 $template['content'] = 'commentlist';
3642                 $template['canAddBan'] = 0; // doesn't make sense to allow banning yourself
3643                 
3644                 $manager->loadClass("ENCAPSULATE");
3645                 $navList = new NavList('browseowncomments', $start, $amount, 0, 1000, 0, $search, 0);
3646                 $navList->showBatchList('comment',$query,'table',$template,_NOCOMMENTS_YOUR);
3647                 
3648                 $this->pagefoot();
3649 =======
3650         static private function action_deleteblog()
3651         {
3652                 global $member, $CONF, $manager;
3653                 
3654                 $blogid = intRequestVar('blogid');
3655                 
3656                 $member->blogAdminRights($blogid) or self::disallow();
3657                 
3658                 // check if blog is default blog
3659                 if ( $CONF['DefaultBlog'] == $blogid )
3660                 {
3661                         self::error(_ERROR_DELDEFBLOG);
3662                         return;
3663                 }
3664                 
3665                 $blog =& $manager->getBlog($blogid);
3666                 
3667                 self::$skin->parse('deleteblog');
3668                 return;
3669         }
3670         
3671         /**
3672          * Admin::action_deleteblogconfirm()
3673          * Delete Blog
3674          * 
3675          * @param       Void
3676          * @return      Void
3677          */
3678         static private function action_deleteblogconfirm()
3679         {
3680                 global $member, $CONF, $manager;
3681                 
3682                 $blogid = intRequestVar('blogid');
3683                 
3684                 $data = array('blogid' => $blogid);
3685                 $manager->notify('PreDeleteBlog', $data);
3686                 
3687                 $member->blogAdminRights($blogid) or self::disallow();
3688                 
3689                 // check if blog is default blog
3690                 if ( $CONF['DefaultBlog'] == $blogid )
3691                 {
3692                         self::error(_ERROR_DELDEFBLOG);
3693                         return;
3694                 }
3695                 
3696                 // delete all comments
3697                 $query = 'DELETE FROM ' . sql_table('comment') . ' WHERE cblog='.$blogid;
3698                 DB::execute($query);
3699                 
3700                 // delete all items
3701                 $query = 'DELETE FROM ' . sql_table('item') . ' WHERE iblog=' . $blogid;
3702                 DB::execute($query);
3703                 
3704                 // delete all team members
3705                 $query = 'DELETE FROM ' . sql_table('team') . ' WHERE tblog=' . $blogid;
3706                 DB::execute($query);
3707                 
3708                 // delete all bans
3709                 $query = 'DELETE FROM ' . sql_table('ban') . ' WHERE blogid=' . $blogid;
3710                 DB::execute($query);
3711                 
3712                 // delete all categories
3713                 $query = 'DELETE FROM ' . sql_table('category') . ' WHERE cblog=' . $blogid;
3714                 DB::execute($query);
3715                 
3716                 // delete all associated plugin options
3717                 NucleusPlugin::delete_option_values('blog', $blogid);
3718                 
3719                 // delete the blog itself
3720                 $query = 'DELETE FROM ' . sql_table('blog') . ' WHERE bnumber=' . $blogid;
3721                 DB::execute($query);
3722                 
3723                 $data = array('blogid' => $blogid);
3724                 $manager->notify('PostDeleteBlog', $data);
3725                 
3726                 self::action_overview(_DELETED_BLOG);
3727 >>>>>>> skinnable-master
3728                 return;
3729         }
3730         
3731         /**
3732 <<<<<<< HEAD
3733          * Admin::action_blogcommentlist()
3734          * 
3735          * Browse all comments for a weblog
3736          * @param       integer $blogid ID for weblog
3737          * @return      void
3738          */
3739         function action_blogcommentlist($blogid = '')
3740         {
3741                 global $member, $manager, $CONF;
3742                 
3743                 if ( $blogid == '' )
3744                 {
3745                         $blogid = intRequestVar('blogid');
3746                 }
3747                 else
3748                 {
3749                         $blogid = intval($blogid);
3750                 }
3751                 
3752                 $member->teamRights($blogid) or $member->isAdmin() or $this->disallow();
3753                 
3754                 // start index
3755                 if ( postVar('start') )
3756                 {
3757                         $start = intPostVar('start');
3758                 }
3759                 else
3760                 {
3761                         $start = 0;
3762                 }
3763                 
3764                 // amount of items to show
3765                 if ( postVar('amount') )
3766                 {
3767                         $amount = intPostVar('amount');
3768                 }
3769                 else
3770                 {
3771                         $amount = intval($CONF['DefaultListSize']);
3772                         if ( $amount < 1 )
3773                         {
3774                                 $amount = 10;
3775                         }
3776                 }
3777                 
3778                 $search = postVar('search');            // search through comments
3779                 
3780                 $query =  'SELECT cbody, cuser, cemail, cmail, mname, ctime, chost, cnumber, cip, citem FROM '.sql_table('comment').' LEFT OUTER JOIN '.sql_table('member').' ON mnumber=cmember WHERE cblog=' . intval($blogid);
3781                 
3782                 if ( $search != '' )
3783                 {
3784                         $query .= " and cbody LIKE " . DB::quoteValue('%'.$search.'%');
3785                 }
3786                 
3787                 $query .= ' ORDER BY ctime DESC'
3788                         . " LIMIT $start,$amount";
3789                 
3790                 $blog =& $manager->getBlog($blogid);
3791                 
3792                 $this->pagehead();
3793                 
3794                 echo '<p><a href="index.php?action=overview">(' . _BACKHOME . ")</a></p>\n";
3795                 echo '<h2>', _COMMENTS_BLOG , ' ' , $this->bloglink($blog), '</h2>';
3796                 
3797                 $template['content'] = 'commentlist';
3798                 $template['canAddBan'] = $member->blogAdminRights($blogid);
3799                 
3800                 $manager->loadClass("ENCAPSULATE");
3801                 $navList = new NavList('blogcommentlist', $start, $amount, 0, 1000, $blogid, $search, 0);
3802                 $navList->showBatchList('comment',$query,'table',$template, _NOCOMMENTS_BLOG);
3803                 
3804                 $this->pagefoot();
3805 =======
3806          * Admin::action_memberdelete()
3807          * 
3808          * @param       void
3809          * @return      void
3810          */
3811         static private function action_memberdelete()
3812         {
3813                 global $member, $manager;
3814                 
3815                 $memberid = intRequestVar('memberid');
3816                 
3817                 ($member->getID() == $memberid) or $member->isAdmin() or self::disallow();
3818                 
3819                 $mem =& $manager->getMember($memberid);
3820                 
3821                 self::$skin->parse('memberdelete');
3822                 return;
3823         }
3824         
3825         /**
3826          * Admin::action_memberdeleteconfirm()
3827          * 
3828          * @param       void
3829          * @return      void
3830          */
3831         static private function action_memberdeleteconfirm()
3832         {
3833                 global $member;
3834                 
3835                 $memberid = intRequestVar('memberid');
3836                 
3837                 ($member->getID() == $memberid) or $member->isAdmin() or self::disallow();
3838                 
3839                 $error = self::deleteOneMember($memberid);
3840                 if ( $error )
3841                 {
3842                         self::error($error);
3843                         return;
3844                 }
3845                 
3846                 if ( $member->isAdmin() )
3847                 {
3848                         self::action_usermanagement();
3849                         return;
3850                 }
3851                 else
3852                 {
3853                         self::action_overview(_DELETED_MEMBER);
3854                         return;
3855                 }
3856                 return;
3857         }
3858         
3859         /**
3860          * Admin::deleteOneMember()
3861          * Delete a member by id
3862          * 
3863          * @static
3864          * @params      Integer $memberid       member id
3865          * @return      String  null string or error messages
3866          */
3867         static public function deleteOneMember($memberid)
3868         {
3869                 global $manager;
3870                 
3871                 $memberid = intval($memberid);
3872                 $mem =& $manager->getMember($memberid);
3873                 
3874                 if ( !$mem->canBeDeleted() )
3875                 {
3876                         return _ERROR_DELETEMEMBER;
3877                 }
3878                 
3879                 $data = array('member' => &$mem);
3880                 $manager->notify('PreDeleteMember', $data);
3881                 
3882                 /* unlink comments from memberid */
3883                 if ( $memberid )
3884                 {
3885                         $query = "UPDATE %s SET cmember=0, cuser=%s WHERE cmember=%d;";
3886                         $query = sprintf($query, sql_table('comment'), DB::quoteValue($mem->getDisplayName()), $memberid);
3887                         DB::execute($query);
3888                 }
3889                 
3890                 $query = 'DELETE FROM ' . sql_table('member') . ' WHERE mnumber=' . $memberid;
3891                 DB::execute($query);
3892                 
3893                 $query = 'DELETE FROM ' . sql_table('team') . ' WHERE tmember=' . $memberid;
3894                 DB::execute($query);
3895                 
3896                 $query = 'DELETE FROM ' . sql_table('activation') . ' WHERE vmember=' . $memberid;
3897                 DB::execute($query);
3898                 
3899                 // delete all associated plugin options
3900                 NucleusPlugin::delete_option_values('member', $memberid);
3901                 
3902                 $data = array('member' => &$mem);
3903                 $manager->notify('PostDeleteMember', $data);
3904                 
3905                 return '';
3906         }
3907         
3908         /**
3909          * Admin::action_createnewlog()
3910          * 
3911          * @param       void
3912          * @return      void
3913          */
3914         static private function action_createnewlog()
3915         {
3916                 global $member, $CONF, $manager;
3917                 
3918                 // Only Super-Admins can do this
3919                 $member->isAdmin() or self::disallow();
3920                 
3921                 self::$skin->parse('createnewlog');
3922                 return;
3923         }
3924         
3925         /**
3926          * Admin::action_addnewlog()
3927          * 
3928          * @param       void
3929          * @return      void
3930          */
3931         static private function action_addnewlog()
3932         {
3933                 global $member, $manager, $CONF;
3934                 
3935                 // Only Super-Admins can do this
3936                 $member->isAdmin() or self::disallow();
3937                 
3938                 $bname                  = trim(postVar('name'));
3939                 $bshortname             = trim(postVar('shortname'));
3940                 $btimeoffset    = postVar('timeoffset');
3941                 $bdesc                  = trim(postVar('desc'));
3942                 $bdefskin               = postVar('defskin');
3943                 
3944                 if ( !isValidShortName($bshortname) )
3945                 {
3946                         self::error(_ERROR_BADSHORTBLOGNAME);
3947                         return;
3948                 }
3949                 
3950                 if ( $manager->existsBlog($bshortname) )
3951                 {
3952                         self::error(_ERROR_DUPSHORTBLOGNAME);
3953                         return;
3954                 }
3955                 
3956                 $data = array(
3957                         'name'        => &$bname,
3958                         'shortname'   => &$bshortname,
3959                         'timeoffset'  => &$btimeoffset,
3960                         'description' => &$bdesc,
3961                         'defaultskin' => &$bdefskin
3962                 );
3963                 $manager->notify('PreAddBlog', $data);
3964                 
3965                 // add slashes for sql queries
3966                 $bname                  = DB::quoteValue($bname);
3967                 $bshortname             = DB::quoteValue($bshortname);
3968                 $btimeoffset    = DB::quoteValue($btimeoffset);
3969                 $bdesc                  = DB::quoteValue($bdesc);
3970                 $bdefskin               = DB::quoteValue($bdefskin);
3971                 
3972                 // create blog
3973                 $query = "INSERT INTO %s (bname, bshortname, bdesc, btimeoffset, bdefskin) VALUES (%s, %s, %s, %s, %s);";
3974                 $query = sprintf($query, sql_table('blog'), $bname, $bshortname, $bdesc, $btimeoffset, $bdefskin);
3975                 DB::execute($query);
3976                 
3977                 $blogid = DB::getInsertId();
3978                 $blog   =& $manager->getBlog($blogid);
3979                 
3980                 // create new category
3981                 $catdefname = (!defined('_EBLOGDEFAULTCATEGORY_NAME') ? 'General' : _EBLOGDEFAULTCATEGORY_NAME);
3982                 $catdefdesc = (!defined('_EBLOGDEFAULTCATEGORY_DESC') ? 'Items that do not fit in other categories' : _EBLOGDEFAULTCATEGORY_DESC);
3983                 
3984                 $query = 'INSERT INTO %s (cblog, cname, cdesc) VALUES (%d, %s, %s)';
3985                 DB::execute(sprintf($query, sql_table('category'), (integer) $blogid, DB::quoteValue($catdefname), DB::quoteValue($catdefdesc)));
3986                 $catid = DB::getInsertId();
3987                 
3988                 // set as default category
3989                 $blog->setDefaultCategory($catid);
3990                 $blog->writeSettings();
3991                 
3992                 // create team member
3993                 $query = "INSERT INTO %s (tmember, tblog, tadmin) VALUES (%d, %d, 1);";
3994                 $query = sprintf($query, sql_table('team'), (integer) $member->getID(), (integer) $blogid);
3995                 DB::execute($query);
3996                 
3997                 $itemdeftitle = (defined('_EBLOG_FIRSTITEM_TITLE') ? _EBLOG_FIRSTITEM_TITLE : 'First Item');
3998                 $itemdefbody  = (defined('_EBLOG_FIRSTITEM_BODY')  ? _EBLOG_FIRSTITEM_BODY  : 'This is the first item in your weblog. Feel free to delete it.');
3999                 
4000                 $blog->additem(
4001                         $blog->getDefaultCategory(),
4002                         $itemdeftitle,$itemdefbody,
4003                         '',
4004                         $blogid,
4005                         $member->getID(),
4006                         $blog->getCorrectTime(),
4007                         0,
4008                         0,
4009                         0
4010                 );
4011                 
4012                 $data = array('blog' => &$blog);
4013                 $manager->notify('PostAddBlog', $data);
4014                 
4015                 $data = array(
4016                         'blog'                  => &$blog,
4017                         'name'                  => _EBLOGDEFAULTCATEGORY_NAME,
4018                         'description'   => _EBLOGDEFAULTCATEGORY_DESC,
4019                         'catid'                 => $catid
4020                 );
4021                 $manager->notify('PostAddCategory', $data);
4022                 
4023                 /* TODO: we should consider to use the other way insterad of this */
4024                 $_REQUEST['blogid'] = $blogid;
4025                 $_REQUEST['catid']  = $catid;
4026                 self::$skin->parse('addnewlog');
4027 >>>>>>> skinnable-master
4028                 return;
4029         }
4030         
4031         /**
4032 <<<<<<< HEAD
4033          * Admin::action_createitem()
4034          * Provide a page to item a new item to the given blog
4035 =======
4036          * Admin::action_addnewlog2()
4037 >>>>>>> skinnable-master
4038          * 
4039          * @param       void
4040          * @return      void
4041          */
4042 <<<<<<< HEAD
4043         public function action_createitem()
4044         {
4045                 global $member, $manager;
4046                 
4047                 $blogid = intRequestVar('blogid');
4048                 
4049                 // check if allowed
4050                 $member->teamRights($blogid) or $this->disallow();
4051                 
4052                 $memberid = $member->getID();
4053                 
4054                 $blog =& $manager->getBlog($blogid);
4055                 
4056                 // generate the add-item form
4057                 $handler = new PageFactory($blog);
4058                 
4059                 $contents = $handler->getTemplateFor('admin', 'add');
4060                 $manager->notify('PreAddItemForm', array('contents' => &$contents, 'blog' => &$blog));
4061                 
4062                 $parser = new Parser($handler);
4063                 
4064                 $this->pagehead();
4065                 $parser->parse($contents);
4066                 $this->pagefoot();
4067                 
4068 =======
4069         static private function action_addnewlog2()
4070         {
4071                 global $member, $manager;
4072                 $blogid = intRequestVar('blogid');
4073                 
4074                 $member->blogAdminRights($blogid) or self::disallow();
4075                 
4076                 $burl = requestVar('url');
4077                 
4078                 $blog =& $manager->getBlog($blogid);
4079                 $blog->setURL(trim($burl));
4080                 $blog->writeSettings();
4081                 
4082                 self::action_overview(_MSG_NEWBLOG);
4083                 return;
4084         }
4085         
4086         /**
4087          * Admin::action_skinieoverview()
4088          * 
4089          * @param       void
4090          * @return      void
4091          */
4092         static private function action_skinieoverview()
4093         {
4094                 global $member, $DIR_LIBS, $manager;
4095                 
4096                 $member->isAdmin() or self::disallow();
4097                 
4098                 include_once($DIR_LIBS . 'skinie.php');
4099                 
4100                 self::$skin->parse('skinieoverview');
4101 >>>>>>> skinnable-master
4102                 return;
4103         }
4104         
4105         /**
4106 <<<<<<< HEAD
4107          * Admin::action_itemedit()
4108 =======
4109          * Admin::action_skinieimport()
4110 >>>>>>> skinnable-master
4111          * 
4112          * @param       void
4113          * @return      void
4114          */
4115 <<<<<<< HEAD
4116         public function action_itemedit()
4117         {
4118                 global $member, $manager;
4119                 
4120                 $itemid = intRequestVar('itemid');
4121                 
4122                 // only allow if user is allowed to alter item
4123                 $member->canAlterItem($itemid) or $this->disallow();
4124                 
4125                 $variables =& $manager->getItem($itemid, 1, 1);
4126                 $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));
4127                 
4128                 $manager->notify('PrepareItemForEdit', array('item' => &$variables));
4129                 
4130                 if ( $blog->convertBreaks() )
4131                 {
4132                         $variables['body'] = removeBreaks($variables['body']);
4133                         $variables['more'] = removeBreaks($variables['more']);
4134                 }
4135                 
4136                 // form to edit blog items
4137                 $handler = new PageFactory($blog);
4138                 $handler->setVariables($variables);
4139                 
4140                 $content = $handler->getTemplateFor('admin', 'edit');
4141                 
4142                 $parser = new Parser($handler);
4143                 
4144                 $this->pagehead();
4145                 $parser->parse($content);
4146                 $this->pagefoot();
4147                 return;
4148         }
4149         
4150     /**
4151      * @todo document this
4152      */
4153     function action_itemupdate() {
4154         global $member, $manager, $CONF;
4155
4156         $itemid = intRequestVar('itemid');
4157         $catid = postVar('catid');
4158
4159         // only allow if user is allowed to alter item
4160         $member->canUpdateItem($itemid, $catid) or $this->disallow();
4161
4162         $actiontype = postVar('actiontype');
4163
4164         // delete actions are handled by itemdelete (which has confirmation)
4165         if ($actiontype == 'delete') {
4166             $this->action_itemdelete();
4167             return;
4168         }
4169
4170         $body   = postVar('body');
4171         $title  = postVar('title');
4172         $more   = postVar('more');
4173         $closed = intPostVar('closed');
4174         $draftid = intPostVar('draftid');
4175
4176         // default action = add now
4177         if (!$actiontype)
4178             $actiontype='addnow';
4179
4180         // create new category if needed
4181         if ( i18n::strpos($catid,'newcat') === 0 ) {
4182             // get blogid
4183             list($blogid) = sscanf($catid,"newcat-%d");
4184
4185             // create
4186             $blog =& $manager->getBlog($blogid);
4187             $catid = $blog->createNewCategory();
4188
4189             // show error when sth goes wrong
4190             if (!$catid)
4191                 $this->doError(_ERROR_CATCREATEFAIL);
4192         }
4193
4194         /*
4195             set some variables based on actiontype
4196
4197             actiontypes:
4198                 draft items -> addnow, addfuture, adddraft, delete
4199                 non-draft items -> edit, changedate, delete
4200
4201             variables set:
4202                 $timestamp: set to a nonzero value for future dates or date changes
4203                 $wasdraft: set to 1 when the item used to be a draft item
4204                 $publish: set to 1 when the edited item is not a draft
4205         */
4206         $blogid =  getBlogIDFromItemID($itemid);
4207         $blog   =& $manager->getBlog($blogid);
4208
4209         $wasdrafts = array('adddraft', 'addfuture', 'addnow');
4210         $wasdraft  = in_array($actiontype, $wasdrafts) ? 1 : 0;
4211         $publish   = ($actiontype != 'adddraft' && $actiontype != 'backtodrafts') ? 1 : 0;
4212         if ($actiontype == 'addfuture' || $actiontype == 'changedate') {
4213             $timestamp = mktime(intPostVar('hour'), intPostVar('minutes'), 0, intPostVar('month'), intPostVar('day'), intPostVar('year'));
4214         } else {
4215             $timestamp =0;
4216         }
4217
4218         // edit the item for real
4219         Item::update($itemid, $catid, $title, $body, $more, $closed, $wasdraft, $publish, $timestamp);
4220
4221         $this->updateFuturePosted($blogid);
4222
4223         if ($draftid > 0) {
4224             // delete permission is checked inside Item::delete()
4225             Item::delete($draftid);
4226         }
4227
4228         // show category edit window when we created a new category
4229         // ($catid will then be a new category ID, while postVar('catid') will be 'newcat-x')
4230         if ($catid != intPostVar('catid')) {
4231             $this->action_categoryedit(
4232                 $catid,
4233                 $blog->getID(),
4234                 $CONF['AdminURL'] . 'index.php?action=itemlist&blogid=' . getBlogIDFromItemID($itemid)
4235             );
4236         } else {
4237             // TODO: set start item correctly for itemlist
4238             $this->action_itemlist(getBlogIDFromItemID($itemid));
4239         }
4240     }
4241 =======
4242         static private function action_skinieimport()
4243         {
4244                 global $member;
4245                 
4246                 $member->isAdmin() or self::disallow();
4247                 
4248                 $skinFileRaw = postVar('skinfile');
4249                 $mode = postVar('mode');
4250                 
4251                 $error = self::skinieimport($mode, $skinFileRaw);
4252                 if ( $error )
4253                 {
4254                         self::error($error);
4255                         return;
4256                 }
4257                 
4258                 self::$skin->parse('skinieimport');
4259                 return;
4260         }
4261         
4262         /**
4263          * Admin::action_skiniedoimport()
4264          * 
4265          * @param       void
4266          * @return      void
4267          */
4268         static private function action_skiniedoimport()
4269         {
4270                 global $member, $DIR_LIBS, $DIR_SKINS;
4271                 
4272                 $member->isAdmin() or self::disallow();
4273                 
4274                 // load skinie class
4275                 include_once($DIR_LIBS . 'skinie.php');
4276                 
4277                 $mode = postVar('mode');
4278                 $skinFileRaw = postVar('skinfile');
4279                 $allowOverwrite = intPostVar('overwrite');
4280                 
4281                 $error = self::skiniedoimport($mode, $skinFileRaw, $allowOverwrite);
4282                 if ( $error )
4283                 {
4284                         self::error($msg);
4285                         return;
4286                 }
4287                 
4288                 self::$skin->parse('skiniedoimport');
4289                 return;
4290         }
4291         
4292         /**
4293          * Admin::action_skinieexport()
4294          * 
4295          * @param       void
4296          * @return      void
4297          */
4298         static private function action_skinieexport()
4299         {
4300                 global $member;
4301                 
4302                 $member->isAdmin() or self::disallow();
4303                 
4304                 $aSkins = requestIntArray('skin');
4305                 $aTemplates = requestIntArray('template');
4306                 $info = postVar('info');
4307                 
4308                 self::skinieexport($aSkins, $aTemplates, $info);
4309                 
4310                 return;
4311         }
4312         
4313         /**
4314          * Admin::action_templateoverview()
4315          * 
4316          * @param       void
4317          * @return      void
4318          */
4319         static private function action_templateoverview()
4320         {
4321                 global $member, $manager;
4322                 
4323                 $member->isAdmin() or self::disallow();
4324                 
4325                 self::$skin->parse('templateoverview');
4326                 return;
4327         }
4328         
4329         /**
4330          * Admin::action_templateedit()
4331          * 
4332          * @param       string  $msg    message for pageheader
4333          * @return      void
4334          */
4335         static private function action_templateedit($msg = '')
4336         {
4337                 global $member, $manager;
4338                 if ( $msg )
4339                 {
4340                         self::$headMess = $msg;
4341                 }
4342                 
4343                 $templateid = intRequestVar('templateid');
4344                 
4345                 $member->isAdmin() or self::disallow();
4346                 
4347                 self::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/templateEdit.js)%>\"></script>\n";
4348                 self::$extrahead .= "<script type=\"text/javascript\">setTemplateEditText('" . Entity::hsc(_EDITTEMPLATE_EMPTY) . "');</script>\n";
4349                 
4350                 self::$skin->parse('templateedit');
4351                 return;
4352         }
4353         
4354         /**
4355          * Admin::action_templateupdate()
4356          * 
4357          * @param       void
4358          * @return      void
4359          */
4360         static private function action_templateupdate()
4361         {
4362                 global $member,$manager;
4363                 
4364                 $templateid = intRequestVar('templateid');
4365                 
4366                 $member->isAdmin() or self::disallow();
4367                 
4368                 $name = postVar('tname');
4369                 $desc = postVar('tdesc');
4370                 
4371                 if ( !isValidTemplateName($name) )
4372                 {
4373                         self::error(_ERROR_BADTEMPLATENAME);
4374                         return;
4375                 }
4376                 
4377                 if ( (Template::getNameFromId($templateid) != $name) && Template::exists($name) )
4378                 {
4379                         self::error(_ERROR_DUPTEMPLATENAME);
4380                         return;
4381                 }
4382                 
4383                 // 1. Remove all template parts
4384                 $query = "DELETE FROM %s WHERE tdesc=%d;";
4385                 $query = sprintf($query, sql_table('template'), (integer) $templateid);
4386                 DB::execute($query);
4387                 
4388                 // 2. Update description
4389                 $query = "UPDATE %s SET tdname=%s, tddesc=%s WHERE tdnumber=%d;";
4390                 $query = sprintf($query, sql_table('template_desc'), DB::quoteValue($name), DB::quoteValue($desc), (integer) $templateid);
4391                 DB::execute($query);
4392                 
4393                 // 3. Add non-empty template parts
4394                 self::addToTemplate($templateid, 'ITEM_HEADER',                 postVar('ITEM_HEADER'));
4395                 self::addToTemplate($templateid, 'ITEM',                                postVar('ITEM'));
4396                 self::addToTemplate($templateid, 'ITEM_FOOTER',                 postVar('ITEM_FOOTER'));
4397                 self::addToTemplate($templateid, 'MORELINK',                    postVar('MORELINK'));
4398                 self::addToTemplate($templateid, 'EDITLINK',                    postVar('EDITLINK'));
4399                 self::addToTemplate($templateid, 'NEW',                                 postVar('NEW'));
4400                 self::addToTemplate($templateid, 'COMMENTS_HEADER',             postVar('COMMENTS_HEADER'));
4401                 self::addToTemplate($templateid, 'COMMENTS_BODY',               postVar('COMMENTS_BODY'));
4402                 self::addToTemplate($templateid, 'COMMENTS_FOOTER',             postVar('COMMENTS_FOOTER'));
4403                 self::addToTemplate($templateid, 'COMMENTS_CONTINUED',  postVar('COMMENTS_CONTINUED'));
4404                 self::addToTemplate($templateid, 'COMMENTS_TOOMUCH',    postVar('COMMENTS_TOOMUCH'));
4405                 self::addToTemplate($templateid, 'COMMENTS_AUTH',               postVar('COMMENTS_AUTH'));
4406                 self::addToTemplate($templateid, 'COMMENTS_ONE',                postVar('COMMENTS_ONE'));
4407                 self::addToTemplate($templateid, 'COMMENTS_MANY',               postVar('COMMENTS_MANY'));
4408                 self::addToTemplate($templateid, 'COMMENTS_NONE',               postVar('COMMENTS_NONE'));
4409                 self::addToTemplate($templateid, 'ARCHIVELIST_HEADER',  postVar('ARCHIVELIST_HEADER'));
4410                 self::addToTemplate($templateid, 'ARCHIVELIST_LISTITEM', postVar('ARCHIVELIST_LISTITEM'));
4411                 self::addToTemplate($templateid, 'ARCHIVELIST_FOOTER',  postVar('ARCHIVELIST_FOOTER'));
4412                 self::addToTemplate($templateid, 'BLOGLIST_HEADER',             postVar('BLOGLIST_HEADER'));
4413                 self::addToTemplate($templateid, 'BLOGLIST_LISTITEM',   postVar('BLOGLIST_LISTITEM'));
4414                 self::addToTemplate($templateid, 'BLOGLIST_FOOTER',             postVar('BLOGLIST_FOOTER'));
4415                 self::addToTemplate($templateid, 'CATLIST_HEADER',              postVar('CATLIST_HEADER'));
4416                 self::addToTemplate($templateid, 'CATLIST_LISTITEM',    postVar('CATLIST_LISTITEM'));
4417                 self::addToTemplate($templateid, 'CATLIST_FOOTER',              postVar('CATLIST_FOOTER'));
4418                 self::addToTemplate($templateid, 'DATE_HEADER',                 postVar('DATE_HEADER'));
4419                 self::addToTemplate($templateid, 'DATE_FOOTER',                 postVar('DATE_FOOTER'));
4420                 self::addToTemplate($templateid, 'FORMAT_DATE',                 postVar('FORMAT_DATE'));
4421                 self::addToTemplate($templateid, 'FORMAT_TIME',                 postVar('FORMAT_TIME'));
4422                 self::addToTemplate($templateid, 'SEARCH_HIGHLIGHT',    postVar('SEARCH_HIGHLIGHT'));
4423                 self::addToTemplate($templateid, 'SEARCH_NOTHINGFOUND', postVar('SEARCH_NOTHINGFOUND'));
4424                 self::addToTemplate($templateid, 'POPUP_CODE',                  postVar('POPUP_CODE'));
4425                 self::addToTemplate($templateid, 'MEDIA_CODE',                  postVar('MEDIA_CODE'));
4426                 self::addToTemplate($templateid, 'IMAGE_CODE',                  postVar('IMAGE_CODE'));
4427                 
4428                 $data = array('fields' => array());
4429                 $manager->notify('TemplateExtraFields', $data);
4430                 foreach ( $data['fields'] as $pfkey=>$pfvalue )
4431                 {
4432                         foreach ( $pfvalue as $pffield => $pfdesc )
4433                         {
4434                                 self::addToTemplate($templateid, $pffield, postVar($pffield));
4435                         }
4436                 }
4437                 
4438                 // jump back to template edit
4439                 self::action_templateedit(_TEMPLATE_UPDATED);
4440                 return;
4441         }
4442         
4443         /**
4444          * Admin::addToTemplate()
4445          * 
4446          * @param       Integer $id     ID for template
4447          * @param       String  $partname       parts name
4448          * @param       String  $content        template contents
4449          * @return      Integer record index
4450          * 
4451          */
4452         static private function addToTemplate($id, $partname, $content)
4453         {
4454                 // don't add empty parts:
4455                 if ( !trim($content) )
4456                 {
4457                         return -1;
4458                 }
4459                 
4460                 $query = "INSERT INTO %s (tdesc, tpartname, tcontent) VALUES (%d, %s, %s);";
4461                 $query = sprintf($query, sql_table('template'), (integer) $id, DB::quoteValue($partname), DB::quoteValue($content));
4462                 if ( DB::execute($query) === FALSE )
4463                 {
4464                         $err = DB::getError();
4465                         exit(_ADMIN_SQLDIE_QUERYERROR . $err[2]);
4466                 }
4467                 return DB::getInsertId();
4468         }
4469         
4470         /**
4471          * Admin::action_templatedelete()
4472          * 
4473          * @param       void
4474          * @return      void
4475          */
4476         static private function action_templatedelete()
4477         {
4478                 global $member, $manager;
4479                 
4480                 $member->isAdmin() or self::disallow();
4481                 
4482                 $templateid = intRequestVar('templateid');
4483                 // TODO: check if template can be deleted
4484                 
4485                 self::$skin->parse('templatedelete');
4486                 return;
4487         }
4488 >>>>>>> skinnable-master
4489         
4490         /**
4491          * Admin::action_templatedeleteconfirm()
4492          * 
4493          * @param       void
4494          * @return      void
4495          */
4496         static private function action_templatedeleteconfirm()
4497         {
4498                 global $member, $manager;
4499                 
4500                 $templateid = intRequestVar('templateid');
4501                 
4502                 $member->isAdmin() or self::disallow();
4503                 
4504                 $data = array('templateid' => $templateid);
4505                 $manager->notify('PreDeleteTemplate', $data);
4506                 
4507                 // 1. delete description
4508                 DB::execute('DELETE FROM ' . sql_table('template_desc') . ' WHERE tdnumber=' . $templateid);
4509                 
4510                 // 2. delete parts
4511                 DB::execute('DELETE FROM ' . sql_table('template') . ' WHERE tdesc=' . $templateid);
4512                 
4513                 
4514                 $data = array('templateid' => $templateid);
4515                 $manager->notify('PostDeleteTemplate', $data);
4516                 
4517                 self::action_templateoverview();
4518                 return;
4519         }
4520         
4521         /**
4522          * Admin::action_templatenew()
4523          * 
4524          * @param       void
4525          * @return      void
4526          */
4527         static private function action_templatenew()
4528         {
4529                 global $member;
4530                 
4531                 $member->isAdmin() or self::disallow();
4532                 
4533 <<<<<<< HEAD
4534                 $query = "SELECT * FROM %s WHERE iblog=%d AND iposted=0 AND itime>%s";
4535                 $query = sprintf($query, sql_table('item'), (integer) $blogid, DB::formatDateTime($currenttime));
4536                 $result = DB::getResult($query);
4537                 
4538                 if ( $result->rowCount() > 0 )
4539 =======
4540                 $name = postVar('name');
4541                 $desc = postVar('desc');
4542                 
4543                 if ( !isValidTemplateName($name) )
4544 >>>>>>> skinnable-master
4545                 {
4546                         self::error(_ERROR_BADTEMPLATENAME);
4547                         return;
4548                 }
4549                 
4550                 if ( Template::exists($name) )
4551                 {
4552                         self::error(_ERROR_DUPTEMPLATENAME);
4553                         return;
4554                 }
4555                 
4556                 $newTemplateId = Template::createNew($name, $desc);
4557                 
4558                 self::action_templateoverview();
4559                 return;
4560         }
4561 <<<<<<< HEAD
4562
4563     /**
4564      * @todo document this
4565      */
4566     function action_itemmove() {
4567         global $member, $manager;
4568
4569         $itemid = intRequestVar('itemid');
4570
4571         // only allow if user is allowed to alter item
4572         $member->canAlterItem($itemid) or $this->disallow();
4573
4574         $item =& $manager->getItem($itemid,1,1);
4575
4576         $this->pagehead();
4577         ?>
4578             <h2><?php echo _MOVE_TITLE ?></h2>
4579             <form method="post" action="index.php"><div>
4580                 <input type="hidden" name="action" value="itemmoveto" />
4581                 <input type="hidden" name="itemid" value="<?php echo  $itemid; ?>" />
4582
4583                 <?php
4584
4585                     $manager->addTicketHidden();
4586                     $this->selectBlogCategory('catid',$item['catid'],10,1);
4587                 ?>
4588
4589                 <input type="submit" value="<?php echo _MOVE_BTN ?>" tabindex="10000" onclick="return checkSubmit();" />
4590             </div></form>
4591         <?php
4592         $this->pagefoot();
4593     }
4594
4595     /**
4596      * @todo document this
4597      */
4598     function action_itemmoveto() {
4599         global $member, $manager;
4600
4601         $itemid = intRequestVar('itemid');
4602         $catid = requestVar('catid');
4603
4604         // create new category if needed
4605         if ( i18n::strpos($catid,'newcat') === 0 ) {
4606             // get blogid
4607             list($blogid) = sscanf($catid,'newcat-%d');
4608
4609             // create
4610             $blog =& $manager->getBlog($blogid);
4611             $catid = $blog->createNewCategory();
4612
4613             // show error when sth goes wrong
4614             if (!$catid)
4615                 $this->doError(_ERROR_CATCREATEFAIL);
4616         }
4617
4618         // only allow if user is allowed to alter item
4619         $member->canUpdateItem($itemid, $catid) or $this->disallow();
4620
4621         $old_blogid = getBlogIDFromItemId($itemid);
4622
4623         Item::move($itemid, $catid);
4624
4625         // set the futurePosted flag on the blog
4626         $this->updateFuturePosted(getBlogIDFromItemId($itemid));
4627
4628         // reset the futurePosted in case the item is moved from one blog to another
4629         $this->updateFuturePosted($old_blogid);
4630
4631         if ($catid != intRequestVar('catid'))
4632             $this->action_categoryedit($catid, $blog->getID());
4633         else
4634             $this->action_itemlist(getBlogIDFromCatID($catid));
4635     }
4636
4637     /**
4638      * Moves one item to a given category (category existance should be checked by caller)
4639      * errors are returned
4640      * @param int $itemid
4641      * @param int $destCatid category ID to which the item will be moved
4642      */
4643     function moveOneItem($itemid, $destCatid) {
4644         global $member;
4645
4646         // only allow if user is allowed to move item
4647         if (!$member->canUpdateItem($itemid, $destCatid))
4648             return _ERROR_DISALLOWED;
4649
4650         Item::move($itemid, $destCatid);
4651     }
4652
4653     /**
4654      * Adds a item to the chosen blog
4655      */
4656     function action_additem() {
4657         global $manager, $CONF;
4658
4659         $manager->loadClass('ITEM');
4660
4661         $result = Item::createFromRequest();
4662
4663         if ($result['status'] == 'error')
4664             $this->error($result['message']);
4665
4666         $blogid = getBlogIDFromItemID($result['itemid']);
4667         $blog =& $manager->getBlog($blogid);
4668         $btimestamp = $blog->getCorrectTime();
4669         $item       = $manager->getItem(intval($result['itemid']), 1, 1);
4670
4671         if ($result['status'] == 'newcategory') {
4672             $distURI = $manager->addTicketToUrl($CONF['AdminURL'] . 'index.php?action=itemList&blogid=' . intval($blogid));
4673             $this->action_categoryedit($result['catid'], $blogid, $distURI);
4674         } else {
4675             $methodName = 'action_itemList';
4676             call_user_func(array(&$this, $methodName), $blogid);
4677         }
4678     }
4679
4680         /**
4681          * Allows to edit previously made comments
4682          **/
4683         function action_commentedit() {
4684
4685                 global $member, $manager;
4686
4687                 $commentid = intRequestVar('commentid');
4688
4689                 $member->canAlterComment($commentid) or $this->disallow();
4690
4691                 $comment = Comment::getComment($commentid);
4692
4693                 $manager->notify('PrepareCommentForEdit', array('comment' => &$comment) );
4694
4695                 // change <br /> to \n
4696                 $comment['body'] = str_replace('<br />', '', $comment['body']);
4697
4698                 // replaced eregi_replace() below with preg_replace(). ereg* functions are deprecated in PHP 5.3.0
4699                 /* original eregi_replace: eregi_replace("<a href=['\"]([^'\"]+)['\"]( rel=\"nofollow\") ?>[^<]*</a>", "\\1", $comment['body']) */
4700
4701         $comment['body'] = preg_replace("#<a href=['\"]([^'\"]+)['\"]( rel=\"nofollow\") ?>[^<]*</a>#i", "\\1", $comment['body']);
4702
4703         $this->pagehead();
4704
4705         ?>
4706         <h2><?php echo _EDITC_TITLE ?></h2>
4707
4708         <form action="index.php" method="post"><div>
4709
4710         <input type="hidden" name="action" value="commentupdate" />
4711         <?php $manager->addTicketHidden(); ?>
4712         <input type="hidden" name="commentid" value="<?php echo  $commentid; ?>" />
4713         <table><tr>
4714             <th colspan="2"><?php echo _EDITC_TITLE ?></th>
4715         </tr><tr>
4716             <td><?php echo _EDITC_WHO ?></td>
4717             <td>
4718             <?php               if ($comment['member'])
4719                     echo $comment['member'] . " (" . _EDITC_MEMBER . ")";
4720                 else
4721                     echo $comment['user'] . " (" . _EDITC_NONMEMBER . ")";
4722             ?>
4723             </td>
4724         </tr><tr>
4725             <td><?php echo _EDITC_WHEN ?></td>
4726             <td><?php echo  date("Y-m-d @ H:i",$comment['timestamp']); ?></td>
4727         </tr><tr>
4728             <td><?php echo _EDITC_HOST ?></td>
4729             <td><?php echo  $comment['host']; ?></td>
4730         </tr>
4731         <tr>
4732             <td><?php echo _EDITC_URL; ?></td>
4733             <td><input type="text" name="url" size="30" tabindex="6" value="<?php echo $comment['userid']; ?>" /></td>
4734         </tr>
4735         <tr>
4736             <td><?php echo _EDITC_EMAIL; ?></td>
4737             <td><input type="text" name="email" size="30" tabindex="8" value="<?php echo $comment['email']; ?>" /></td>
4738         </tr>
4739         <tr>
4740             <td><?php echo _EDITC_TEXT ?></td>
4741             <td>
4742                 <textarea name="body" tabindex="10" rows="10" cols="50"><?php                   // htmlspecialchars not needed (things should be escaped already)
4743                     echo $comment['body'];
4744                 ?></textarea>
4745             </td>
4746         </tr><tr>
4747             <td><?php echo _EDITC_EDIT ?></td>
4748             <td><input type="submit"  tabindex="20" value="<?php echo _EDITC_EDIT ?>" onclick="return checkSubmit();" /></td>
4749         </tr></table>
4750
4751         </div></form>
4752         <?php
4753         $this->pagefoot();
4754     }
4755
4756     /**
4757      * @todo document this
4758      */
4759     function action_commentupdate() {
4760         global $member, $manager;
4761
4762         $commentid = intRequestVar('commentid');
4763
4764         $member->canAlterComment($commentid) or $this->disallow();
4765
4766         $url = postVar('url');
4767         $email = postVar('email');
4768         $body = postVar('body');
4769
4770                 # replaced eregi() below with preg_match(). ereg* functions are deprecated in PHP 5.3.0
4771                 # original eregi: eregi("[a-zA-Z0-9|\.,;:!\?=\/\\]{90,90}", $body) != FALSE
4772                 # important note that '\' must be matched with '\\\\' in preg* expressions
4773
4774                 // intercept words that are too long
4775                 if (preg_match('#[a-zA-Z0-9|\.,;:!\?=\/\\\\]{90,90}#', $body) != FALSE)
4776 =======
4777         
4778         /**
4779          * Admin::action_templateclone()
4780          * 
4781          * @param       void
4782          * @return      void
4783          */
4784         static private function action_templateclone()
4785         {
4786                 global $member;
4787                 
4788                 $templateid = intRequestVar('templateid');
4789                 
4790                 $member->isAdmin() or self::disallow();
4791                 
4792                 // 1. read old template
4793                 $name = Template::getNameFromId($templateid);
4794                 $desc = Template::getDesc($templateid);
4795                 
4796                 // 2. create desc thing
4797                 $name = "cloned" . $name;
4798                 
4799                 // if a template with that name already exists:
4800                 if ( Template::exists($name) )
4801 >>>>>>> skinnable-master
4802                 {
4803                         $i = 1;
4804                         while (Template::exists($name . $i))
4805                         {
4806                                 $i++;
4807                         }
4808                         $name .= $i;
4809                 }
4810                 
4811                 $newid = Template::createNew($name, $desc);
4812                 
4813                 // 3. create clone
4814                 // go through parts of old template and add them to the new one
4815                 $query = "SELECT tpartname, tcontent FROM %s WHERE tdesc=%d;";
4816                 $query = sprintf($query, sql_table('template'), (integer) $templateid);
4817                 
4818                 $res = DB::getResult($query);
4819                 foreach ( $res as $row)
4820                 {
4821                         self::addToTemplate($newid, $row['tpartname'], $row['tcontent']);
4822                 }
4823                 
4824                 self::action_templateoverview();
4825                 return;
4826         }
4827         
4828         /**
4829          * Admin::action_admintemplateoverview()
4830          * 
4831          * @param       void
4832          * @return      void
4833          */
4834         static private function action_admintemplateoverview()
4835         {
4836                 global $member;
4837                 $member->isAdmin() or self::disallow();
4838                 self::$skin->parse('admntemplateoverview');
4839                 return;
4840         }
4841         
4842         /**
4843          * Admin::action_admintemplateedit()
4844          * 
4845          * @param       string  $msg    message for pageheader
4846          * @return      void
4847          */
4848         static private function action_admintemplateedit($msg = '')
4849         {
4850                 global $member, $manager;
4851                 if ( $msg )
4852                 {
4853                         self::$headMess = $msg;
4854                 }
4855 <<<<<<< HEAD
4856
4857                 // prepare body
4858                 $body = Comment::prepareBody($body);
4859
4860                 // call plugins
4861                 $manager->notify('PreUpdateComment',array('body' => &$body));
4862
4863                 $query = 'UPDATE ' . sql_table('comment')
4864                         . ' SET cmail = ' . DB::quoteValue($url) . ', cemail = ' . DB::quoteValue($email) . ', cbody = ' . DB::quoteValue($body)
4865                         . ' WHERE cnumber = ' . $commentid;
4866                 DB::execute($query);
4867
4868                 // get itemid
4869                 $res = DB::getValue('SELECT citem FROM '.sql_table('comment').' WHERE cnumber=' . $commentid);
4870                 $itemid = $res;
4871
4872                 if ($member->canAlterItem($itemid))
4873                         $this->action_itemcommentlist($itemid);
4874                 else
4875                         $this->action_browseowncomments();
4876
4877     }
4878 =======
4879                 $member->isAdmin() or self::disallow();
4880                 
4881                 self::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/templateEdit.js)%>\"></script>\n";
4882                 self::$extrahead .= '<script type="text/javascript">setTemplateEditText("' . Entity::hsc(_EDITTEMPLATE_EMPTY) . '");</script>' . "\n";
4883                 
4884                 self::$skin->parse('admintemplateedit');
4885                 return;
4886         }
4887 >>>>>>> skinnable-master
4888         
4889         /**
4890          * Admin::action_admintemplateupdate()
4891          * 
4892          * @param       void
4893          * @return      void
4894          */
4895         static private function action_admintemplateupdate()
4896         {
4897                 global $member, $manager;
4898                 $templateid = intRequestVar('templateid');
4899                 $member->isAdmin() or self::disallow();
4900                 $name = postVar('tname');
4901                 $desc = postVar('tdesc');
4902                 
4903                 if ( !isValidTemplateName($name) )
4904                 {
4905                         self::error(_ERROR_BADTEMPLATENAME);
4906                         return;
4907                 }
4908                 
4909                 if ( (Template::getNameFromId($templateid) != $name) && Template::exists($name) )
4910                 {
4911                         self::error(_ERROR_DUPTEMPLATENAME);
4912                         return;
4913                 }
4914                 
4915                 // 1. Remove all template parts
4916                 $query = "DELETE FROM %s WHERE tdesc=%d;";
4917                 $query = sprintf($query, sql_table('template'), (integer) $templateid);
4918                 DB::execute($query);
4919                 
4920                 // 2. Update description
4921                 $query = "UPDATE %s SET tdname=%s, tddesc=%s WHERE tdnumber=%d;";
4922                 $query = sprintf($query, sql_table('template_desc'), DB::quoteValue($name), DB::quoteValue($desc), (integer) $templateid);
4923                 DB::execute($query);
4924                 
4925                 // 3. Add non-empty template parts
4926                 self::addToTemplate($templateid, 'NORMALSKINLIST_HEAD',                                         postVar('NORMALSKINLIST_HEAD'));
4927                 self::addToTemplate($templateid, 'NORMALSKINLIST_BODY',                                         postVar('NORMALSKINLIST_BODY'));
4928                 self::addToTemplate($templateid, 'NORMALSKINLIST_FOOT',                                         postVar('NORMALSKINLIST_FOOT'));
4929                 self::addToTemplate($templateid, 'ADMIN_CUSTOMHELPLINK_ICON',                           postVar('ADMIN_CUSTOMHELPLINK_ICON'));
4930                 self::addToTemplate($templateid, 'ADMIN_CUSTOMHELPLINK_ANCHOR',                         postVar('ADMIN_CUSTOMHELPLINK_ANCHOR'));
4931                 self::addToTemplate($templateid, 'ADMIN_BLOGLINK',                                                      postVar('ADMIN_BLOGLINK'));
4932                 self::addToTemplate($templateid, 'ADMIN_BATCHLIST',                                                     postVar('ADMIN_BATCHLIST'));
4933                 self::addToTemplate($templateid, 'ACTIVATE_FORGOT_TITLE',                                       postVar('ACTIVATE_FORGOT_TITLE'));
4934                 self::addToTemplate($templateid, 'ACTIVATE_FORGOT_TEXT',                                        postVar('ACTIVATE_FORGOT_TEXT'));
4935                 self::addToTemplate($templateid, 'ACTIVATE_REGISTER_TITLE',                                     postVar('ACTIVATE_REGISTER_TITLE'));
4936                 self::addToTemplate($templateid, 'ACTIVATE_REGISTER_TEXT',                                      postVar('ACTIVATE_REGISTER_TEXT'));
4937                 self::addToTemplate($templateid, 'ACTIVATE_CHANGE_TITLE',                                       postVar('ACTIVATE_CHANGE_TITLE'));
4938                 self::addToTemplate($templateid, 'ACTIVATE_CHANGE_TEXT',                                        postVar('ACTIVATE_CHANGE_TEXT'));
4939                 self::addToTemplate($templateid, 'TEMPLATE_EDIT_EXPLUGNAME',                            postVar('TEMPLATE_EDIT_EXPLUGNAME'));
4940                 self::addToTemplate($templateid, 'TEMPLATE_EDIT_ROW_HEAD',                                      postVar('TEMPLATE_EDIT_ROW_HEAD'));
4941                 self::addToTemplate($templateid, 'TEMPLATE_EDIT_ROW_TAIL',                                      postVar('TEMPLATE_EDIT_ROW_TAIL'));
4942                 self::addToTemplate($templateid, 'SPECIALSKINLIST_HEAD',                                        postVar('SPECIALSKINLIST_HEAD'));
4943                 self::addToTemplate($templateid, 'SPECIALSKINLIST_BODY',                                        postVar('SPECIALSKINLIST_BODY'));
4944                 self::addToTemplate($templateid, 'SPECIALSKINLIST_FOOT',                                        postVar('SPECIALSKINLIST_FOOT'));
4945                 self::addToTemplate($templateid, 'SYSTEMINFO_GDSETTINGS',                                       postVar('SYSTEMINFO_GDSETTINGS'));
4946                 self::addToTemplate($templateid, 'BANLIST_DELETED_LIST',                                        postVar('BANLIST_DELETED_LIST'));
4947                 self::addToTemplate($templateid, 'INSERT_PLUGOPTION_TITLE',                                     postVar('INSERT_PLUGOPTION_TITLE'));
4948                 self::addToTemplate($templateid, 'INSERT_PLUGOPTION_BODY',                                      postVar('INSERT_PLUGOPTION_BODY'));
4949                 self::addToTemplate($templateid, 'INPUTYESNO_TEMPLATE_ADMIN',                           postVar('INPUTYESNO_TEMPLATE_ADMIN'));
4950                 self::addToTemplate($templateid, 'INPUTYESNO_TEMPLATE_NORMAL',                          postVar('INPUTYESNO_TEMPLATE_NORMAL'));
4951                 self::addToTemplate($templateid, 'ADMIN_SPECIALSKINLIST_HEAD',                          postVar('ADMIN_SPECIALSKINLIST_HEAD'));
4952                 self::addToTemplate($templateid, 'ADMIN_SPECIALSKINLIST_BODY',                          postVar('ADMIN_SPECIALSKINLIST_BODY'));
4953                 self::addToTemplate($templateid, 'ADMIN_SPECIALSKINLIST_FOOT',                          postVar('ADMIN_SPECIALSKINLIST_FOOT'));
4954                 self::addToTemplate($templateid, 'SKINIE_EXPORT_LIST',                                          postVar('SKINIE_EXPORT_LIST'));
4955                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_HEAD',                       postVar('SHOWLIST_LISTPLUG_SELECT_HEAD'));
4956                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_BODY',                       postVar('SHOWLIST_LISTPLUG_SELECT_BODY'));
4957                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_SELECT_FOOT',                       postVar('SHOWLIST_LISTPLUG_SELECT_FOOT'));
4958                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_HEAD',                        postVar('SHOWLIST_LISTPLUG_TABLE_HEAD'));
4959                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BODY',                        postVar('SHOWLIST_LISTPLUG_TABLE_BODY'));
4960                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_FOOT',                        postVar('SHOWLIST_LISTPLUG_TABLE_FOOT'));
4961                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_HEAD'));
4962                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_BODY'));
4963                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_MEMBLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_MEMBLIST_FOOT'));
4964                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_HEAD'));
4965                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_BODY'));
4966                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TEAMLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_TEAMLIST_FOOT'));
4967                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HEAD'));
4968                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_BODY'));
4969                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_GURL',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_GURL'));
4970                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGEVENTLIST',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGEVENTLIST'));
4971                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGNEDUPDATE',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGNEDUPDATE'));
4972                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPEND',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPEND'));
4973                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPREQ',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGIN_DEPREQ'));
4974                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLISTFALSE',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLISTFALSE'));
4975                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ACTN',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ACTN'));
4976                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ADMN',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_ADMN'));
4977                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HELP',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_HELP'));
4978                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGOPTSETURL',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGOPTSETURL'));
4979                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGLIST_FOOT'));
4980                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_HEAD'));
4981                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_BODY'));
4982                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OYESNO',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OYESNO'));
4983                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OPWORD',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OPWORD'));
4984                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEP',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEP'));
4985                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEO',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEO'));
4986                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEC',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OSELEC'));
4987                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OTAREA',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OTAREA'));
4988                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLGOPT_OITEXT',       postVar('SHOWLIST_LISTPLUG_TABLE_PLGOPT_OITEXT'));
4989                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_PLUGOPTN_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_PLUGOPTN_FOOT'));
4990                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_POPTLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_POPTLIST_FOOT'));
4991                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_HEAD'));
4992                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_BODY'));
4993                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ITEMLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_ITEMLIST_FOOT'));
4994                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_HEAD'));
4995                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_BODY'));
4996                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_ABAN',       postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_ABAN'));
4997                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CMNTLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_CMNTLIST_FOOT'));
4998                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_HEAD'));
4999                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_BODY'));
5000                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLIST_BD_TADM',       postVar('SHOWLIST_LISTPLUG_TABLE_BLIST_BD_TADM'));
5001                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLIST_BD_SADM',       postVar('SHOWLIST_LISTPLUG_TABLE_BLIST_BD_SADM'));
5002                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGLIST_FOOT'));
5003                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_HEAD'));
5004                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_BODY'));
5005                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_BLOGSNAM_FOOT'));
5006                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_HEAD'));
5007                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_BODY'));
5008                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SHORTNAM_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_SHORTNAM_FOOT'));
5009                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_HEAD'));
5010                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_BODY'));
5011                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_CATELIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_CATELIST_FOOT'));
5012                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_HEAD'));
5013                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_BODY'));
5014                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_TPLTLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_TPLTLIST_FOOT'));
5015                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_HEAD'));
5016                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_BODY'));
5017                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_SKINLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_SKINLIST_FOOT'));
5018                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_HEAD'));
5019                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_BODY'));
5020                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_DRFTLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_DRFTLIST_FOOT'));
5021                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_HEAD'));
5022                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_BODY'));
5023                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_ACTNLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_ACTNLIST_FOOT'));
5024                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_HEAD',       postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_HEAD'));
5025                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_BODY',       postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_BODY'));
5026                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_IBANLIST_FOOT',       postVar('SHOWLIST_LISTPLUG_TABLE_IBANLIST_FOOT'));
5027                 self::addToTemplate($templateid, 'SHOWLIST_LISTPLUG_TABLE_NAVILIST',            postVar('SHOWLIST_LISTPLUG_TABLE_NAVILIST'));
5028                 self::addToTemplate($templateid, 'PLUGIN_QUICKMENU_TITLE',                                      postVar('PLUGIN_QUICKMENU_TITLE'));
5029                 self::addToTemplate($templateid, 'PLUGIN_QUICKMENU_HEAD',                                       postVar('PLUGIN_QUICKMENU_HEAD'));
5030                 self::addToTemplate($templateid, 'PLUGIN_QUICKMENU_BODY',                                       postVar('PLUGIN_QUICKMENU_BODY'));
5031                 self::addToTemplate($templateid, 'PLUGIN_QUICKMENU_FOOT',                                       postVar('PLUGIN_QUICKMENU_FOOT'));
5032                 
5033                 $data = array('fields' => array());
5034                 $manager->notify('AdminTemplateExtraFields', $data);
5035                 foreach ( $data['fields'] as $pfkey => $pfvalue )
5036                 {
5037                         foreach ( $pfvalue as $pffield => $pfdesc )
5038                         {
5039                                 self::addToTemplate($templateid, $pffield, postVar($pffield));
5040                         }
5041                 }
5042                 
5043                 // jump back to template edit
5044                 self::action_admintemplateedit(_TEMPLATE_UPDATED);
5045                 return;
5046         }
5047         
5048         /**
5049          * Admin::action_admintemplatedelete()
5050          * 
5051          * @param       void
5052          * @return      void
5053          */
5054         static private function action_admintemplatedelete()
5055         {
5056                 global $member, $manager;
5057                 $member->isAdmin() or self::disallow();
5058                 
5059                 // TODO: check if template can be deleted
5060                 self::$skin->parse('admintemplatedelete');
5061                 return;
5062         }
5063         
5064 <<<<<<< HEAD
5065     /**
5066      * @todo document this
5067      */
5068     function action_commentdeleteconfirm() {
5069         global $member;
5070
5071         $commentid = intRequestVar('commentid');
5072
5073         // get item id first
5074         $res = DB::getValue('SELECT citem FROM '.sql_table('comment') .' WHERE cnumber=' . $commentid);
5075         $itemid = $res;
5076
5077         $error = $this->deleteOneComment($commentid);
5078         if ($error)
5079             $this->doError($error);
5080
5081         if ($member->canAlterItem($itemid))
5082             $this->action_itemcommentlist($itemid);
5083         else
5084             $this->action_browseowncomments();
5085     }
5086
5087     /**
5088      * @todo document this
5089      */
5090     function deleteOneComment($commentid) {
5091         global $member, $manager;
5092
5093         $commentid = intval($commentid);
5094
5095         if (!$member->canAlterComment($commentid))
5096             return _ERROR_DISALLOWED;
5097
5098         $manager->notify('PreDeleteComment', array('commentid' => $commentid));
5099
5100         // delete the comments associated with the item
5101         $query = 'DELETE FROM '.sql_table('comment').' WHERE cnumber=' . $commentid;
5102         DB::execute($query);
5103
5104         $manager->notify('PostDeleteComment', array('commentid' => $commentid));
5105
5106         return '';
5107     }
5108
5109         /**
5110          * Admin::action_usermanagement()
5111          * 
5112          * Usermanagement main
5113          * @param       void
5114          * @return      void
5115          */
5116         public function action_usermanagement()
5117         {
5118                 global $member, $manager;
5119                 
5120                 // check if allowed
5121                 $member->isAdmin() or $this->disallow();
5122                 
5123                 $this->pagehead();
5124                 
5125                 echo '<p><a href="index.php?action=manage">(' . _BACKTOMANAGE . ")</a></p>\n";
5126                 
5127                 echo '<h2>' . _MEMBERS_TITLE . "</h2>\n";
5128                 
5129                 echo '<h3>' . _MEMBERS_CURRENT . "</h3>\n";
5130                 
5131                 // show list of members with actions
5132                 $query =  'SELECT * FROM '.sql_table('member');
5133                 $template['content'] = 'memberlist';
5134                 $template['tabindex'] = 10;
5135                 
5136                 $manager->loadClass("ENCAPSULATE");
5137                 $batch = new Batch('member');
5138                 $batch->showlist($query,'table',$template);
5139                 
5140                 echo '<h3>' . _MEMBERS_NEW .'</h3>';
5141                 echo "<form method=\"post\" action=\"index.php\" name=\"memberedit\">\n";
5142                 echo "<div>\n";
5143                 echo "<input type=\"hidden\" name=\"action\" value=\"memberadd\" />\n";
5144                 $manager->addTicketHidden();
5145                 
5146                 echo '<table frame="box" rules="rules" summary="' . _MEMBERS_NEW . '">' ."\n";
5147                 echo "<tr>\n";
5148                 echo '<th colspan="2">' . _MEMBERS_NEW . "</th>\n";
5149                 echo "</tr>\n";
5150                 echo "<tr>\n";
5151                 echo '<td>' . _MEMBERS_DISPLAY;
5152                 help('shortnames');
5153                 echo '<br />';
5154                 echo '<small>' . _MEMBERS_DISPLAY_INFO . '</small>';
5155                 echo "</td>\n";
5156                 echo "<td><input tabindex=\"10010\" name=\"name\" size=\"32\" maxlength=\"32\" /></td>\n";
5157                 echo "</tr>\n";
5158                 echo "<tr>\n";
5159                 echo '<td>' . _MEMBERS_REALNAME . "</td>\n";
5160                 echo "<td><input name=\"realname\" tabindex=\"10020\" size=\"40\" maxlength=\"60\" /></td>\n";
5161                 echo "</tr>\n";
5162                 echo "<tr>\n";
5163                 echo '<td>' . _MEMBERS_PWD . "</td>\n";
5164                 echo "<td><input name=\"password\" tabindex=\"10030\" size=\"16\" maxlength=\"40\" type=\"password\" /></td>\n";
5165                 echo "</tr>\n";
5166                 echo "<tr>\n";
5167                 echo '<td>' . _MEMBERS_REPPWD . "</td>\n";
5168                 echo "<td><input name=\"repeatpassword\" tabindex=\"10035\" size=\"16\" maxlength=\"40\" type=\"password\" /></td>\n";
5169                 echo "</tr>\n";
5170                 echo "<tr>\n";
5171                 echo '<td>' . _MEMBERS_EMAIL . "</td>\n";
5172                 echo "<td><input name=\"email\" tabindex=\"10040\" size=\"40\" maxlength=\"60\" /></td>\n";
5173                 echo "</tr>\n";
5174                 echo "<tr>\n";
5175                 echo '<td>' . _MEMBERS_URL . "</td>\n";
5176                 echo "<td><input name=\"url\" tabindex=\"10050\" size=\"40\" maxlength=\"100\" /></td>\n";
5177                 echo "</tr>\n";
5178                 echo "<tr>\n";
5179                 echo '<td>' . _MEMBERS_SUPERADMIN;
5180                 help('superadmin');
5181                 echo "</td>\n";
5182                 echo '<td>';
5183                 $this->input_yesno('admin',0,10060);
5184                 echo "</td>\n";
5185                 echo "</tr>\n";
5186                 echo "<tr>\n";
5187                 echo '<td>' . _MEMBERS_CANLOGIN;
5188                 help('canlogin');
5189                 echo "</td>\n";
5190                 echo '<td>';
5191                 $this->input_yesno('canlogin',1,10070);
5192                 echo "</td>\n";
5193                 echo "</tr>\n";
5194                 echo "<tr>\n";
5195                 echo '<td>' . _MEMBERS_NOTES . "</td>\n";
5196                 echo "<td><input name=\"notes\" maxlength=\"100\" size=\"40\" tabindex=\"10080\" /></td>\n";
5197                 echo "</tr>\n";
5198                 echo "<tr>\n";
5199                 echo '<td>' . _MEMBERS_NEW . "</td>\n";
5200                 echo '<td><input type="submit" value="' . _MEMBERS_NEW_BTN . '" tabindex="10090" onclick="return checkSubmit();" />' . "</td>\n";
5201                 echo "</tr>\n";
5202                 echo "</table>\n";
5203                 echo "</div>\n";
5204                 echo "</form>\n";
5205                 $this->pagefoot();
5206                 return;
5207         }
5208         
5209     /**
5210      * Edit member settings
5211      */
5212     function action_memberedit() {
5213         $this->action_editmembersettings(intRequestVar('memberid'));
5214     }
5215
5216 =======
5217 >>>>>>> skinnable-master
5218         /**
5219          * Admin::action_admintemplatedeleteconfirm()
5220          * 
5221          * @param       void
5222          * @return      void
5223          */
5224         static private function action_admintemplatedeleteconfirm()
5225         {
5226                 global $member, $manager;
5227                 
5228                 $templateid = intRequestVar('templateid');
5229                 $member->isAdmin() or self::disallow();
5230                 
5231                 $data = array('templateid' => $templateid);
5232                 $manager->notify('PreDeleteAdminTemplate', $data);
5233                 
5234                 // 1. delete description
5235                 $query = "DELETE FROM %s WHERE tdnumber=%s;";
5236                 $query = sprintf($query, sql_table('template_desc'), (integer) $templateid);
5237                 DB::execute($query);
5238                 
5239 <<<<<<< HEAD
5240                 // show message to go back to member overview (only for admins)
5241                 if ($member->isAdmin())
5242                 {
5243                         echo '<a href="index.php?action=usermanagement">(' ._MEMBERS_BACKTOOVERVIEW. ')</a>';
5244                 }
5245                 else
5246                 {
5247                         echo '<a href="index.php?action=overview">(' ._BACKHOME. ')</a>';
5248                 }
5249                 echo '<h2>' . _MEMBERS_EDIT . '</h2>';
5250                 
5251                 $mem =& $manager->getMember($memberid);
5252                 ?>
5253                 <form method="post" action="index.php" name="memberedit"><div>
5254                 
5255                 <input type="hidden" name="action" value="changemembersettings" />
5256                 <input type="hidden" name="memberid" value="<?php echo  $memberid; ?>" />
5257                 <?php $manager->addTicketHidden() ?>
5258                 
5259                 <table><tr>
5260                         <th colspan="2"><?php echo _MEMBERS_EDIT ?></th>
5261                 </tr><tr>
5262                         <td><?php echo _MEMBERS_DISPLAY ?> <?php help('shortnames'); ?>
5263                                 <br /><small><?php echo _MEMBERS_DISPLAY_INFO ?></small>
5264                         </td>
5265                         <td>
5266                         <?php if ($CONF['AllowLoginEdit'] || $member->isAdmin()) { ?>
5267                                 <input name="name" tabindex="10" maxlength="32" size="32" value="<?php echo  Entity::hsc($mem->getDisplayName()); ?>" />
5268                         <?php } else {
5269                                 echo Entity::hsc($member->getDisplayName());
5270                            }
5271                         ?>
5272                         </td>
5273                 </tr><tr>
5274                         <td><?php echo _MEMBERS_REALNAME ?></td>
5275                         <td><input name="realname" tabindex="20" maxlength="60" size="40" value="<?php echo  Entity::hsc($mem->getRealName()); ?>" /></td>
5276                 </tr><tr>
5277                 <?php if ($CONF['AllowLoginEdit'] || $member->isAdmin()) { ?>
5278                         <td><?php echo _MEMBERS_PWD ?></td>
5279                         <td><input type="password" tabindex="30" maxlength="40" size="16" name="password" /></td>
5280                 </tr><tr>
5281                         <td><?php echo _MEMBERS_REPPWD ?></td>
5282                         <td><input type="password" tabindex="35" maxlength="40" size="16" name="repeatpassword" /></td>
5283                 <?php } ?>
5284                 </tr><tr>
5285                         <td><?php echo _MEMBERS_EMAIL ?>
5286                                 <br /><small><?php echo _MEMBERS_EMAIL_EDIT ?></small>
5287                         </td>
5288                         <td><input name="email" tabindex="40" size="40" maxlength="60" value="<?php echo  Entity::hsc($mem->getEmail()); ?>" /></td>
5289                 </tr><tr>
5290                         <td><?php echo _MEMBERS_URL ?></td>
5291                         <td><input name="url" tabindex="50" size="40" maxlength="100" value="<?php echo  Entity::hsc($mem->getURL()); ?>" /></td>
5292                 <?php // only allow to change this by super-admins
5293                    // we don't want normal users to 'upgrade' themselves to super-admins, do we? ;-)
5294                    if ($member->isAdmin()) {
5295                 ?>
5296                         </tr><tr>
5297                                 <td><?php echo _MEMBERS_SUPERADMIN ?> <?php help('superadmin'); ?></td>
5298                                 <td><?php $this->input_yesno('admin',$mem->isAdmin(),60); ?></td>
5299                         </tr><tr>
5300                                 <td><?php echo _MEMBERS_CANLOGIN ?> <?php help('canlogin'); ?></td>
5301                                 <td><?php $this->input_yesno('canlogin',$mem->canLogin(),70,1,0,_YES,_NO,$mem->isAdmin()); ?></td>
5302                 <?php } ?>
5303                 </tr><tr>
5304                         <td><?php echo _MEMBERS_NOTES ?></td>
5305                         <td><input name="notes" tabindex="80" size="40" maxlength="100" value="<?php echo  Entity::hsc($mem->getNotes()); ?>" /></td>
5306                 </tr><tr>
5307                         <td><?php echo _MEMBERS_LOCALE ?> <?php help('locale'); ?>
5308                         </td>
5309                         <td>
5310                         
5311                                 <select name="locale" tabindex="85">
5312                                 <?php
5313                                 $locales = i18n::get_available_locale_list();
5314                                 if ( !$mem->getLocale() || !in_array($mem->getLocale(), $locales) )
5315                                 {
5316                                         echo "<option value=\"\" selected=\"selected\">" . Entity::hsc(_MEMBERS_USESITELANG) . "</option>\n";
5317                                 }
5318                                 else
5319                                 {
5320                                         echo "<option value=\"\">" . Entity::hsc(_MEMBERS_USESITELANG) . "</option>\n";
5321                                 }
5322                                 
5323                                 foreach( $locales as $locale )
5324                                 {
5325                                         if( $locale == $mem->getLocale() )
5326                                         {
5327                                                 echo "<option value=\"{$locale}\" selected=\"selected\">{$locale}</option>\n";
5328                                         }
5329                                         else
5330                                         {
5331                                                 echo "<option value=\"{$locale}\">{$locale}</option>\n";
5332                                         }
5333                                 }
5334                                 ?>
5335                                 </select>
5336                                 
5337                         </td>
5338                 </tr>
5339                 <tr>
5340                         <td><?php echo _MEMBERS_USEAUTOSAVE ?> <?php help('autosave'); ?></td>
5341                         <td><?php $this->input_yesno('autosave', $mem->getAutosave(), 87); ?></td>
5342                 </tr>
5343                 <?php
5344                         // plugin options
5345                         $this->_insertPluginOptions('member',$memberid);
5346                 ?>
5347                 <tr>
5348                         <th colspan="2"><?php echo _MEMBERS_EDIT ?></th>
5349                 </tr><tr>
5350                         <td><?php echo _MEMBERS_EDIT ?></td>
5351                         <td><input type="submit" tabindex="90" value="<?php echo _MEMBERS_EDIT_BTN ?>" onclick="return checkSubmit();" /></td>
5352                 </tr></table>
5353                 
5354                 </div></form>
5355                 
5356                 <?php
5357                         echo '<h3>',_PLUGINS_EXTRA,'</h3>';
5358                         
5359                         $manager->notify(
5360                                 'MemberSettingsFormExtras',
5361                                 array(
5362                                         'member' => &$mem
5363                                 )
5364                         );
5365                 $this->pagefoot();
5366 =======
5367                 // 2. delete parts
5368                 $query = "DELETE FROM %s WHERE tdesc=%d;";
5369                 $query = sprintf($query, sql_table('template'), (integer) $templateid);
5370                 DB::execute($query);
5371                 
5372                 $data = array('templateid' => $templateid);
5373                 $manager->notify('PostDeleteAdminTemplate', $data);
5374                 
5375                 self::action_admintemplateoverview();
5376                 return;
5377 >>>>>>> skinnable-master
5378         }
5379         
5380         /**
5381          * Admin::action_admintemplatenew()
5382          * 
5383          * @param       void
5384          * @return      void
5385          */
5386         static private function action_admintemplatenew()
5387         {
5388                 global $member;
5389                 $member->isAdmin() or self::disallow();
5390                 $name = postVar('name');
5391                 $desc = postVar('desc');
5392                 
5393                 if ( !isValidTemplateName($name) )
5394                 {
5395 <<<<<<< HEAD
5396                         $url = 'http://' . $url;
5397                 }
5398
5399         $admin          = postVar('admin');
5400         $canlogin       = postVar('canlogin');
5401         $notes          = strip_tags(postVar('notes'));
5402         $locale        = postVar('locale');
5403
5404         $mem =& $manager->getMember($memberid);
5405
5406         if ($CONF['AllowLoginEdit'] || $member->isAdmin()) {
5407
5408             if (!isValidDisplayName($name))
5409                 $this->error(_ERROR_BADNAME);
5410
5411             if (($name != $mem->getDisplayName()) && Member::exists($name))
5412                 $this->error(_ERROR_NICKNAMEINUSE);
5413
5414             if ($password != $repeatpassword)
5415                 $this->error(_ERROR_PASSWORDMISMATCH);
5416
5417             if ($password && (i18n::strlen($password) < 6))
5418                 $this->error(_ERROR_PASSWORDTOOSHORT);
5419                 
5420             if ($password) {
5421                                 $pwdvalid = true;
5422                                 $pwderror = '';
5423                                 $manager->notify('PrePasswordSet',array('password' => $password, 'errormessage' => &$pwderror, 'valid' => &$pwdvalid));
5424                                 if (!$pwdvalid) {
5425                                         $this->error($pwderror);
5426                                 }
5427                         }
5428 =======
5429                         self::error(_ERROR_BADTEMPLATENAME);
5430                         return;
5431 >>>>>>> skinnable-master
5432                 }
5433                 else if ( !preg_match('#^admin/#', $name) )
5434                 {
5435                         self::error(_ERROR_BADADMINTEMPLATENAME);
5436                         return;
5437                 }
5438                 else if ( Template::exists($name) )
5439                 {
5440                         self::error(_ERROR_DUPTEMPLATENAME);
5441                         return;
5442                 }
5443 <<<<<<< HEAD
5444         if ( ($locale != '') && (!in_array($locale, i18n::get_available_locale_list())) )
5445             $this->error(_ERROR_NOSUCHTRANSLATION);
5446
5447         // check if there will remain at least one site member with both the logon and admin rights
5448         // (check occurs when taking away one of these rights from such a member)
5449         if (    (!$admin && $mem->isAdmin() && $mem->canLogin())
5450              || (!$canlogin && $mem->isAdmin() && $mem->canLogin())
5451            )
5452         {
5453             $r = DB::getResult('SELECT * FROM '.sql_table('member').' WHERE madmin=1 and mcanlogin=1');
5454             if ($r->rowCount() < 2)
5455                 $this->error(_ERROR_ATLEASTONEADMIN);
5456         }
5457
5458         if ($CONF['AllowLoginEdit'] || $member->isAdmin()) {
5459             $mem->setDisplayName($name);
5460             if ($password)
5461                 $mem->setPassword($password);
5462         }
5463
5464         $oldEmail = $mem->getEmail();
5465
5466         $mem->setRealName($realname);
5467         $mem->setEmail($email);
5468         $mem->setURL($url);
5469         $mem->setNotes($notes);
5470         $mem->setLocale($locale);
5471
5472
5473         // only allow super-admins to make changes to the admin status
5474         if ($member->isAdmin()) {
5475             $mem->setAdmin($admin);
5476             $mem->setCanLogin($canlogin);
5477         }
5478
5479         $autosave = postVar ('autosave');
5480         $mem->setAutosave($autosave);
5481
5482         $mem->write();
5483
5484         // store plugin options
5485         $aOptions = requestArray('plugoption');
5486         NucleusPlugin::apply_plugin_options($aOptions);
5487         $manager->notify('PostPluginOptionsUpdate',array('context' => 'member', 'memberid' => $memberid, 'member' => &$mem));
5488
5489         // if email changed, generate new password
5490         if ($oldEmail != $mem->getEmail())
5491         {
5492             $mem->sendActivationLink('addresschange', $oldEmail);
5493             // logout member
5494             $mem->newCookieKey();
5495
5496             // only log out if the member being edited is the current member.
5497             if ($member->getID() == $memberid)
5498                 $member->logout();
5499             $this->action_login(_MSG_ACTIVATION_SENT, 0);
5500             return;
5501         }
5502
5503
5504         if (  ( $mem->getID() == $member->getID() )
5505            && ( $mem->getDisplayName() != $member->getDisplayName() )
5506            ) {
5507             $mem->newCookieKey();
5508             $member->logout();
5509             $this->action_login(_MSG_LOGINAGAIN, 0);
5510         } else {
5511             $this->action_overview(_MSG_SETTINGSCHANGED);
5512         }
5513     }
5514
5515 =======
5516                 
5517                 $newTemplateId = Template::createNew($name, $desc);
5518                 self::action_admintemplateoverview();
5519                 return;
5520         }
5521         
5522 >>>>>>> skinnable-master
5523         /**
5524          * Admin::action_admintemplateclone()
5525          * 
5526          * @param       void
5527          * @return      void
5528          */
5529         static private function action_admintemplateclone()
5530         {
5531                 global $member;
5532                 $templateid = intRequestVar('templateid');
5533                 $member->isAdmin() or self::disallow();
5534                 
5535                 // 1. read old template
5536                 $name = Template::getNameFromId($templateid);
5537                 $desc = Template::getDesc($templateid);
5538                 
5539                 // 2. create desc thing
5540                 $name = $name . "cloned";
5541                 
5542                 // if a template with that name already exists:
5543                 if ( Template::exists($name) )
5544                 {
5545                         $i = 1;
5546                         while ( Template::exists($name . $i) )
5547                         {
5548                                 $i++;
5549                         }
5550                         $name .= $i;
5551                 }
5552                 
5553                 $newid = Template::createNew($name, $desc);
5554                 
5555                 // 3. create clone
5556                 // go through parts of old template and add them to the new one
5557                 $query = "SELECT tpartname, tcontent FROM %s WHERE tdesc=%d;";
5558                 $query = sprintf($query, sql_table('template'), (integer) $templateid);
5559                 
5560                 $res = DB::getResult($query);
5561                 foreach ( $res as $row )
5562                 {
5563                         self::addToTemplate($newid, $row['tpartname'], $row['tcontent']);
5564                 }
5565                 
5566                 self::action_admintemplateoverview();
5567                 return;
5568         }
5569
5570         /**
5571          * Admin::action_skinoverview()
5572          * 
5573          * @param       void
5574          * @return      void
5575          */
5576         static private function action_skinoverview()
5577         {
5578                 global $member, $manager;
5579                 
5580                 $member->isAdmin() or self::disallow();
5581                 
5582                 self::$skin->parse('skinoverview');
5583                 return;
5584         }
5585         
5586         /**
5587          * Admin::action_skinnew()
5588          * 
5589          * @param       void
5590          * @return      void
5591          */
5592         static private function action_skinnew()
5593         {
5594                 global $member;
5595                 
5596                 $member->isAdmin() or self::disallow();
5597                 
5598                 $name = trim(postVar('name'));
5599                 $desc = trim(postVar('desc'));
5600                 
5601                 if ( !isValidSkinName($name) )
5602                 {
5603                         self::error(_ERROR_BADSKINNAME);
5604                         return;
5605                 }
5606                 else if ( SKIN::exists($name) )
5607                 {
5608                         self::error(_ERROR_DUPSKINNAME);
5609                         return;
5610                 }
5611                 
5612                 SKIN::createNew($name, $desc);
5613                 
5614                 self::action_skinoverview();
5615                 return;
5616         }
5617 <<<<<<< HEAD
5618
5619     /**
5620      * Account activation
5621      *
5622      * @author dekarma
5623      */
5624     function action_activate() {
5625
5626         $key = getVar('key');
5627         $this->_showActivationPage($key);
5628     }
5629
5630     /**
5631      * @todo document this
5632      */
5633     function _showActivationPage($key, $message = '')
5634     {
5635         global $manager;
5636
5637         // clean up old activation keys
5638         Member::cleanupActivationTable();
5639
5640         // get activation info
5641         $info = Member::getActivationInfo($key);
5642
5643         if (!$info)
5644             $this->error(_ERROR_ACTIVATE);
5645
5646         $mem =& $manager->getMember($info['vmember']);
5647
5648         if (!$mem)
5649             $this->error(_ERROR_ACTIVATE);
5650
5651         $text = '';
5652         $title = '';
5653         $bNeedsPasswordChange = true;
5654
5655         switch ($info['vtype'])
5656         {
5657             case 'forgot':
5658                 $title = _ACTIVATE_FORGOT_TITLE;
5659                 $text = _ACTIVATE_FORGOT_TEXT;
5660                 break;
5661             case 'register':
5662                 $title = _ACTIVATE_REGISTER_TITLE;
5663                 $text = _ACTIVATE_REGISTER_TEXT;
5664                 break;
5665             case 'addresschange':
5666                 $title = _ACTIVATE_CHANGE_TITLE;
5667                 $text = _ACTIVATE_CHANGE_TEXT;
5668                 $bNeedsPasswordChange = false;
5669                 Member::activate($key);
5670                 break;
5671         }
5672
5673         $aVars = array(
5674             'memberName' => Entity::hsc($mem->getDisplayName())
5675         );
5676         $title = Template::fill($title, $aVars);
5677         $text = Template::fill($text, $aVars);
5678
5679         $this->pagehead();
5680
5681             echo '<h2>' , $title, '</h2>';
5682             echo '<p>' , $text, '</p>';
5683
5684             if ($message != '')
5685             {
5686                 echo '<p class="error">',$message,'</p>';
5687             }
5688
5689             if ($bNeedsPasswordChange)
5690             {
5691                 ?>
5692                     <div><form action="index.php" method="post">
5693
5694                         <input type="hidden" name="action" value="activatesetpwd" />
5695                         <?php $manager->addTicketHidden() ?>
5696                         <input type="hidden" name="key" value="<?php echo Entity::hsc($key) ?>" />
5697
5698                         <table><tr>
5699                             <td><?php echo _MEMBERS_PWD ?></td>
5700                             <td><input type="password" maxlength="40" size="16" name="password" /></td>
5701                         </tr><tr>
5702                             <td><?php echo _MEMBERS_REPPWD ?></td>
5703                             <td><input type="password" maxlength="40" size="16" name="repeatpassword" /></td>
5704                         <?php
5705
5706                             global $manager;
5707                             $manager->notify('FormExtra', array('type' => 'activation', 'member' => $mem));
5708
5709                         ?>
5710                         </tr><tr>
5711                             <td><?php echo _MEMBERS_SETPWD ?></td>
5712                             <td><input type='submit' value='<?php echo _MEMBERS_SETPWD_BTN ?>' /></td>
5713                         </tr></table>
5714
5715
5716                     </form></div>
5717
5718                 <?php
5719
5720             }
5721
5722         $this->pagefoot();
5723
5724     }
5725
5726     /**
5727      * Account activation - set password part
5728      *
5729      * @author dekarma
5730      */
5731     function action_activatesetpwd()
5732     {
5733                 global $manager;
5734         $key = postVar('key');
5735
5736         // clean up old activation keys
5737         Member::cleanupActivationTable();
5738
5739         // get activation info
5740         $info = Member::getActivationInfo($key);
5741
5742         if (!$info || ($info['type'] == 'addresschange'))
5743             return $this->_showActivationPage($key, _ERROR_ACTIVATE);
5744
5745         $mem =& $manager->getMember($info['vmember']);
5746
5747         if (!$mem)
5748             return $this->_showActivationPage($key, _ERROR_ACTIVATE);
5749
5750         $password       = postVar('password');
5751         $repeatpassword = postVar('repeatpassword');
5752
5753         if ($password != $repeatpassword)
5754             return $this->_showActivationPage($key, _ERROR_PASSWORDMISMATCH);
5755
5756         if ($password && (i18n::strlen($password) < 6))
5757             return $this->_showActivationPage($key, _ERROR_PASSWORDTOOSHORT);
5758             
5759         if ($password) {
5760                         $pwdvalid = true;
5761                         $pwderror = '';
5762                         global $manager;
5763                         $manager->notify('PrePasswordSet',array('password' => $password, 'errormessage' => &$pwderror, 'valid' => &$pwdvalid));
5764                         if (!$pwdvalid) {
5765                                 return $this->_showActivationPage($key,$pwderror);
5766                         }
5767                 }
5768
5769         $error = '';
5770         
5771         $manager->notify('ValidateForm', array('type' => 'activation', 'member' => $mem, 'error' => &$error));
5772         if ($error != '')
5773             return $this->_showActivationPage($key, $error);
5774
5775
5776         // set password
5777         $mem->setPassword($password);
5778         $mem->write();
5779
5780         // do the activation
5781         Member::activate($key);
5782
5783         $this->pagehead();
5784             echo '<h2>',_ACTIVATE_SUCCESS_TITLE,'</h2>';
5785             echo '<p>',_ACTIVATE_SUCCESS_TEXT,'</p>';
5786         $this->pagefoot();
5787     }
5788
5789         /**
5790          * Admin::action_manageteam()
5791          * 
5792          * Manage team
5793          * @param       void
5794          * @return      void
5795          */
5796         public function action_manageteam()
5797         {
5798                 global $member, $manager;
5799                 
5800                 $blogid = intRequestVar('blogid');
5801                 
5802                 // check if allowed
5803                 $member->blogAdminRights($blogid) or $this->disallow();
5804                 
5805                 $this->pagehead();
5806                 
5807                 echo "<p><a href='index.php?action=blogsettings&amp;blogid=$blogid'>(" . _BACK_TO_BLOGSETTINGS . ")</a></p>\n";
5808                 
5809                 echo '<h2>' . _TEAM_TITLE . getBlogNameFromID($blogid) . "</h2>\n";
5810                 
5811                 echo '<h3>' . _TEAM_CURRENT . "</h3>\n";
5812                 
5813                 $query = 'SELECT tblog, tmember, mname, mrealname, memail, tadmin'
5814                        . ' FROM '.sql_table('member').', '.sql_table('team')
5815                        . ' WHERE tmember=mnumber and tblog=' . $blogid;
5816                 
5817                 $template['content'] = 'teamlist';
5818                 $template['tabindex'] = 10;
5819                 
5820                 $manager->loadClass("ENCAPSULATE");
5821                 $batch = new Batch('team');
5822                 $batch->showlist($query, 'table', $template);
5823                 
5824                 echo '<h3>' . _TEAM_ADDNEW . "</h3>\n";
5825                         
5826                 echo "<form method=\"post\" action=\"index.php\">\n";
5827                 echo "<div>\n";
5828                 
5829                 echo "<input type=\"hidden\" name=\"action\" value=\"teamaddmember\" />\n";
5830                 echo "<input type=\"hidden\" name=\"blogid\" value=\"{$blogid}\" />\n";
5831                 $manager->addTicketHidden();
5832                         
5833                 echo '<table frame="box" rules="all" summary="' . _TEAM_ADDNEW . '">' . "\n";
5834                 echo "<tr>\n";
5835                 echo '<td>' . _TEAM_CHOOSEMEMBER . "</td>\n";
5836                 
5837                 // TODO: try to make it so only non-team-members are listed
5838                 echo "<td>\n";
5839                 
5840                 $query =  'SELECT mname as text, mnumber as value FROM '.sql_table('member');
5841                 $template['name'] = 'memberid';
5842                 $template['tabindex'] = 10000;
5843                 showlist($query,'select',$template);
5844                 
5845                 echo "</td>\n";
5846                 echo "</tr>\n";
5847                 echo "<tr>\n";
5848                 echo '<td>' . _TEAM_ADMIN;
5849                 help('teamadmin');
5850                 echo "</td>\n";
5851                 echo '<td>';
5852                 $this->input_yesno('admin',0,10020);
5853                 echo "</td>\n";
5854                 echo "</tr>\n";
5855                 echo "<tr>\n";
5856                 echo '<td>' . _TEAM_ADD . "</td>\n";
5857                 echo '<td><input type="submit" value="' . _TEAM_ADD_BTN . '" tabindex="10030" />' . "</td>\n";
5858                 echo "</tr>\n";
5859                 echo "</table>\n";
5860                 
5861                 echo "</div>\n";
5862                 echo "</form>\n";
5863                 
5864                 $this->pagefoot();
5865                 return;
5866         }
5867         
5868     /**
5869      * Add member to team
5870      */
5871     function action_teamaddmember() {
5872         global $member, $manager;
5873
5874         $memberid = intPostVar('memberid');
5875         $blogid = intPostVar('blogid');
5876         $admin = intPostVar('admin');
5877
5878         // check if allowed
5879         $member->blogAdminRights($blogid) or $this->disallow();
5880
5881         $blog =& $manager->getBlog($blogid);
5882         if (!$blog->addTeamMember($memberid, $admin))
5883             $this->error(_ERROR_ALREADYONTEAM);
5884
5885         $this->action_manageteam();
5886
5887     }
5888
5889     /**
5890      * @todo document this
5891      */
5892     function action_teamdelete() {
5893         global $member, $manager;
5894
5895         $memberid = intRequestVar('memberid');
5896         $blogid = intRequestVar('blogid');
5897
5898         // check if allowed
5899         $member->blogAdminRights($blogid) or $this->disallow();
5900
5901         $teammem =& $manager->getMember($memberid);
5902         $blog =& $manager->getBlog($blogid);
5903
5904         $this->pagehead();
5905         ?>
5906             <h2><?php echo _DELETE_CONFIRM ?></h2>
5907
5908             <p><?php echo _CONFIRMTXT_TEAM1 ?><b><?php echo  Entity::hsc($teammem->getDisplayName()) ?></b><?php echo _CONFIRMTXT_TEAM2 ?><b><?php echo  Entity::hsc(strip_tags($blog->getName())) ?></b>
5909             </p>
5910
5911
5912             <form method="post" action="index.php"><div>
5913             <input type="hidden" name="action" value="teamdeleteconfirm" />
5914             <?php $manager->addTicketHidden() ?>
5915             <input type="hidden" name="memberid" value="<?php echo  $memberid; ?>" />
5916             <input type="hidden" name="blogid" value="<?php echo  $blogid; ?>" />
5917             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN ?>" />
5918             </div></form>
5919         <?php
5920         $this->pagefoot();
5921     }
5922
5923     /**
5924      * @todo document this
5925      */
5926     function action_teamdeleteconfirm() {
5927         global $member;
5928
5929         $memberid = intRequestVar('memberid');
5930         $blogid = intRequestVar('blogid');
5931
5932         $error = $this->deleteOneTeamMember($blogid, $memberid);
5933         if ($error)
5934             $this->error($error);
5935
5936
5937         $this->action_manageteam();
5938     }
5939
5940     /**
5941      * @todo document this
5942      */
5943     function deleteOneTeamMember($blogid, $memberid) {
5944         global $member, $manager;
5945
5946         $blogid = intval($blogid);
5947         $memberid = intval($memberid);
5948
5949         // check if allowed
5950         if (!$member->blogAdminRights($blogid))
5951             return _ERROR_DISALLOWED;
5952
5953         // check if: - there remains at least one blog admin
5954         //           - (there remains at least one team member)
5955         $tmem =& $manager->getMember($memberid);
5956
5957         $manager->notify('PreDeleteTeamMember', array('member' => &$tmem, 'blogid' => $blogid));
5958
5959         if ($tmem->isBlogAdmin($blogid)) {
5960             // check if there are more blog members left and at least one admin
5961             // (check for at least two admins before deletion)
5962             $query = 'SELECT * FROM '.sql_table('team') . ' WHERE tblog='.$blogid.' and tadmin=1';
5963             $r = DB::getResult($query);
5964             if ($r->rowCount() < 2)
5965                 return _ERROR_ATLEASTONEBLOGADMIN;
5966         }
5967
5968         $query = 'DELETE FROM '.sql_table('team')." WHERE tblog=$blogid and tmember=$memberid";
5969         DB::execute($query);
5970
5971         $manager->notify('PostDeleteTeamMember', array('member' => &$tmem, 'blogid' => $blogid));
5972
5973         return '';
5974     }
5975
5976     /**
5977      * @todo document this
5978      */
5979     function action_teamchangeadmin() {
5980         global $manager, $member;
5981
5982         $blogid = intRequestVar('blogid');
5983         $memberid = intRequestVar('memberid');
5984
5985         // check if allowed
5986         $member->blogAdminRights($blogid) or $this->disallow();
5987
5988         $mem =& $manager->getMember($memberid);
5989
5990         // don't allow when there is only one admin at this moment
5991         if ($mem->isBlogAdmin($blogid)) {
5992             $r = DB::getResult('SELECT * FROM '.sql_table('team') . " WHERE tblog=$blogid and tadmin=1");
5993             if ($r->rowCount() == 1)
5994                 $this->error(_ERROR_ATLEASTONEBLOGADMIN);
5995         }
5996
5997         if ($mem->isBlogAdmin($blogid))
5998             $newval = 0;
5999         else
6000             $newval = 1;
6001
6002         $query = 'UPDATE '.sql_table('team') ." SET tadmin=$newval WHERE tblog=$blogid and tmember=$memberid";
6003         DB::execute($query);
6004
6005         // only show manageteam if member did not change its own admin privileges
6006         if ($member->isBlogAdmin($blogid))
6007             $this->action_manageteam();
6008         else
6009             $this->action_overview(_MSG_ADMINCHANGED);
6010     }
6011         
6012         /**
6013          * Admin::action_blogsettings()
6014          * 
6015          * @param       void
6016          * @return      void
6017          */
6018         public function action_blogsettings()
6019         {
6020                 global $member, $manager;
6021                 
6022                 $blogid = intRequestVar('blogid');
6023                 
6024                 // check if allowed
6025                 $member->blogAdminRights($blogid) or $this->disallow();
6026                 
6027                 $blog =& $manager->getBlog($blogid);
6028                 
6029                 $extrahead = "<script type=\"text/javascript\" src=\"javascript/numbercheck.js\"></script>\n";
6030                 $this->pagehead($extrahead);
6031                 
6032                 echo '<p><a href="index.php?action=overview">(' . _BACKHOME . ")</a></p>\n";
6033                 echo '<h2>' . _EBLOG_TITLE . ": '{$this->bloglink($blog)}'</h2>\n";
6034                 
6035                 echo '<h3>' . _EBLOG_TEAM_TITLE . "</h3>\n";
6036                 
6037                 echo '<p>' . _EBLOG_CURRENT_TEAM_MEMBER;
6038                 
6039                 $query = "SELECT mname, mrealname FROM %s, %s WHERE mnumber=tmember AND tblog=%d;";
6040                 $query = sprintf($query, sql_table('member'), sql_table('team'), (integer) $blogid);
6041                 $res = DB::getResult($query);
6042                 $aMemberNames = array();
6043                 foreach ( $res as $row )
6044                 {
6045                         $aMemberNames[] = Entity::hsc($row['mname']) . ' (' . Entity::hsc($row['mrealname']). ')';
6046                 }
6047                 echo implode(',', $aMemberNames);
6048                         
6049                 echo "</p>\n";
6050                 echo '<p>';
6051                 echo '<a href="index.php?action=manageteam&amp;blogid=' . $blogid . '">' . _EBLOG_TEAM_TEXT . '</a>';
6052                 echo "</p>\n";
6053                 
6054                 echo '<h3>' . _EBLOG_SETTINGS_TITLE . "</h3>\n";
6055                 
6056                 echo "<form method=\"post\" action=\"index.php\">\n";
6057                 echo "<div>\n";
6058                 
6059                 echo "<input type=\"hidden\" name=\"action\" value=\"blogsettingsupdate\" />\n";
6060                 $manager->addTicketHidden() . "\n";
6061                 echo "<input type=\"hidden\" name=\"blogid\" value=\"{$blogid}\" />\n";
6062                 
6063                 echo '<table frame="box" rules="all" summary="' . _EBLOG_SETTINGS_TITLE . '">' . "\n";
6064                 echo "<tfoot>\n";
6065                 echo "<tr>\n";
6066                 echo '<th colspan="2">' . _EBLOG_CHANGE . "</th>\n";
6067                 echo "</tr>\n";
6068                 echo "<tr>\n";
6069                 echo '<td>' . _EBLOG_CHANGE . "</td>\n";
6070                 echo '<td><input type="submit" tabindex="130" value="' . _EBLOG_CHANGE_BTN . '" onclick="return checkSubmit();" />' . "</td>\n";
6071                 echo "</tr>\n";
6072                 echo "</tfoot>\n";
6073                 echo "<tbody>\n";
6074                 echo "<tr>\n";
6075                 echo '<td>' . _EBLOG_NAME . "</td>\n";
6076                 echo '<td><input name="name" tabindex="10" size="40" maxlength="60" value="' . Entity::hsc($blog->getName()) . '" />' . "</td>\n";
6077                 echo "</tr>\n";
6078                 echo "<tr>\n";
6079                 echo '<td>' . _EBLOG_SHORTNAME;
6080                 help('shortblogname');
6081                 echo _EBLOG_SHORTNAME_EXTRA;
6082                 echo "</td>\n";
6083                 echo '<td><input name="shortname" tabindex="20" maxlength="15" size="15" value="' . Entity::hsc($blog->getShortName()) .'" />' . "</td>\n";
6084                 echo "</tr>\n";
6085                 echo "<tr>\n";
6086                 echo '<td>' . _EBLOG_DESC . "</td>\n";
6087                 echo '<td><input name="desc" tabindex="30" maxlength="200" size="40" value="' . Entity::hsc($blog->getDescription()) . '" />' . "</td>\n";
6088                 echo "</tr>\n";
6089                 echo "<tr>\n";
6090                 echo '<td>' . _EBLOG_URL . "</td>\n";
6091                 echo '<td><input name="url" tabindex="40" size="40" maxlength="100" value="' . Entity::hsc($blog->getURL()) . '" />' . "</td>\n";
6092                 echo "</tr>\n";
6093                 echo "<tr>\n";
6094                 echo '<td>' . _EBLOG_DEFSKIN;
6095                 help('blogdefaultskin');
6096                 echo "</td>\n";
6097                 echo "<td>\n";
6098                 
6099                 $query = 'SELECT sdname as text, sdnumber as value FROM ' . sql_table('skin_desc');
6100                 $template['name'] = 'defskin';
6101                 $template['selected'] = $blog->getDefaultSkin();
6102                 $template['tabindex'] = 50;
6103                 showlist($query, 'select', $template);
6104                 
6105                 echo "</td>\n";
6106                 echo "</tr>\n";
6107                 echo "<tr>\n";
6108                 echo '<td>' . _EBLOG_LINEBREAKS;
6109                 help('convertbreaks');
6110                 echo "</td>\n";
6111                 echo '<td>';
6112                 $this->input_yesno('convertbreaks',$blog->convertBreaks(),55);
6113                 echo "</td>\n";
6114                 echo "</tr>\n";
6115                 
6116                 echo "<tr>\n";
6117                 echo '<td>' . _EBLOG_ALLOWPASTPOSTING;
6118                 help('allowpastposting');
6119                 echo "</td>\n";
6120                 echo '<td>';
6121                 $this->input_yesno('allowpastposting',$blog->allowPastPosting(),57);
6122                 echo "</td>\n";
6123                 echo "</tr>\n";
6124                 echo "<tr>\n";
6125                 echo '<td>' . _EBLOG_DISABLECOMMENTS;
6126                 echo "</td>\n";
6127                 echo '<td>';
6128                 $this->input_yesno('comments', $blog->commentsEnabled(), 60);
6129                 echo "</td>\n";
6130                 echo "</tr>\n";
6131                 echo "<tr>\n";
6132                 echo '<td>' . _EBLOG_ANONYMOUS . "</td>\n";
6133                 echo '<td>';
6134                 $this->input_yesno('public',$blog->isPublic(),70);
6135                 echo "</td>\n";
6136                 echo "</tr>\n";
6137                 echo "<tr>\n";
6138                 echo '<td>' . _EBLOG_REQUIREDEMAIL . "</td>\n";
6139                 echo '<td>';
6140                 $this->input_yesno('reqemail', $blog->emailRequired(),72);
6141                 echo "</td>\n";
6142                 echo "</tr>\n";
6143                 echo "<tr>\n";
6144                 echo '<td>' . _EBLOG_NOTIFY;
6145                 help('blognotify');
6146                 echo "</td>\n";
6147                 echo '<td><input name="notify" tabindex="80" maxlength="128" size="40" value="' . Entity::hsc($blog->getNotifyAddress()) . '" />' . "</td>\n";
6148                 echo "</tr>\n";
6149                 
6150                 echo "<tr>\n";
6151                 echo '<td>' . _EBLOG_NOTIFY_ON . "</td>\n";
6152                 echo "<td>\n";
6153                 
6154                 if ( !$blog->notifyOnComment() )
6155                 {
6156                         echo "<input name=\"notifyComment\" value=\"3\" type=\"checkbox\" tabindex=\"81\" id=\"notifyComment\" />\n";
6157                 }
6158                 else
6159                 {
6160                         echo "<input name=\"notifyComment\" value=\"3\" type=\"checkbox\" tabindex=\"81\" id=\"notifyComment\" checked=\"checked\"/>\n";
6161                 }
6162                 echo '<label for="notifyComment">' . _EBLOG_NOTIFY_COMMENT . "</label><br />\n";
6163                 
6164                 if ( !$blog->notifyOnVote() )
6165                 {
6166                         echo "<input name=\"notifyVote\" value=\"5\" type=\"checkbox\" tabindex=\"82\" id=\"notifyVote\" />\n";
6167                 }
6168                 else
6169                 {
6170                         echo "<input name=\"notifyVote\" value=\"5\" type=\"checkbox\" tabindex=\"82\" id=\"notifyVote\" checked=\"checked\" />\n";
6171                 }
6172                 
6173                 echo '<label for="notifyVote">' . _EBLOG_NOTIFY_KARMA . "</label><br />\n";
6174                 
6175                 if ( !$blog->notifyOnNewItem() )
6176                 {
6177                         echo "<input name=\"notifyNewItem\" value=\"7\" type=\"checkbox\" tabindex=\"83\" id=\"notifyNewItem\" />\n";
6178                 
6179                 }
6180                 else
6181                 {
6182                         echo "<input name=\"notifyNewItem\" value=\"7\" type=\"checkbox\" tabindex=\"83\" id=\"notifyNewItem\" checked=\"checked\" />\n";
6183                 }
6184                 
6185                 echo '<label for="notifyNewItem">' . _EBLOG_NOTIFY_ITEM . "</label>\n";
6186                 
6187                 echo "</td>\n";
6188                 echo "</tr>\n";
6189                 echo "<tr>\n";
6190                 echo '<td>' . _EBLOG_MAXCOMMENTS;
6191                 help('blogmaxcomments');
6192                 echo "</td>\n";
6193                 echo '<td><input name="maxcomments" tabindex="90" size="3" value="' . Entity::hsc($blog->getMaxComments()) . '" />' . "</td>\n";
6194                 echo "</tr>\n";
6195                 echo "<tr>\n";
6196                 echo '<td>' . _EBLOG_UPDATE;
6197                 help('blogupdatefile');
6198                 echo "</td>\n";
6199                 echo '<td><input name="update" tabindex="100" size="40" maxlength="60" value="' . Entity::hsc($blog->getUpdateFile()) .'" />' . "</td>\n";
6200                 echo "</tr>\n";
6201                 echo "<tr>\n";
6202                 echo '<td>' . _EBLOG_DEFCAT . "</td>\n";
6203                 echo "<td>\n";
6204                 $query =  "SELECT cname as text, catid as value FROM %s WHERE cblog=%d;";
6205                 $query = sprintf($query, sql_table('category'), (integer) $blog->getID());
6206                 $template['name'] = 'defcat';
6207                 $template['selected'] = $blog->getDefaultCategory();
6208                 $template['tabindex'] = 110;
6209                 showlist($query, 'select', $template);
6210                 echo "</td>\n";
6211                 echo "</tr>\n";
6212                 echo "<tr>\n";
6213                 echo '<td>' . _EBLOG_OFFSET;
6214                 help('blogtimeoffset');
6215                 echo "<br />\n";
6216                 echo _EBLOG_STIME;
6217                 echo ' <b>' . i18n::formatted_datetime('%H:%M', time()) . '</b><br />';
6218                 echo _EBLOG_BTIME;
6219                 echo '<b>' . i18n::formatted_datetime('%H:%M', $blog->getCorrectTime()) . '</b>';
6220                 echo "</td>\n";
6221                 echo '<td><input name="timeoffset" tabindex="120" size="3" value="' . Entity::hsc($blog->getTimeOffset()) .'" />' . "</td>\n";
6222                 echo "</tr>\n";
6223                 echo "<tr>\n";
6224                 echo '<td>' . _EBLOG_SEARCH;
6225                 help('blogsearchable');
6226                 echo "</td>\n";
6227                 echo '<td>';
6228                 $this->input_yesno('searchable', $blog->getSearchable(), 122);
6229                 echo "</td>\n";
6230                 echo "</tr>\n";
6231                 
6232                 // plugin options
6233                 $this->_insertPluginOptions('blog', $blogid);
6234                 
6235                 echo "</tbody>\n";
6236                 echo "</table>\n";
6237                 
6238                 echo "</div>\n";
6239                 echo "</form>\n";
6240                 
6241                 echo '<h3>' . _EBLOG_CAT_TITLE . "</h3>\n";
6242                 
6243                 $query = 'SELECT * FROM '.sql_table('category').' WHERE cblog='.$blog->getID().' ORDER BY cname';
6244                 $template['content'] = 'categorylist';
6245                 $template['tabindex'] = 200;
6246                 
6247                 $manager->loadClass("ENCAPSULATE");
6248                 $batch = new Batch('category');
6249                 $batch->showlist($query,'table',$template);
6250                 
6251                 echo "<form action=\"index.php\" method=\"post\">\n";
6252                 echo "<div>\n";
6253                 echo "<input name=\"action\" value=\"categorynew\" type=\"hidden\" />\n";
6254                 $manager->addTicketHidden() . "\n";
6255                 echo "<input name=\"blogid\" value=\"{$blog->getID()}\" type=\"hidden\" />\n";
6256                 
6257                 echo '<table frame="box" rules="all" summary="' . _EBLOG_CAT_CREATE . '">' . "\n";
6258                 echo "<thead>\n";
6259                 echo "<tr>\n";
6260                 echo '<th colspan="2">' . _EBLOG_CAT_CREATE . "</th>\n";
6261                 echo "</tr>\n";
6262                 echo "</thead>\n";
6263                 echo "<tbody>\n";
6264                 echo "<tr>\n";
6265                 echo '<td>' . _EBLOG_CAT_NAME . "</td>\n";
6266                 echo "<td><input name=\"cname\" size=\"40\" maxlength=\"40\" tabindex=\"300\" /></td>\n";
6267                 echo "</tr>\n";
6268                 echo "<tr>\n";
6269                 echo '<td>' . _EBLOG_CAT_DESC . "</td>\n";
6270                 echo "<td><input name=\"cdesc\" size=\"40\" maxlength=\"200\" tabindex=\"310\" /></td>\n";
6271                 echo "</tr>\n";
6272                 echo "<tr>\n";
6273                 echo '<td>' . _EBLOG_CAT_CREATE . "</td>\n";
6274                 echo '<td><input type="submit" value="' . _EBLOG_CAT_CREATE . '" tabindex="320" />' . "</td>\n";
6275                 echo "</tr>\n";
6276                 echo "</tbody>\n";
6277                 echo "</table>\n";
6278                 echo "</div>\n";
6279                 echo "</form>\n";
6280                 
6281                 echo '<h3>' . _PLUGINS_EXTRA . "</h3>\n";
6282                 $manager->notify('BlogSettingsFormExtras', array('blog' => &$blog));
6283                 
6284                 $this->pagefoot();
6285                 return;
6286         }
6287
6288     /**
6289      * @todo document this
6290      */
6291     function action_categorynew() {
6292         global $member, $manager;
6293
6294         $blogid = intRequestVar('blogid');
6295
6296         $member->blogAdminRights($blogid) or $this->disallow();
6297
6298         $cname = postVar('cname');
6299         $cdesc = postVar('cdesc');
6300
6301         if (!isValidCategoryName($cname))
6302             $this->error(_ERROR_BADCATEGORYNAME);
6303
6304         $query = 'SELECT * FROM '.sql_table('category') . ' WHERE cname=' . DB::quoteValue($cname).' and cblog=' . intval($blogid);
6305         $res = DB::getResult($query);
6306         if ($res->rowCount() > 0)
6307             $this->error(_ERROR_DUPCATEGORYNAME);
6308
6309         $blog       =& $manager->getBlog($blogid);
6310         $newCatID   =  $blog->createNewCategory($cname, $cdesc);
6311
6312         $this->action_blogsettings();
6313     }
6314
6315     /**
6316      * @todo document this
6317      */
6318     function action_categoryedit($catid = '', $blogid = '', $desturl = '') {
6319         global $member, $manager;
6320
6321         if ($blogid == '')
6322             $blogid = intGetVar('blogid');
6323         else
6324             $blogid = intval($blogid);
6325         if ($catid == '')
6326             $catid = intGetVar('catid');
6327         else
6328             $catid = intval($catid);
6329
6330         $member->blogAdminRights($blogid) or $this->disallow();
6331
6332         $res = DB::getRow('SELECT * FROM '.sql_table('category')." WHERE cblog=$blogid AND catid=$catid");
6333
6334         $cname = $res['cname'];
6335         $cdesc = $res['cdesc'];
6336
6337         $extrahead = '<script type="text/javascript" src="javascript/numbercheck.js"></script>';
6338         $this->pagehead($extrahead);
6339
6340         echo "<p><a href='index.php?action=blogsettings&amp;blogid=$blogid'>(",_BACK_TO_BLOGSETTINGS,")</a></p>";
6341
6342         ?>
6343         <h2><?php echo _EBLOG_CAT_UPDATE ?> '<?php echo Entity::hsc($cname) ?>'</h2>
6344         <form method='post' action='index.php'><div>
6345         <input name="blogid" type="hidden" value="<?php echo $blogid ?>" />
6346         <input name="catid" type="hidden" value="<?php echo $catid ?>" />
6347         <input name="desturl" type="hidden" value="<?php echo Entity::hsc($desturl) ?>" />
6348         <input name="action" type="hidden" value="categoryupdate" />
6349         <?php $manager->addTicketHidden(); ?>
6350
6351         <table><tr>
6352             <th colspan="2"><?php echo _EBLOG_CAT_UPDATE ?></th>
6353         </tr><tr>
6354             <td><?php echo _EBLOG_CAT_NAME ?></td>
6355             <td><input type="text" name="cname" value="<?php echo Entity::hsc($cname) ?>" size="40" maxlength="40" /></td>
6356         </tr><tr>
6357             <td><?php echo _EBLOG_CAT_DESC ?></td>
6358             <td><input type="text" name="cdesc" value="<?php echo Entity::hsc($cdesc) ?>" size="40" maxlength="200" /></td>
6359         </tr>
6360         <?php
6361             // insert plugin options
6362             $this->_insertPluginOptions('category',$catid);
6363         ?>
6364         <tr>
6365             <th colspan="2"><?php echo _EBLOG_CAT_UPDATE ?></th>
6366         </tr><tr>
6367             <td><?php echo _EBLOG_CAT_UPDATE ?></td>
6368             <td><input type="submit" value="<?php echo _EBLOG_CAT_UPDATE_BTN ?>" /></td>
6369         </tr></table>
6370
6371         </div></form>
6372         <?php
6373         $this->pagefoot();
6374     }
6375
6376     /**
6377      * @todo document this
6378      */
6379     function action_categoryupdate() {
6380         global $member, $manager;
6381
6382         $blogid = intPostVar('blogid');
6383         $catid = intPostVar('catid');
6384         $cname = postVar('cname');
6385         $cdesc = postVar('cdesc');
6386         $desturl = postVar('desturl');
6387
6388         $member->blogAdminRights($blogid) or $this->disallow();
6389
6390         if (!isValidCategoryName($cname))
6391             $this->error(_ERROR_BADCATEGORYNAME);
6392
6393         $query = 'SELECT * FROM '.sql_table('category').' WHERE cname=' . DB::quoteValue($cname).' and cblog=' . intval($blogid) . " and not(catid=$catid)";
6394         $res = DB::getResult($query);
6395         if ($res->rowCount() > 0)
6396             $this->error(_ERROR_DUPCATEGORYNAME);
6397
6398         $query =  'UPDATE '.sql_table('category').' SET'
6399                . ' cname=' . DB::quoteValue($cname) . ','
6400                . ' cdesc=' . DB::quoteValue($cdesc)
6401                . ' WHERE catid=' . $catid;
6402
6403         DB::execute($query);
6404
6405         // store plugin options
6406         $aOptions = requestArray('plugoption');
6407         NucleusPlugin::apply_plugin_options($aOptions);
6408         $manager->notify('PostPluginOptionsUpdate',array('context' => 'category', 'catid' => $catid));
6409
6410
6411         if ($desturl) {
6412             redirect($desturl);
6413             exit;
6414         } else {
6415             $this->action_blogsettings();
6416         }
6417     }
6418
6419     /**
6420      * @todo document this
6421      */
6422     function action_categorydelete() {
6423         global $member, $manager;
6424
6425         $blogid = intRequestVar('blogid');
6426         $catid = intRequestVar('catid');
6427
6428         $member->blogAdminRights($blogid) or $this->disallow();
6429
6430         $blog =& $manager->getBlog($blogid);
6431
6432         // check if the category is valid
6433         if (!$blog->isValidCategory($catid))
6434             $this->error(_ERROR_NOSUCHCATEGORY);
6435
6436         // don't allow deletion of default category
6437         if ($blog->getDefaultCategory() == $catid)
6438             $this->error(_ERROR_DELETEDEFCATEGORY);
6439
6440         // check if catid is the only category left for blogid
6441         $query = 'SELECT catid FROM '.sql_table('category').' WHERE cblog=' . $blogid;
6442         $res = DB::getResult($query);
6443         if ($res->rowCount() == 1)
6444             $this->error(_ERROR_DELETELASTCATEGORY);
6445
6446
6447         $this->pagehead();
6448         ?>
6449             <h2><?php echo _DELETE_CONFIRM ?></h2>
6450
6451             <div>
6452             <?php echo _CONFIRMTXT_CATEGORY ?><b><?php echo  Entity::hsc($blog->getCategoryName($catid)) ?></b>
6453             </div>
6454
6455             <form method="post" action="index.php"><div>
6456             <input type="hidden" name="action" value="categorydeleteconfirm" />
6457             <?php $manager->addTicketHidden() ?>
6458             <input type="hidden" name="blogid" value="<?php echo $blogid ?>" />
6459             <input type="hidden" name="catid" value="<?php echo $catid ?>" />
6460             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN ?>" />
6461             </div></form>
6462         <?php
6463         $this->pagefoot();
6464     }
6465
6466     /**
6467      * @todo document this
6468      */
6469     function action_categorydeleteconfirm() {
6470         global $member, $manager;
6471
6472         $blogid = intRequestVar('blogid');
6473         $catid = intRequestVar('catid');
6474
6475         $member->blogAdminRights($blogid) or $this->disallow();
6476
6477         $error = $this->deleteOneCategory($catid);
6478         if ($error)
6479             $this->error($error);
6480
6481         $this->action_blogsettings();
6482     }
6483 =======
6484         
6485         /**
6486          * Admin::action_skinedit()
6487          * 
6488          * @param       void
6489          * @return      void
6490          */
6491         static private function action_skinedit()
6492         {
6493                 global $member;
6494                 
6495                 $member->isAdmin() or self::disallow();
6496                 
6497                 self::$skin->parse('skinedit');
6498                 return;
6499         }
6500         
6501         /**
6502          * Admin::action_skineditgeneral()
6503          * 
6504          * @param       void
6505          * @return      void
6506          */
6507         static private function action_skineditgeneral()
6508         {
6509                 global $member;
6510                 
6511                 $skinid = intRequestVar('skinid');
6512                 
6513                 $member->isAdmin() or self::disallow();
6514                 
6515                 $error = self::skineditgeneral($skinid);
6516                 if ( $error )
6517                 {
6518                         self::error($error);
6519                         return;
6520                 }
6521                 
6522                 self::action_skinedit();
6523                 return;
6524         }
6525         
6526         static private function action_skinedittype($msg = '')
6527         {
6528                 global $member;
6529                 
6530                 $member->isAdmin() or self::disallow();
6531                 
6532                 if ( $msg )
6533                 {
6534                         self::$headMess = $msg;
6535                 }
6536                 
6537                 $type = requestVar('type');
6538                 $type = trim($type);
6539                 $type = strtolower($type);
6540                 
6541                 if ( !isValidShortName($type) )
6542                 {
6543                         self::error(_ERROR_SKIN_PARTS_SPECIAL_FORMAT);
6544                         return;
6545                 }
6546                 
6547                 self::$skin->parse('skinedittype');
6548                 return;
6549         }
6550 >>>>>>> skinnable-master
6551         
6552         /**
6553          * Admin::action_skinupdate()
6554          * 
6555          * @param       void
6556          * @return      void
6557          */
6558         static private function action_skinupdate()
6559         {
6560                 global $manager, $member;
6561                 
6562                 $skinid = intRequestVar('skinid');
6563                 $content = trim(postVar('content'));
6564                 $type = postVar('type');
6565                 
6566                 $member->isAdmin() or self::disallow();
6567                 
6568                 $skin =& $manager->getSKIN($skinid);
6569                 $skin->update($type, $content);
6570                 
6571                 self::action_skinedittype(_SKIN_UPDATED);
6572                 return;
6573         }
6574         
6575         /**
6576          * Admin::action_skindelete()
6577          * 
6578          * @param       void
6579          * @return      void
6580          */
6581         static private function action_skindelete()
6582         {
6583                 global $CONF, $member;
6584                 
6585                 $member->isAdmin() or self::disallow();
6586                 
6587                 $skinid = intRequestVar('skinid');
6588                 
6589                 // don't allow default skin to be deleted
6590                 if ( $skinid == $CONF['BaseSkin'] )
6591                 {
6592                         self::error(_ERROR_DEFAULTSKIN);
6593                         return;
6594                 }
6595                 
6596                 // don't allow deletion of default skins for blogs
6597                 $query = "SELECT bname FROM %s WHERE bdefskin=%d";
6598                 $query = sprintf($query, sql_table('blog'), (integer) $skinid);
6599                 
6600                 $name = DB::getValue($query);
6601                 if ( $name )
6602                 {
6603                         self::error(_ERROR_SKINDEFDELETE . Entity::hsc($name));
6604                         return;
6605                 }
6606                 
6607                 self::$skin->parse('skindelete');
6608                 return;
6609         }
6610         
6611         /**
6612          * Admin::action_skindeleteconfirm()
6613          * 
6614          * @param       void
6615          * @return      void
6616          */
6617         static private function action_skindeleteconfirm()
6618         {
6619                 global $member, $CONF;
6620                 
6621                 $member->isAdmin() or self::disallow();
6622                 
6623                 $skinid = intRequestVar('skinid');
6624                 
6625                 // don't allow default skin to be deleted
6626                 if ( $skinid == $CONF['BaseSkin'] )
6627                 {
6628                         self::error(_ERROR_DEFAULTSKIN);
6629                         return;
6630                 }
6631                 
6632 <<<<<<< HEAD
6633                 // check if catid is the only category left for blogid
6634                 $query = 'SELECT catid FROM '.sql_table('category').' WHERE cblog=' . $blogid;
6635                 $res = DB::getResult($query);
6636                 if ( $res->rowCount() == 1 )
6637 =======
6638                 // don't allow deletion of default skins for blogs
6639                 $query = "SELECT bname FROM %s WHERE bdefskin=%d;";
6640                 $query = sprintf($query, sql_table('blog'), (integer) $skinid);
6641                 
6642                 $name = DB::getValue($query);
6643                 if ( $name )
6644                                 {
6645                         self::error(_ERROR_SKINDEFDELETE . Entity::hsc($name));
6646                         return;
6647                 }
6648                 
6649                 self::skindeleteconfirm($skinid);
6650                 
6651                 self::action_skinoverview();
6652                 return;
6653         }
6654         
6655         /**
6656          * Admin::action_skinremovetype()
6657          * 
6658          * @param       void
6659          * @return      void
6660          */
6661         static private function action_skinremovetype()
6662         {
6663                 global $member, $CONF;
6664                 
6665                 $member->isAdmin() or self::disallow();
6666                 
6667                 $skinid = intRequestVar('skinid');
6668                 $skintype = requestVar('type');
6669                 
6670                 if ( !isValidShortName($skintype) )
6671 >>>>>>> skinnable-master
6672                 {
6673                         self::error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);
6674                         return;
6675                 }
6676                 
6677                 self::$skin->parse('skinremovetype');
6678                 return;
6679         }
6680         
6681         /**
6682          * Admin::action_skinremovetypeconfirm()
6683          * 
6684          * @param       void
6685          * @return      void
6686          */
6687         static private function action_skinremovetypeconfirm()
6688         {
6689                 global $member;
6690                 
6691 <<<<<<< HEAD
6692                 // change category for all items to the default category
6693                 $query = 'UPDATE '.sql_table('item')." SET icat=$destcatid WHERE icat=$catid";
6694                 DB::execute($query);
6695 =======
6696                 $member->isAdmin() or self::disallow();
6697 >>>>>>> skinnable-master
6698                 
6699                 $skinid = intRequestVar('skinid');
6700                 $skintype = requestVar('type');
6701                 
6702 <<<<<<< HEAD
6703                 // delete category
6704                 $query = 'DELETE FROM '.sql_table('category').' WHERE catid=' .$catid;
6705                 DB::execute($query);
6706 =======
6707                 $error = self::skinremovetypeconfirm($skinid, $skintype);
6708                 if ( $error )
6709                 {
6710                         self::error($error);
6711                         return;
6712                 }
6713 >>>>>>> skinnable-master
6714                 
6715                 self::action_skinedit();
6716                 return;
6717         }
6718         
6719         /**
6720          * Admin::action_skinclone()
6721          * 
6722          * @param       void
6723          * @return      void
6724          */
6725         static private function action_skinclone()
6726         {
6727                 global $member;
6728                 
6729                 $member->isAdmin() or self::disallow();
6730                 
6731                 $skinid = intRequestVar('skinid');
6732                 
6733                 self::skinclone($skinid);
6734                 
6735                 self::action_skinoverview();
6736                 return;
6737         }
6738         
6739         /**
6740          * Admin::action_adminskinoverview()
6741          * 
6742          * @param       void
6743          * @return      void
6744          */
6745         static private function action_adminskinoverview()
6746         {
6747                 global $member;
6748                 
6749                 $member->isAdmin() or self::disallow();
6750                 
6751                 self::$skin->parse('adminskinoverview');
6752                 return;
6753         }
6754         
6755         /**
6756          * Admin::action_adminskinnew()
6757          * 
6758          * @param       void
6759          * @return      void
6760          */
6761         static private function action_adminskinnew()
6762         {
6763                 global $member;
6764                 
6765                 $member->isAdmin() or self::disallow();
6766                 
6767                 $name = trim(postVar('name'));
6768                 $desc = trim(postVar('desc'));
6769                 
6770                 if ( !isValidSkinName($name) )
6771                 {
6772                         self::error(_ERROR_BADSKINNAME);
6773                         return;
6774                 }
6775                 else if ( !preg_match('#^admin/#', $name) )
6776                 {
6777                         self::error(_ERROR_BADADMINSKINNAME);
6778                         return;
6779                 }
6780                 else if ( Skin::exists($name) )
6781                 {
6782                         self::error(_ERROR_DUPSKINNAME);
6783                         return;
6784                 }
6785                 
6786                 Skin::createNew($name, $desc);
6787                 
6788                 self::action_adminskinoverview();
6789                 return;
6790         }
6791         
6792         /**
6793          * Admin::action_adminskinedit()
6794          * 
6795          * @param       void
6796          * @return      void
6797          */
6798         static private function action_adminskinedit()
6799         {
6800                 global $member;
6801                 
6802                 $member->isAdmin() or self::disallow();
6803                 
6804                 self::$skin->parse('adminskinedit');
6805                 
6806                 return;
6807         }
6808         
6809         /**
6810          * Admin::action_adminskineditgeneral()
6811          * 
6812          * @param       void
6813          * @return      void
6814          */
6815         static private function action_adminskineditgeneral()
6816         {
6817                 global $member;
6818                 
6819                 $skinid = intRequestVar('skinid');
6820                 
6821                 $member->isAdmin() or self::disallow();
6822                 
6823                 $error = self::skineditgeneral($skinid, 'AdminActions');
6824                 if ( $error )
6825                 {
6826                         self::error($error);
6827                         return;
6828                 }
6829                 
6830                 self::action_adminskinedit();
6831                 return;
6832         }
6833         
6834         /**
6835          * Admin::action_adminskinedittype()
6836          * 
6837          * @param       string  $msg    message for pageheader
6838          * @return      void
6839          */
6840         static private function action_adminskinedittype($msg = '')
6841         {
6842                 global $member;
6843                 
6844                 $member->isAdmin() or self::disallow();
6845                 
6846                 if ( $msg )
6847                 {
6848                         self::$headMess = $msg;
6849                 }
6850                 $type = requestVar('type');
6851                 $type = trim($type);
6852                 $type = strtolower($type);
6853                 
6854                 if ( !isValidShortName($type) )
6855                 {
6856                         self::error(_ERROR_SKIN_PARTS_SPECIAL_FORMAT);
6857                         return;
6858                 }
6859                 
6860                 self::$skin->parse('adminskinedittype');
6861                 return;
6862         }
6863         
6864         /**
6865          * Admin::action_adminskinupdate()
6866          * 
6867          * @param       void
6868          * @return      void
6869          */
6870         static private function action_adminskinupdate()
6871         {
6872                 global $manager, $member;
6873                 
6874                 $skinid = intRequestVar('skinid');
6875                 $content = trim(postVar('content'));
6876                 $type = postVar('type');
6877                 
6878                 $member->isAdmin() or self::disallow();
6879                 
6880                 $skin =& $manager->getSkin($skinid, 'AdminActions', 'AdminSkin');
6881                 $skin->update($type, $content);
6882                 
6883                 self::action_adminskinedittype(_SKIN_UPDATED);
6884                 return;
6885         }
6886         
6887         /**
6888          * Admin::action_adminskindelete()
6889          * 
6890          * @param       void
6891          * @return      void
6892          */
6893         static private function action_adminskindelete()
6894         {
6895                 global $CONF, $member;
6896                 
6897                 $member->isAdmin() or self::disallow();
6898                 
6899                 $skinid = intRequestVar('skinid');
6900                 
6901                 // don't allow default skin to be deleted
6902                 if ( $skinid == $CONF['AdminSkin'] || $skinid == $CONF['BookmarkletSkin'] )
6903                 {
6904                         self::error(_ERROR_DEFAULTSKIN);
6905                         return;
6906                 }
6907                 
6908                 /* don't allow if someone use it as a default*/
6909                 $query = 'SELECT * FROM %s WHERE madminskin = %d or mbkmklt = %d;';
6910                 $res = DB::getResult(sprintf($query, sql_table('member'), $skinid, $skinid));
6911                 
6912                 $members = array();
6913                 while ( $row = $res->fetch() ) {
6914                         $members[] = $row['mrealname'];
6915                 }
6916                 if ( count($members) )
6917                 {
6918                         self::error(_ERROR_SKINDEFDELETE . implode(' ' . _AND . ' ', $members));
6919                         return;
6920                 }
6921                 
6922                 self::$skin->parse('adminskindelete');
6923                 return;
6924         }
6925
6926         /**
6927          * Admin::action_adminskindeleteconfirm()
6928          * 
6929          * @param       void
6930          * @return      void
6931          */
6932         static private function action_adminskindeleteconfirm()
6933         {
6934                 global $member, $CONF;
6935                 
6936                 $member->isAdmin() or self::disallow();
6937                 
6938                 $skinid = intRequestVar('skinid');
6939                 
6940                 // don't allow default skin to be deleted
6941                 if ( $skinid == $CONF['AdminSkin'] || $skinid == $CONF['BookmarkletSkin'] )
6942                 {
6943                         self::error(_ERROR_DEFAULTSKIN);
6944                         return;
6945                 }
6946                 
6947                 /* don't allow if someone use it as a default*/
6948                 $query = 'SELECT * FROM %s WHERE madminskin = %d or mbkmklt = %d;';
6949                 $res = DB::getResult(sprintf($query, sql_table('member'), $skinid, $skinid));
6950                 
6951                 $members = array();
6952                 while ( $row = $res->fetch() ) {
6953                         $members[] = $row['mrealname'];
6954                 }
6955                 if ( count($members) )
6956                 {
6957                         self::error(_ERROR_SKINDEFDELETE . implode(' ' . _AND . ' ', $members));
6958                         return;
6959                 }
6960                 
6961                 self::skindeleteconfirm($skinid);
6962                 
6963                 self::action_adminskinoverview();
6964                 return;
6965         }
6966         
6967         /**
6968          * Admin::action_adminskinremovetype()
6969          * 
6970          * @param       void
6971          * @return      void
6972          */
6973         static private function action_adminskinremovetype()
6974         {
6975                 global $member, $CONF;
6976
6977                 $member->isAdmin() or self::disallow();
6978                 
6979                 $skinid = intRequestVar('skinid');
6980                 $skintype = requestVar('type');
6981                 
6982                 if ( !isValidShortName($skintype) )
6983                 {
6984                         self::error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);
6985                         return;
6986                 }
6987                 
6988                 self::$skin->parse('adminskinremovetype');
6989                 return;
6990         }
6991 <<<<<<< HEAD
6992
6993     /**
6994      * @todo document this
6995      */
6996     function action_deleteblog() {
6997         global $member, $CONF, $manager;
6998
6999         $blogid = intRequestVar('blogid');
7000
7001         $member->blogAdminRights($blogid) or $this->disallow();
7002
7003         // check if blog is default blog
7004         if ($CONF['DefaultBlog'] == $blogid)
7005             $this->error(_ERROR_DELDEFBLOG);
7006
7007         $blog =& $manager->getBlog($blogid);
7008
7009         $this->pagehead();
7010         ?>
7011             <h2><?php echo _DELETE_CONFIRM ?></h2>
7012
7013             <p><?php echo _WARNINGTXT_BLOGDEL ?>
7014             </p>
7015
7016             <div>
7017             <?php echo _CONFIRMTXT_BLOG ?><b><?php echo  Entity::hsc($blog->getName()) ?></b>
7018             </div>
7019
7020             <form method="post" action="index.php"><div>
7021             <input type="hidden" name="action" value="deleteblogconfirm" />
7022             <?php $manager->addTicketHidden() ?>
7023             <input type="hidden" name="blogid" value="<?php echo  $blogid; ?>" />
7024             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN ?>" />
7025             </div></form>
7026         <?php
7027         $this->pagefoot();
7028     }
7029 =======
7030 >>>>>>> skinnable-master
7031         
7032         /**
7033          * Admin::action_adminskinremovetypeconfirm()
7034          * 
7035          * @param       void
7036          * @return      void
7037          */
7038         static private function action_adminskinremovetypeconfirm()
7039         {
7040                 global $member;
7041                 
7042                 $member->isAdmin() or self::disallow();
7043                 
7044                 $skinid = intRequestVar('skinid');
7045                 $skintype = requestVar('type');
7046                 
7047                 $error = self::skinremovetypeconfirm($skinid, $skintype);
7048                 if ( $error )
7049                 {
7050                         self::error($error);
7051                         return;
7052                 }
7053                 
7054 <<<<<<< HEAD
7055                 // delete all comments
7056                 $query = 'DELETE FROM '.sql_table('comment').' WHERE cblog='.$blogid;
7057                 DB::execute($query);
7058                 
7059                 // delete all items
7060                 $query = 'DELETE FROM '.sql_table('item').' WHERE iblog='.$blogid;
7061                 DB::execute($query);
7062                 
7063                 // delete all team members
7064                 $query = 'DELETE FROM '.sql_table('team').' WHERE tblog='.$blogid;
7065                 DB::execute($query);
7066                 
7067                 // delete all bans
7068                 $query = 'DELETE FROM '.sql_table('ban').' WHERE blogid='.$blogid;
7069                 DB::execute($query);
7070                 
7071                 // delete all categories
7072                 $query = 'DELETE FROM '.sql_table('category').' WHERE cblog='.$blogid;
7073                 DB::execute($query);
7074 =======
7075                 self::action_adminskinedit();
7076                 return;
7077         }
7078
7079         /**
7080          * Admin::action_adminskinclone()
7081          * 
7082          * @param       void
7083          * @return      void
7084          */
7085         static private function action_adminskinclone()
7086         {
7087                 global $member;
7088                 
7089                 $member->isAdmin() or self::disallow();
7090                 
7091                 $skinid = intRequestVar('skinid');
7092 >>>>>>> skinnable-master
7093                 
7094                 self::skinclone($skinid, 'AdminActions');
7095                 
7096 <<<<<<< HEAD
7097                 // delete the blog itself
7098                 $query = 'DELETE FROM '.sql_table('blog').' WHERE bnumber='.$blogid;
7099                 DB::execute($query);
7100 =======
7101                 self::action_adminskinoverview();
7102                 return;
7103         }
7104         
7105         /**
7106          * Admin::action_adminskinieoverview()
7107          * 
7108          * @param       void
7109          * @return      void
7110          */
7111         static private function action_adminskinieoverview()
7112         {
7113                 global $member;
7114 >>>>>>> skinnable-master
7115                 
7116                 $member->isAdmin() or self::disallow();
7117                 
7118                 self::$skin->parse('adminskinieoverview');
7119                 return;
7120         }
7121 <<<<<<< HEAD
7122         
7123     /**
7124      * @todo document this
7125      */
7126     function action_memberdelete() {
7127         global $member, $manager;
7128
7129         $memberid = intRequestVar('memberid');
7130
7131         ($member->getID() == $memberid) or $member->isAdmin() or $this->disallow();
7132
7133         $mem =& $manager->getMember($memberid);
7134
7135         $this->pagehead();
7136         ?>
7137             <h2><?php echo _DELETE_CONFIRM ?></h2>
7138
7139             <p><?php echo _CONFIRMTXT_MEMBER ?><b><?php echo Entity::hsc($mem->getDisplayName()) ?></b>
7140             </p>
7141
7142             <p>
7143             <?php echo _WARNINGTXT_NOTDELMEDIAFILES ?>
7144             </p>
7145
7146             <form method="post" action="index.php"><div>
7147             <input type="hidden" name="action" value="memberdeleteconfirm" />
7148             <?php $manager->addTicketHidden() ?>
7149             <input type="hidden" name="memberid" value="<?php echo  $memberid; ?>" />
7150             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN ?>" />
7151             </div></form>
7152         <?php
7153         $this->pagefoot();
7154     }
7155
7156     /**
7157      * @todo document this
7158      */
7159     function action_memberdeleteconfirm() {
7160         global $member;
7161 =======
7162 >>>>>>> skinnable-master
7163
7164         /**
7165          * Admin::action_adminskinieimport()
7166          * 
7167          * @param       void
7168          * @return      void
7169          */
7170         static private function action_adminskinieimport()
7171         {
7172                 global $member;
7173                 
7174 <<<<<<< HEAD
7175                 $memberid = intval($memberid);
7176                 $mem =& $manager->getMember($memberid);
7177                 
7178                 if ( !$mem->canBeDeleted() )
7179                 {
7180                         return _ERROR_DELETEMEMBER;
7181                 }
7182 =======
7183                 $member->isAdmin() or self::disallow();
7184 >>>>>>> skinnable-master
7185                 
7186                 $skinFileRaw = postVar('skinfile');
7187                 $mode = postVar('mode');
7188                 
7189                 $error = self::skinieimport($mode, $skinFileRaw);
7190                 if ( $error )
7191                 {
7192 <<<<<<< HEAD
7193                         $query = "UPDATE %s SET cmember=0, cuser=%s WHERE cmember=%d";
7194                         $query = sprintf($query, sql_table('comment'), DB::quoteValue($mem->getDisplayName()), $memberid);
7195                         DB::execute($query);
7196                 }
7197                 
7198                 $query = 'DELETE FROM '.sql_table('member').' WHERE mnumber='.$memberid;
7199                 DB::execute($query);
7200                 
7201                 $query = 'DELETE FROM '.sql_table('team').' WHERE tmember='.$memberid;
7202                 DB::execute($query);
7203                 
7204                 $query = 'DELETE FROM '.sql_table('activation').' WHERE vmember='.$memberid;
7205                 DB::execute($query);
7206                 
7207                 // delete all associated plugin options
7208                 NucleusPlugin::delete_option_values('member', $memberid);
7209                 
7210                 $manager->notify('PostDeleteMember', array('member' => &$mem));
7211                 
7212                 return '';
7213         }
7214         
7215     /**
7216      * @todo document this
7217      */
7218     function action_createnewlog() {
7219         global $member, $CONF, $manager;
7220
7221         // Only Super-Admins can do this
7222         $member->isAdmin() or $this->disallow();
7223
7224         $this->pagehead();
7225
7226         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';
7227         ?>
7228         <h2><?php echo _EBLOG_CREATE_TITLE ?></h2>
7229
7230         <h3><?php echo _ADMIN_NOTABILIA ?></h3>
7231
7232         <p><?php echo _ADMIN_PLEASE_READ ?></p>
7233
7234         <p><?php echo _ADMIN_HOW_TO_ACCESS ?></p>
7235
7236         <ol>
7237             <li><?php echo _ADMIN_SIMPLE_WAY ?></li>
7238             <li><?php echo _ADMIN_ADVANCED_WAY ?></li>
7239         </ol>
7240
7241         <h3><?php echo _ADMIN_HOW_TO_CREATE ?></h3>
7242
7243         <p>
7244         <?php echo _EBLOG_CREATE_TEXT ?>
7245         </p>
7246
7247         <form method="post" action="index.php"><div>
7248
7249         <input type="hidden" name="action" value="addnewlog" />
7250         <?php $manager->addTicketHidden() ?>
7251
7252
7253         <table><tr>
7254             <td><?php echo _EBLOG_NAME ?></td>
7255             <td><input name="name" tabindex="10" size="40" maxlength="60" /></td>
7256         </tr><tr>
7257             <td><?php echo _EBLOG_SHORTNAME ?>
7258                 <?php help('shortblogname'); ?>
7259             </td>
7260             <td><input name="shortname" tabindex="20" maxlength="15" size="15" /></td>
7261         </tr><tr>
7262             <td><?php echo _EBLOG_DESC ?></td>
7263             <td><input name="desc" tabindex="30" maxlength="200" size="40" /></td>
7264         </tr><tr>
7265             <td><?php echo _EBLOG_DEFSKIN ?>
7266                 <?php help('blogdefaultskin'); ?>
7267             </td>
7268             <td>
7269                 <?php
7270                     $query =  'SELECT sdname as text, sdnumber as value'
7271                            . ' FROM '.sql_table('skin_desc');
7272                     $template['name'] = 'defskin';
7273                     $template['tabindex'] = 50;
7274                     $template['selected'] = $CONF['BaseSkin'];  // set default selected skin to be globally defined base skin
7275                     showlist($query,'select',$template);
7276                 ?>
7277             </td>
7278         </tr><tr>
7279             <td><?php echo _EBLOG_OFFSET ?>
7280                 <?php help('blogtimeoffset'); ?>
7281                 <br /><?php echo _EBLOG_STIME ?> <b><?php echo i18n::formatted_datetime('%H:%M',time()); ?></b>
7282             </td>
7283             <td><input name="timeoffset" tabindex="110" size="3" value="0" /></td>
7284         </tr><tr>
7285             <td><?php echo _EBLOG_ADMIN ?>
7286                 <?php help('teamadmin'); ?>
7287             </td>
7288             <td><?php echo _EBLOG_ADMIN_MSG ?></td>
7289         </tr><tr>
7290             <td><?php echo _EBLOG_CREATE ?></td>
7291             <td><input type="submit" tabindex="120" value="<?php echo _EBLOG_CREATE_BTN ?>" onclick="return checkSubmit();" /></td>
7292         </tr></table>
7293
7294         </div></form>
7295         <?php
7296         $this->pagefoot();
7297     }
7298
7299     /**
7300      * @todo document this
7301      */
7302     function action_addnewlog() {
7303         global $member, $manager, $CONF;
7304
7305         // Only Super-Admins can do this
7306         $member->isAdmin() or $this->disallow();
7307
7308         $bname          = trim(postVar('name'));
7309         $bshortname     = trim(postVar('shortname'));
7310         $btimeoffset    = postVar('timeoffset');
7311         $bdesc          = trim(postVar('desc'));
7312         $bdefskin       = postVar('defskin');
7313
7314         if (!isValidShortName($bshortname))
7315             $this->error(_ERROR_BADSHORTBLOGNAME);
7316
7317         if ($manager->existsBlog($bshortname))
7318             $this->error(_ERROR_DUPSHORTBLOGNAME);
7319
7320         $manager->notify(
7321             'PreAddBlog',
7322             array(
7323                 'name' => &$bname,
7324                 'shortname' => &$bshortname,
7325                 'timeoffset' => &$btimeoffset,
7326                 'description' => &$bdesc,
7327                 'defaultskin' => &$bdefskin
7328             )
7329         );
7330
7331
7332         // create blog
7333                 $query = sprintf('INSERT INTO %s (bname, bshortname, bdesc, btimeoffset, bdefskin) VALUES (%s, %s, %s, %s, %s)',
7334                         sql_table('blog'),
7335                         DB::quoteValue($bname),
7336                         DB::quoteValue($bshortname),
7337                         DB::quoteValue($bdesc),
7338                         DB::quoteValue($btimeoffset),
7339                         DB::quoteValue($bdefskin)
7340                 );
7341         DB::execute($query);
7342         $blogid = DB::getInsertId();
7343         $blog   =& $manager->getBlog($blogid);
7344
7345         // create new category
7346         $catdefname = (defined('_EBLOGDEFAULTCATEGORY_NAME') ? _EBLOGDEFAULTCATEGORY_NAME : 'General');
7347         $catdefdesc = (defined('_EBLOGDEFAULTCATEGORY_DESC') ? _EBLOGDEFAULTCATEGORY_DESC : 'Items that do not fit in other categories');
7348                 $query = sprintf('INSERT INTO %s (cblog, cname, cdesc) VALUES (%d, %s, %s)',
7349                         sql_table('category'),
7350                         $blogid,
7351                         DB::quoteValue($catdefname),
7352                         DB::quoteValue($catdefdesc)
7353                 );
7354         DB::execute($query);
7355         $catid = DB::getInsertId();
7356
7357         // set as default category
7358         $blog->setDefaultCategory($catid);
7359         $blog->writeSettings();
7360
7361         // create team member
7362         $memberid = $member->getID();
7363         $query = sprintf('INSERT INTO %s (tmember, tblog, tadmin) VALUES (%d, %d, 1)', sql_table('team'), $memberid, $blogid);
7364         DB::execute($query);
7365
7366         $itemdeftitle = (defined('_EBLOG_FIRSTITEM_TITLE') ? _EBLOG_FIRSTITEM_TITLE : 'First Item');
7367         $itemdefbody = (defined('_EBLOG_FIRSTITEM_BODY') ? _EBLOG_FIRSTITEM_BODY : 'This is the first item in your weblog. Feel free to delete it.');
7368
7369         $blog->additem($blog->getDefaultCategory(),$itemdeftitle,$itemdefbody,'',$blogid, $memberid,$blog->getCorrectTime(),0,0,0);
7370
7371         
7372         $manager->notify(
7373             'PostAddBlog',
7374             array(
7375                 'blog' => &$blog
7376             )
7377         );
7378
7379         $manager->notify(
7380             'PostAddCategory',
7381             array(
7382                 'blog' => &$blog,
7383                 'name' => _EBLOGDEFAULTCATEGORY_NAME,
7384                 'description' => _EBLOGDEFAULTCATEGORY_DESC,
7385                 'catid' => $catid
7386             )
7387         );
7388
7389         $this->pagehead();
7390         ?>
7391         <h2><?php echo _BLOGCREATED_TITLE ?></h2>
7392
7393         <p><?php echo sprintf(_BLOGCREATED_ADDEDTXT, Entity::hsc($bname)) ?></p>
7394
7395         <ol>
7396             <li><a href="#index_php"><?php echo sprintf(_BLOGCREATED_SIMPLEWAY, Entity::hsc($bshortname)) ?></a></li>
7397             <li><a href="#skins"><?php echo _BLOGCREATED_ADVANCEDWAY ?></a></li>
7398         </ol>
7399
7400         <h3><a id="index_php"><?php echo sprintf(_BLOGCREATED_SIMPLEDESC1, Entity::hsc($bshortname)) ?></a></h3>
7401
7402         <p><?php echo sprintf(_BLOGCREATED_SIMPLEDESC2, Entity::hsc($bshortname)) ?></p>
7403 <pre><code>&lt;?php
7404
7405 $CONF['Self'] = '<b><?php echo Entity::hsc($bshortname) ?>.php</b>';
7406
7407 include('<i>./config.php</i>');
7408
7409 selectBlog('<b><?php echo Entity::hsc($bshortname) ?></b>');
7410 selector();
7411
7412 ?&gt;</code></pre>
7413
7414         <p><?php echo _BLOGCREATED_SIMPLEDESC3 ?></p>
7415
7416         <p><?php echo _BLOGCREATED_SIMPLEDESC4 ?></p>
7417
7418         <form action="index.php" method="post"><div>
7419             <input type="hidden" name="action" value="addnewlog2" />
7420             <?php $manager->addTicketHidden() ?>
7421             <input type="hidden" name="blogid" value="<?php echo intval($blogid) ?>" />
7422             <table><tr>
7423                 <td><?php echo _EBLOG_URL ?></td>
7424                 <td><input name="url" maxlength="100" size="40" value="<?php echo Entity::hsc($CONF['IndexURL'].$bshortname.'.php') ?>" /></td>
7425             </tr><tr>
7426                 <td><?php echo _EBLOG_CREATE ?></td>
7427                 <td><input type="submit" value="<?php echo _EBLOG_CREATE_BTN ?>" onclick="return checkSubmit();" /></td>
7428             </tr></table>
7429         </div></form>
7430
7431         <h3><a id="skins"><?php echo _BLOGCREATED_ADVANCEDWAY2 ?></a></h3>
7432
7433         <p><?php echo _BLOGCREATED_ADVANCEDWAY3 ?></p>
7434
7435         <form action="index.php" method="post"><div>
7436             <input type="hidden" name="action" value="addnewlog2" />
7437             <?php $manager->addTicketHidden() ?>
7438             <input type="hidden" name="blogid" value="<?php echo intval($blogid) ?>" />
7439             <table><tr>
7440                 <td><?php echo _EBLOG_URL ?></td>
7441                 <td><input name="url" maxlength="100" size="40" /></td>
7442             </tr><tr>
7443                 <td><?php echo _EBLOG_CREATE ?></td>
7444                 <td><input type="submit" value="<?php echo _EBLOG_CREATE_BTN ?>" onclick="return checkSubmit();" /></td>
7445             </tr></table>
7446         </div></form>
7447
7448         <?php       $this->pagefoot();
7449
7450     }
7451
7452     /**
7453      * @todo document this
7454      */
7455     function action_addnewlog2() {
7456         global $member, $manager;
7457
7458         $member->blogAdminRights($blogid) or $this->disallow();
7459
7460         $burl   = requestVar('url');
7461         $blogid = intRequestVar('blogid');
7462
7463         $blog =& $manager->getBlog($blogid);
7464         $blog->setURL(trim($burl));
7465         $blog->writeSettings();
7466
7467         $this->action_overview(_MSG_NEWBLOG);
7468     }
7469
7470     /**
7471      * @todo document this
7472      */
7473     function action_skinieoverview() {
7474         global $member, $DIR_LIBS, $manager;
7475
7476         $member->isAdmin() or $this->disallow();
7477
7478         // load skinie class
7479         include_once($DIR_LIBS . 'skinie.php');
7480
7481         $this->pagehead();
7482
7483         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';
7484
7485     ?>
7486         <h2><?php echo _SKINIE_TITLE_IMPORT ?></h2>
7487
7488                 <p><label for="skinie_import_local"><?php echo _SKINIE_LOCAL ?></label>
7489                 <?php                   global $DIR_SKINS;
7490
7491                     $candidates = SkinImport::searchForCandidates($DIR_SKINS);
7492
7493                     if (sizeof($candidates) > 0) {
7494                         ?>
7495                             <form method="post" action="index.php"><div>
7496                                 <input type="hidden" name="action" value="skinieimport" />
7497                                 <?php $manager->addTicketHidden() ?>
7498                                 <input type="hidden" name="mode" value="file" />
7499                                 <select name="skinfile" id="skinie_import_local">
7500                                 <?php                                   foreach ($candidates as $skinname => $skinfile) {
7501                                         $html = Entity::hsc($skinfile);
7502                                         echo '<option value="',$html,'">',$skinname,'</option>';
7503                                     }
7504                                 ?>
7505                                 </select>
7506                                 <input type="submit" value="<?php echo _SKINIE_BTN_IMPORT ?>" />
7507                             </div></form>
7508                         <?php                   } else {
7509                         echo _SKINIE_NOCANDIDATES;
7510                     }
7511                 ?>
7512                 </p>
7513
7514                 <p><em><?php echo _OR ?></em></p>
7515
7516                 <form method="post" action="index.php"><p>
7517                     <?php $manager->addTicketHidden() ?>
7518                     <input type="hidden" name="action" value="skinieimport" />
7519                     <input type="hidden" name="mode" value="url" />
7520                     <label for="skinie_import_url"><?php echo _SKINIE_FROMURL ?></label>
7521                     <input type="text" name="skinfile" id="skinie_import_url" size="60" value="http://" />
7522                     <input type="submit" value="<?php echo _SKINIE_BTN_IMPORT ?>" />
7523                 </p></form>
7524
7525
7526         <h2><?php echo _SKINIE_TITLE_EXPORT ?></h2>
7527         <form method="post" action="index.php"><div>
7528             <input type="hidden" name="action" value="skinieexport" />
7529             <?php $manager->addTicketHidden() ?>
7530
7531             <p><?php echo _SKINIE_EXPORT_INTRO ?></p>
7532
7533             <table><tr>
7534                 <th colspan="2"><?php echo _SKINIE_EXPORT_SKINS ?></th>
7535             </tr><tr>
7536     <?php       // show list of skins
7537         $res = DB::getResult('SELECT * FROM '.sql_table('skin_desc'));
7538         foreach ( $res as $row) {
7539             $id = 'skinexp' . $row['sdnumber'];
7540             echo '<td><input type="checkbox" name="skin[',$row['sdnumber'],']"  id="',$id,'" />';
7541             echo '<label for="',$id,'">',Entity::hsc($row['sdname']),'</label></td>';
7542             echo '<td>',Entity::hsc($row['sddesc']),'</td>';
7543             echo '</tr><tr>';
7544         }
7545
7546         echo '<th colspan="2">',_SKINIE_EXPORT_TEMPLATES,'</th></tr><tr>';
7547
7548         // show list of templates
7549         $res = DB::getResult('SELECT * FROM '.sql_table('template_desc'));
7550         foreach ( $res as $row ) {
7551             $id = 'templateexp' . $row['tdnumber'];
7552             echo '<td><input type="checkbox" name="template[',$row['tdnumber'],']" id="',$id,'" />';
7553             echo '<label for="',$id,'">',Entity::hsc($row['tdname']),'</label></td>';
7554             echo '<td>',Entity::hsc($row['tddesc']),'</td>';
7555             echo '</tr><tr>';
7556         }
7557
7558     ?>
7559                 <th colspan="2"><?php echo _SKINIE_EXPORT_EXTRA ?></th>
7560             </tr><tr>
7561                 <td colspan="2"><textarea cols="40" rows="5" name="info"></textarea></td>
7562             </tr><tr>
7563                 <th colspan="2"><?php echo _SKINIE_TITLE_EXPORT ?></th>
7564             </tr><tr>
7565                 <td colspan="2"><input type="submit" value="<?php echo _SKINIE_BTN_EXPORT ?>" /></td>
7566             </tr></table>
7567         </div></form>
7568
7569     <?php
7570         $this->pagefoot();
7571
7572     }
7573
7574     /**
7575      * @todo document this
7576      */
7577     function action_skinieimport() {
7578         global $member, $DIR_LIBS, $DIR_SKINS, $manager;
7579
7580         $member->isAdmin() or $this->disallow();
7581
7582         // load skinie class
7583         include_once($DIR_LIBS . 'skinie.php');
7584
7585         $skinFileRaw= postVar('skinfile');
7586         $mode       = postVar('mode');
7587
7588         $importer = new SkinImport();
7589
7590         // get full filename
7591         if ($mode == 'file')
7592         {
7593             $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';
7594
7595             // backwards compatibilty (in v2.0, exports were saved as skindata.xml)
7596             if (!file_exists($skinFile))
7597                 $skinFile = $DIR_SKINS . $skinFileRaw . '/skindata.xml';
7598         } else {
7599             $skinFile = $skinFileRaw;
7600         }
7601
7602         // read only metadata
7603         $error = $importer->readFile($skinFile, 1);
7604
7605         // clashes
7606         $skinNameClashes = $importer->checkSkinNameClashes();
7607         $templateNameClashes = $importer->checkTemplateNameClashes();
7608         $hasNameClashes = (count($skinNameClashes) > 0) || (count($templateNameClashes) > 0);
7609
7610         if ($error) $this->error($error);
7611
7612         $this->pagehead();
7613
7614         echo '<p><a href="index.php?action=skinieoverview">(',_BACK,')</a></p>';
7615         ?>
7616         <h2><?php echo _SKINIE_CONFIRM_TITLE ?></h2>
7617
7618         <ul>
7619             <li><p><strong><?php echo _SKINIE_INFO_GENERAL ?></strong> <?php echo Entity::hsc($importer->getInfo()) ?></p></li>
7620             <li><p><strong><?php echo _SKINIE_INFO_SKINS ?></strong> <?php echo implode(' <em>'._AND.'</em> ',$importer->getSkinNames()) ?></p></li>
7621             <li><p><strong><?php echo _SKINIE_INFO_TEMPLATES ?></strong> <?php echo implode(' <em>'._AND.'</em> ',$importer->getTemplateNames()) ?></p></li>
7622             <?php
7623                 if ($hasNameClashes)
7624                 {
7625             ?>
7626             <li><p><strong style="color: red;"><?php echo _SKINIE_INFO_SKINCLASH ?></strong> <?php echo implode(' <em>'._AND.'</em> ',$skinNameClashes) ?></p></li>
7627             <li><p><strong style="color: red;"><?php echo _SKINIE_INFO_TEMPLCLASH ?></strong> <?php echo implode(' <em>'._AND.'</em> ',$templateNameClashes) ?></p></li>
7628             <?php
7629                 } // if (hasNameClashes)
7630             ?>
7631         </ul>
7632
7633         <form method="post" action="index.php"><div>
7634             <input type="hidden" name="action" value="skiniedoimport" />
7635             <?php $manager->addTicketHidden() ?>
7636             <input type="hidden" name="skinfile" value="<?php echo Entity::hsc(postVar('skinfile')) ?>" />
7637             <input type="hidden" name="mode" value="<?php echo Entity::hsc($mode) ?>" />
7638             <input type="submit" value="<?php echo _SKINIE_CONFIRM_IMPORT ?>" />
7639             <?php
7640                 if ($hasNameClashes)
7641                 {
7642             ?>
7643             <br />
7644             <input type="checkbox" name="overwrite" value="1" id="cb_overwrite" /><label for="cb_overwrite"><?php echo _SKINIE_CONFIRM_OVERWRITE ?></label>
7645             <?php
7646                 } // if (hasNameClashes)
7647             ?>
7648         </div></form>
7649
7650
7651         <?php
7652         $this->pagefoot();
7653     }
7654
7655     /**
7656      * @todo document this
7657      */
7658     function action_skiniedoimport() {
7659         global $member, $DIR_LIBS, $DIR_SKINS;
7660
7661         $member->isAdmin() or $this->disallow();
7662
7663         // load skinie class
7664         include_once($DIR_LIBS . 'skinie.php');
7665
7666         $skinFileRaw= postVar('skinfile');
7667         $mode       = postVar('mode');
7668
7669         $allowOverwrite = intPostVar('overwrite');
7670
7671         // get full filename
7672         if ($mode == 'file')
7673         {
7674             $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';
7675
7676             // backwards compatibilty (in v2.0, exports were saved as skindata.xml)
7677             if (!file_exists($skinFile))
7678                 $skinFile = $DIR_SKINS . $skinFileRaw . '/skindata.xml';
7679
7680         } else {
7681             $skinFile = $skinFileRaw;
7682         }
7683
7684         $importer = new SkinImport();
7685
7686         $error = $importer->readFile($skinFile);
7687
7688         if ($error)
7689             $this->error($error);
7690
7691         $error = $importer->writeToDatabase($allowOverwrite);
7692
7693         if ($error)
7694             $this->error($error);
7695
7696         $this->pagehead();
7697
7698         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';
7699     ?>
7700         <h2><?php echo _SKINIE_DONE ?></h2>
7701
7702         <ul>
7703             <li><p><strong><?php echo _SKINIE_INFO_GENERAL ?></strong> <?php echo Entity::hsc($importer->getInfo()) ?></p></li>
7704             <li><p><strong><?php echo _SKINIE_INFO_IMPORTEDSKINS ?></strong> <?php echo implode(' <em>'._AND.'</em> ',$importer->getSkinNames()) ?></p></li>
7705             <li><p><strong><?php echo _SKINIE_INFO_IMPORTEDTEMPLS ?></strong> <?php echo implode(' <em>'._AND.'</em> ',$importer->getTemplateNames()) ?></p></li>
7706         </ul>
7707
7708     <?php       $this->pagefoot();
7709
7710     }
7711
7712     /**
7713      * @todo document this
7714      */
7715     function action_skinieexport() {
7716         global $member, $DIR_LIBS;
7717
7718         $member->isAdmin() or $this->disallow();
7719
7720         // load skinie class
7721         include_once($DIR_LIBS . 'skinie.php');
7722
7723         $aSkins = requestIntArray('skin');
7724         $aTemplates = requestIntArray('template');
7725
7726         if (!is_array($aTemplates)) $aTemplates = array();
7727         if (!is_array($aSkins)) $aSkins = array();
7728
7729         $skinList = array_keys($aSkins);
7730         $templateList = array_keys($aTemplates);
7731
7732         $info = postVar('info');
7733
7734         $exporter = new SkinExport();
7735         foreach ($skinList as $skinId) {
7736             $exporter->addSkin($skinId);
7737         }
7738         foreach ($templateList as $templateId) {
7739             $exporter->addTemplate($templateId);
7740         }
7741         $exporter->setInfo($info);
7742
7743         $exporter->export();
7744     }
7745
7746     /**
7747      * @todo document this
7748      */
7749     function action_templateoverview() {
7750         global $member, $manager;
7751
7752         $member->isAdmin() or $this->disallow();
7753
7754         $this->pagehead();
7755
7756         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';
7757
7758         echo '<h2>' . _TEMPLATE_TITLE . '</h2>';
7759         echo '<h3>' . _TEMPLATE_AVAILABLE_TITLE . '</h3>';
7760
7761         $query = 'SELECT * FROM '.sql_table('template_desc').' ORDER BY tdname';
7762         $template['content'] = 'templatelist';
7763         $template['tabindex'] = 10;
7764         showlist($query,'table',$template);
7765
7766         echo '<h3>' . _TEMPLATE_NEW_TITLE . '</h3>';
7767
7768         ?>
7769         <form method="post" action="index.php"><div>
7770
7771         <input name="action" value="templatenew" type="hidden" />
7772         <?php $manager->addTicketHidden() ?>
7773         <table><tr>
7774             <td><?php echo _TEMPLATE_NAME ?> <?php help('shortnames'); ?></td>
7775             <td><input name="name" tabindex="10010" maxlength="20" size="20" /></td>
7776         </tr><tr>
7777             <td><?php echo _TEMPLATE_DESC ?></td>
7778             <td><input name="desc" tabindex="10020" maxlength="200" size="50" /></td>
7779         </tr><tr>
7780             <td><?php echo _TEMPLATE_CREATE ?></td>
7781             <td><input type="submit" tabindex="10030" value="<?php echo _TEMPLATE_CREATE_BTN ?>" onclick="return checkSubmit();" /></td>
7782         </tr></table>
7783
7784         </div></form>
7785
7786         <?php
7787         $this->pagefoot();
7788     }
7789
7790     /**
7791      * @todo document this
7792      */
7793     function action_templateedit($msg = '') {
7794         global $member, $manager;
7795
7796         $templateid = intRequestVar('templateid');
7797
7798         $member->isAdmin() or $this->disallow();
7799
7800         $extrahead = '<script type="text/javascript" src="javascript/templateEdit.js"></script>';
7801         $extrahead .= '<script type="text/javascript">setTemplateEditText('.DB::quoteValue(_EDITTEMPLATE_EMPTY).');</script>';
7802
7803         $this->pagehead($extrahead);
7804
7805         $templatename = Template::getNameFromId($templateid);
7806         $templatedescription = Template::getDesc($templateid);
7807         $template =& $manager->getTemplate($templatename);
7808
7809         ?>
7810         <p>
7811         <a href="index.php?action=templateoverview">(<?php echo _TEMPLATE_BACK ?>)</a>
7812         </p>
7813
7814         <h2><?php echo _TEMPLATE_EDIT_TITLE ?> '<?php echo  Entity::hsc($templatename); ?>'</h2>
7815
7816         <?php                   if ($msg) echo "<p>"._MESSAGE.": $msg</p>";
7817         ?>
7818
7819         <p><?php echo _TEMPLATE_EDIT_MSG ?></p>
7820
7821         <form method="post" action="index.php">
7822         <div>
7823
7824         <input type="hidden" name="action" value="templateupdate" />
7825         <?php $manager->addTicketHidden() ?>
7826         <input type="hidden" name="templateid" value="<?php echo  $templateid; ?>" />
7827
7828         <table><tr>
7829             <th colspan="2"><?php echo _TEMPLATE_SETTINGS ?></th>
7830         </tr><tr>
7831             <td><?php echo _TEMPLATE_NAME ?> <?php help('shortnames'); ?></td>
7832             <td><input name="tname" tabindex="4" size="20" maxlength="20" value="<?php echo  Entity::hsc($templatename) ?>" /></td>
7833         </tr><tr>
7834             <td><?php echo _TEMPLATE_DESC ?></td>
7835             <td><input name="tdesc" tabindex="5" size="50" maxlength="200" value="<?php echo  Entity::hsc($templatedescription) ?>" /></td>
7836         </tr><tr>
7837             <th colspan="2"><?php echo _TEMPLATE_UPDATE ?></th>
7838         </tr><tr>
7839             <td><?php echo _TEMPLATE_UPDATE ?></td>
7840             <td>
7841                 <input type="submit" tabindex="6" value="<?php echo _TEMPLATE_UPDATE_BTN ?>" onclick="return checkSubmit();" />
7842                 <input type="reset" tabindex="7" value="<?php echo _TEMPLATE_RESET_BTN ?>" />
7843             </td>
7844         </tr><tr>
7845             <th colspan="2"><?php echo _TEMPLATE_ITEMS ?> <?php help('templateitems'); ?></th>
7846 <?php   $this->_templateEditRow($template, _TEMPLATE_ITEMHEADER, 'ITEM_HEADER', '', 8);
7847     $this->_templateEditRow($template, _TEMPLATE_ITEMBODY, 'ITEM', '', 9, 1);
7848     $this->_templateEditRow($template, _TEMPLATE_ITEMFOOTER, 'ITEM_FOOTER', '', 10);
7849     $this->_templateEditRow($template, _TEMPLATE_MORELINK, 'MORELINK', 'morelink', 20);
7850     $this->_templateEditRow($template, _TEMPLATE_EDITLINK, 'EDITLINK', 'editlink', 25);
7851     $this->_templateEditRow($template, _TEMPLATE_NEW, 'NEW', 'new', 30);
7852 ?>
7853         </tr><tr>
7854             <th colspan="2"><?php echo _TEMPLATE_COMMENTS_ANY ?> <?php help('templatecomments'); ?></th>
7855 <?php   $this->_templateEditRow($template, _TEMPLATE_CHEADER, 'COMMENTS_HEADER', 'commentheaders', 40);
7856     $this->_templateEditRow($template, _TEMPLATE_CBODY, 'COMMENTS_BODY', 'commentbody', 50, 1);
7857     $this->_templateEditRow($template, _TEMPLATE_CFOOTER, 'COMMENTS_FOOTER', 'commentheaders', 60);
7858     $this->_templateEditRow($template, _TEMPLATE_CONE, 'COMMENTS_ONE', 'commentwords', 70);
7859     $this->_templateEditRow($template, _TEMPLATE_CMANY, 'COMMENTS_MANY', 'commentwords', 80);
7860     $this->_templateEditRow($template, _TEMPLATE_CMORE, 'COMMENTS_CONTINUED', 'commentcontinued', 90);
7861     $this->_templateEditRow($template, _TEMPLATE_CMEXTRA, 'COMMENTS_AUTH', 'memberextra', 100);
7862 ?>
7863         </tr><tr>
7864             <th colspan="2"><?php echo _TEMPLATE_COMMENTS_NONE ?> <?php help('templatecomments'); ?></th>
7865 <?php
7866     $this->_templateEditRow($template, _TEMPLATE_CNONE, 'COMMENTS_NONE', '', 110);
7867 ?>
7868         </tr><tr>
7869             <th colspan="2"><?php echo _TEMPLATE_COMMENTS_TOOMUCH ?> <?php help('templatecomments'); ?></th>
7870 <?php   $this->_templateEditRow($template, _TEMPLATE_CTOOMUCH, 'COMMENTS_TOOMUCH', '', 120);
7871 ?>
7872         </tr><tr>
7873             <th colspan="2"><?php echo _TEMPLATE_ARCHIVELIST ?> <?php help('templatearchivelists'); ?></th>
7874 <?php   $this->_templateEditRow($template, _TEMPLATE_AHEADER, 'ARCHIVELIST_HEADER', '', 130);
7875     $this->_templateEditRow($template, _TEMPLATE_AITEM, 'ARCHIVELIST_LISTITEM', '', 140);
7876     $this->_templateEditRow($template, _TEMPLATE_AFOOTER, 'ARCHIVELIST_FOOTER', '', 150);
7877 ?>
7878         </tr><tr>
7879             <th colspan="2"><?php echo _TEMPLATE_BLOGLIST ?> <?php help('templatebloglists'); ?></th>
7880 <?php   $this->_templateEditRow($template, _TEMPLATE_BLOGHEADER, 'BLOGLIST_HEADER', '', 160);
7881     $this->_templateEditRow($template, _TEMPLATE_BLOGITEM, 'BLOGLIST_LISTITEM', '', 170);
7882     $this->_templateEditRow($template, _TEMPLATE_BLOGFOOTER, 'BLOGLIST_FOOTER', '', 180);
7883 ?>
7884         </tr><tr>
7885             <th colspan="2"><?php echo _TEMPLATE_CATEGORYLIST ?> <?php help('templatecategorylists'); ?></th>
7886 <?php   $this->_templateEditRow($template, _TEMPLATE_CATHEADER, 'CATLIST_HEADER', '', 190);
7887     $this->_templateEditRow($template, _TEMPLATE_CATITEM, 'CATLIST_LISTITEM', '', 200);
7888     $this->_templateEditRow($template, _TEMPLATE_CATFOOTER, 'CATLIST_FOOTER', '', 210);
7889 ?>
7890         </tr><tr>
7891             <th colspan="2"><?php echo _TEMPLATE_DATETIME ?></th>
7892 <?php   $this->_templateEditRow($template, _TEMPLATE_DHEADER, 'DATE_HEADER', 'dateheads', 220);
7893     $this->_templateEditRow($template, _TEMPLATE_DFOOTER, 'DATE_FOOTER', 'dateheads', 230);
7894     $this->_templateEditRow($template, _TEMPLATE_DFORMAT, 'FORMAT_DATE', 'datetime', 240);
7895     $this->_templateEditRow($template, _TEMPLATE_TFORMAT, 'FORMAT_TIME', 'datetime', 250);
7896     $this->_templateEditRow($template, _TEMPLATE_LOCALE, 'LOCALE', 'locale', 260);
7897 ?>
7898         </tr><tr>
7899             <th colspan="2"><?php echo _TEMPLATE_IMAGE ?> <?php help('templatepopups'); ?></th>
7900 <?php   $this->_templateEditRow($template, _TEMPLATE_PCODE, 'POPUP_CODE', '', 270);
7901     $this->_templateEditRow($template, _TEMPLATE_ICODE, 'IMAGE_CODE', '', 280);
7902     $this->_templateEditRow($template, _TEMPLATE_MCODE, 'MEDIA_CODE', '', 290);
7903 ?>
7904         </tr><tr>
7905             <th colspan="2"><?php echo _TEMPLATE_SEARCH ?></th>
7906 <?php   $this->_templateEditRow($template, _TEMPLATE_SHIGHLIGHT, 'SEARCH_HIGHLIGHT', 'highlight',300);
7907     $this->_templateEditRow($template, _TEMPLATE_SNOTFOUND, 'SEARCH_NOTHINGFOUND', 'nothingfound',310);
7908 ?>
7909         </tr><tr>
7910             <th colspan="2"><?php echo _TEMPLATE_PLUGIN_FIELDS ?></th>
7911 <?php
7912         $tab = 600;
7913         $pluginfields = array();
7914         $manager->notify('TemplateExtraFields',array('fields'=>&$pluginfields));
7915
7916         foreach ($pluginfields as $pfkey=>$pfvalue) {
7917             echo "</tr><tr>\n";
7918             echo '<th colspan="2">' . Entity::hen($pfkey) . "</th>\n";
7919             foreach ($pfvalue as $pffield=>$pfdesc) {
7920                 $this->_templateEditRow($template, $pfdesc, $pffield, '',++$tab,0);
7921             }
7922         }
7923 ?>
7924         </tr><tr>
7925             <th colspan="2"><?php echo _TEMPLATE_UPDATE ?></th>
7926         </tr><tr>
7927             <td><?php echo _TEMPLATE_UPDATE ?></td>
7928             <td>
7929                 <input type="submit" tabindex="800" value="<?php echo _TEMPLATE_UPDATE_BTN ?>" onclick="return checkSubmit();" />
7930                 <input type="reset" tabindex="810" value="<?php echo _TEMPLATE_RESET_BTN ?>" />
7931             </td>
7932         </tr></table>
7933
7934         </div>
7935         </form>
7936         <?php
7937         $this->pagefoot();
7938     }
7939
7940     /**
7941      * @todo document this
7942      */
7943     function _templateEditRow(&$template, $description, $name, $help = '', $tabindex = 0, $big = 0) {
7944         static $count = 1;
7945         if (!isset($template[$name])) $template[$name] = '';
7946     ?>
7947         </tr><tr>
7948             <td><?php echo $description ?> <?php if ($help) help('template'.$help); ?></td>
7949             <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>
7950     <?php       $count++;
7951     }
7952
7953     /**
7954      * @todo document this
7955      */
7956     function action_templateupdate() {
7957         global $member,$manager;
7958
7959         $templateid = intRequestVar('templateid');
7960
7961         $member->isAdmin() or $this->disallow();
7962
7963         $name = postVar('tname');
7964         $desc = postVar('tdesc');
7965
7966         if (!isValidTemplateName($name))
7967             $this->error(_ERROR_BADTEMPLATENAME);
7968
7969         if ((Template::getNameFromId($templateid) != $name) && Template::exists($name))
7970             $this->error(_ERROR_DUPTEMPLATENAME);
7971
7972
7973         $name = DB::quoteValue($name);
7974         $desc = DB::quoteValue($desc);
7975
7976         // 1. Remove all template parts
7977         $query = 'DELETE FROM '.sql_table('template').' WHERE tdesc=' . $templateid;
7978         DB::execute($query);
7979
7980         // 2. Update description
7981         $query =  'UPDATE '.sql_table('template_desc').' SET'
7982                . ' tdname=' . $name . ','
7983                . ' tddesc=' . $desc
7984                . ' WHERE tdnumber=' . $templateid;
7985         DB::execute($query);
7986
7987         // 3. Add non-empty template parts
7988         $this->addToTemplate($templateid, 'ITEM_HEADER', postVar('ITEM_HEADER'));
7989         $this->addToTemplate($templateid, 'ITEM', postVar('ITEM'));
7990         $this->addToTemplate($templateid, 'ITEM_FOOTER', postVar('ITEM_FOOTER'));
7991         $this->addToTemplate($templateid, 'MORELINK', postVar('MORELINK'));
7992         $this->addToTemplate($templateid, 'EDITLINK', postVar('EDITLINK'));
7993         $this->addToTemplate($templateid, 'NEW', postVar('NEW'));
7994         $this->addToTemplate($templateid, 'COMMENTS_HEADER', postVar('COMMENTS_HEADER'));
7995         $this->addToTemplate($templateid, 'COMMENTS_BODY', postVar('COMMENTS_BODY'));
7996         $this->addToTemplate($templateid, 'COMMENTS_FOOTER', postVar('COMMENTS_FOOTER'));
7997         $this->addToTemplate($templateid, 'COMMENTS_CONTINUED', postVar('COMMENTS_CONTINUED'));
7998         $this->addToTemplate($templateid, 'COMMENTS_TOOMUCH', postVar('COMMENTS_TOOMUCH'));
7999         $this->addToTemplate($templateid, 'COMMENTS_AUTH', postVar('COMMENTS_AUTH'));
8000         $this->addToTemplate($templateid, 'COMMENTS_ONE', postVar('COMMENTS_ONE'));
8001         $this->addToTemplate($templateid, 'COMMENTS_MANY', postVar('COMMENTS_MANY'));
8002         $this->addToTemplate($templateid, 'COMMENTS_NONE', postVar('COMMENTS_NONE'));
8003         $this->addToTemplate($templateid, 'ARCHIVELIST_HEADER', postVar('ARCHIVELIST_HEADER'));
8004         $this->addToTemplate($templateid, 'ARCHIVELIST_LISTITEM', postVar('ARCHIVELIST_LISTITEM'));
8005         $this->addToTemplate($templateid, 'ARCHIVELIST_FOOTER', postVar('ARCHIVELIST_FOOTER'));
8006         $this->addToTemplate($templateid, 'BLOGLIST_HEADER', postVar('BLOGLIST_HEADER'));
8007         $this->addToTemplate($templateid, 'BLOGLIST_LISTITEM', postVar('BLOGLIST_LISTITEM'));
8008         $this->addToTemplate($templateid, 'BLOGLIST_FOOTER', postVar('BLOGLIST_FOOTER'));
8009         $this->addToTemplate($templateid, 'CATLIST_HEADER', postVar('CATLIST_HEADER'));
8010         $this->addToTemplate($templateid, 'CATLIST_LISTITEM', postVar('CATLIST_LISTITEM'));
8011         $this->addToTemplate($templateid, 'CATLIST_FOOTER', postVar('CATLIST_FOOTER'));
8012         $this->addToTemplate($templateid, 'DATE_HEADER', postVar('DATE_HEADER'));
8013         $this->addToTemplate($templateid, 'DATE_FOOTER', postVar('DATE_FOOTER'));
8014         $this->addToTemplate($templateid, 'FORMAT_DATE', postVar('FORMAT_DATE'));
8015         $this->addToTemplate($templateid, 'FORMAT_TIME', postVar('FORMAT_TIME'));
8016         $this->addToTemplate($templateid, 'LOCALE', postVar('LOCALE'));
8017         $this->addToTemplate($templateid, 'SEARCH_HIGHLIGHT', postVar('SEARCH_HIGHLIGHT'));
8018         $this->addToTemplate($templateid, 'SEARCH_NOTHINGFOUND', postVar('SEARCH_NOTHINGFOUND'));
8019         $this->addToTemplate($templateid, 'POPUP_CODE', postVar('POPUP_CODE'));
8020         $this->addToTemplate($templateid, 'MEDIA_CODE', postVar('MEDIA_CODE'));
8021         $this->addToTemplate($templateid, 'IMAGE_CODE', postVar('IMAGE_CODE'));
8022
8023         $pluginfields = array();
8024         $manager->notify('TemplateExtraFields',array('fields'=>&$pluginfields));
8025         foreach ($pluginfields as $pfkey=>$pfvalue) {
8026             foreach ($pfvalue as $pffield=>$pfdesc) {
8027                 $this->addToTemplate($templateid, $pffield, postVar($pffield));
8028             }
8029         }
8030
8031         // jump back to template edit
8032         $this->action_templateedit(_TEMPLATE_UPDATED);
8033
8034     }
8035
8036 =======
8037                         self::error($error);
8038                         return;
8039                 }
8040                 
8041                 if ( !is_object(self::$skin) )
8042                 {
8043                         self::action_adminskiniedoimport();
8044                 }
8045                 else
8046                 {
8047                         self::$skin->parse('adminskinieimport');
8048                 }
8049                 return;
8050         }
8051         
8052 >>>>>>> skinnable-master
8053         /**
8054          * Admin::action_adminskiniedoimport()
8055          * 
8056          * @param       void
8057          * @return      void
8058          */
8059         static private function action_adminskiniedoimport()
8060         {
8061                 global $DIR_SKINS, $member, $CONF;
8062                 
8063                 $member->isAdmin() or self::disallow();
8064                 
8065                 $mode = postVar('mode');
8066                 $skinFileRaw = postVar('skinfile');
8067                 $allowOverwrite = intPostVar('overwrite');
8068                 
8069                 $error = self::skiniedoimport($mode, $skinFileRaw, $allowOverwrite);
8070                 if ( $error )
8071                 {
8072                         self::error($error);
8073                         return;
8074                 }
8075                 
8076 <<<<<<< HEAD
8077                 $partname = DB::quoteValue($partname);
8078                 $content = DB::quoteValue($content);
8079                 
8080                 $query = "INSERT INTO %s (tdesc, tpartname, tcontent) VALUES (%d, %s, %s)";
8081                 $query = sprintf($query, sql_table('template'), (integer) $id, $partname, $content);
8082                 if ( DB::execute($query) === FALSE )
8083                 {
8084                         $err = DB::getError();
8085                         exit(_ADMIN_SQLDIE_QUERYERROR . $err[2]);
8086                 }
8087                 return DB::getInsertId();
8088         }
8089         
8090     /**
8091      * @todo document this
8092      */
8093     function action_templatedelete() {
8094         global $member, $manager;
8095
8096         $member->isAdmin() or $this->disallow();
8097
8098         $templateid = intRequestVar('templateid');
8099         // TODO: check if template can be deleted
8100
8101         $this->pagehead();
8102
8103         $name = Template::getNameFromId($templateid);
8104         $desc = Template::getDesc($templateid);
8105
8106         ?>
8107             <h2><?php echo _DELETE_CONFIRM ?></h2>
8108
8109             <p>
8110             <?php echo _CONFIRMTXT_TEMPLATE ?><b><?php echo Entity::hsc($name) ?></b> (<?php echo  Entity::hsc($desc) ?>)
8111             </p>
8112
8113             <form method="post" action="index.php"><div>
8114                 <input type="hidden" name="action" value="templatedeleteconfirm" />
8115                 <?php $manager->addTicketHidden() ?>
8116                 <input type="hidden" name="templateid" value="<?php echo  $templateid ?>" />
8117                 <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN ?>" />
8118             </div></form>
8119         <?php
8120         $this->pagefoot();
8121     }
8122
8123     /**
8124      * @todo document this
8125      */
8126     function action_templatedeleteconfirm() {
8127         global $member, $manager;
8128
8129         $templateid = intRequestVar('templateid');
8130
8131         $member->isAdmin() or $this->disallow();
8132
8133         $manager->notify('PreDeleteTemplate', array('templateid' => $templateid));
8134
8135         // 1. delete description
8136         DB::execute('DELETE FROM '.sql_table('template_desc').' WHERE tdnumber=' . $templateid);
8137
8138         // 2. delete parts
8139         DB::execute('DELETE FROM '.sql_table('template').' WHERE tdesc=' . $templateid);
8140
8141         $manager->notify('PostDeleteTemplate', array('templateid' => $templateid));
8142
8143         $this->action_templateoverview();
8144     }
8145
8146     /**
8147      * @todo document this
8148      */
8149     function action_templatenew() {
8150         global $member;
8151
8152         $member->isAdmin() or $this->disallow();
8153
8154         $name = postVar('name');
8155         $desc = postVar('desc');
8156
8157         if (!isValidTemplateName($name))
8158             $this->error(_ERROR_BADTEMPLATENAME);
8159
8160         if (Template::exists($name))
8161             $this->error(_ERROR_DUPTEMPLATENAME);
8162
8163         $newTemplateId = Template::createNew($name, $desc);
8164
8165         $this->action_templateoverview();
8166     }
8167
8168     /**
8169      * @todo document this
8170      */
8171     function action_templateclone() {
8172         global $member;
8173
8174         $templateid = intRequestVar('templateid');
8175
8176         $member->isAdmin() or $this->disallow();
8177
8178         // 1. read old template
8179         $name = Template::getNameFromId($templateid);
8180         $desc = Template::getDesc($templateid);
8181
8182         // 2. create desc thing
8183         $name = "cloned" . $name;
8184
8185         // if a template with that name already exists:
8186         if (Template::exists($name)) {
8187             $i = 1;
8188             while (Template::exists($name . $i))
8189                 $i++;
8190             $name .= $i;
8191         }
8192
8193         $newid = Template::createNew($name, $desc);
8194
8195         // 3. create clone
8196         // go through parts of old template and add them to the new one
8197         $res = DB::getResult('SELECT tpartname, tcontent FROM '.sql_table('template').' WHERE tdesc=' . $templateid);
8198         foreach ( $res as $row ) {
8199             $this->addToTemplate($newid, $row['tpartname'], $row['tcontent']);
8200         }
8201
8202         $this->action_templateoverview();
8203     }
8204         
8205         /**
8206          * Admin::action_skinoverview()
8207          * 
8208          * @param       void
8209          * @return      void
8210          */
8211         public function action_skinoverview()
8212         {
8213                 global $member, $manager;
8214                 
8215                 $member->isAdmin() or $this->disallow();
8216                 
8217                 $this->pagehead();
8218                 
8219                 echo '<p><a href="index.php?action=manage">(' . _BACKTOMANAGE . ")</a></p>\n";
8220                 echo '<h2>' . _SKIN_EDIT_TITLE . "</h2>\n";
8221                 echo '<h3>' . _SKIN_AVAILABLE_TITLE . "</h3>\n";
8222                 
8223                 $query = 'SELECT * FROM '.sql_table('skin_desc').' ORDER BY sdname;';
8224                 $template['content'] = 'skinlist';
8225                 $template['tabindex'] = 10;
8226                 
8227                 showlist($query,'table',$template);
8228                 
8229                 echo '<h3>' . _SKIN_NEW_TITLE . "</h3>\n";
8230                 echo "<form method=\"post\" action=\"index.php\">\n";
8231                 echo "<div>\n";
8232                 echo "<input name=\"action\" value=\"skinnew\" type=\"hidden\" />\n";
8233                 
8234                 $manager->addTicketHidden() . "\n";
8235                 
8236                 echo "<table frame=\"box\" rules=\"all\" summary=\"skinoverview\">\n";
8237                 echo "<tr>\n";
8238                 echo "<td>" . _SKIN_NAME;
8239                 echo help('shortnames');
8240                 echo "</td>\n";
8241                 echo "<td><input name=\"name\" tabindex=\"10010\" maxlength=\"20\" size=\"20\" /></td>\n";
8242                 echo "</tr>\n";
8243                 echo "<tr>\n";
8244                 echo "<td>" . _SKIN_DESC . "</td>\n";
8245                 echo "<td><input name=\"desc\" tabindex=\"10020\" maxlength=\"200\" size=\"50\" /></td>\n";
8246                 echo "</tr>\n";
8247                 echo "<tr>\n";
8248                 echo '<td>' . _SKIN_CREATE . "</td>\n";
8249                 echo '<td><input type="submit" tabindex="10030" value="' . _SKIN_CREATE_BTN . '" onclick="return checkSubmit();" />' . "</td>\n";
8250                 echo "</tr>\n";
8251                 echo "</table>\n";
8252                 
8253                 echo "</div>\n";
8254                 echo "</form>\n";
8255                 
8256                 $this->pagefoot();
8257                 return;
8258         }
8259         
8260     /**
8261      * @todo document this
8262      */
8263     function action_skinnew() {
8264         global $member;
8265
8266         $member->isAdmin() or $this->disallow();
8267
8268         $name = trim(postVar('name'));
8269         $desc = trim(postVar('desc'));
8270
8271         if (!isValidSkinName($name))
8272             $this->error(_ERROR_BADSKINNAME);
8273
8274         if (Skin::exists($name))
8275             $this->error(_ERROR_DUPSKINNAME);
8276
8277         $newId = Skin::createNew($name, $desc);
8278
8279         $this->action_skinoverview();
8280     }
8281
8282         /**
8283          * Admin::action_skinedit()
8284          * @param       void
8285          * @return      void
8286          */
8287         public function action_skinedit()
8288         {
8289                 global $member, $manager;
8290                 
8291                 $skinid = intRequestVar('skinid');
8292                 
8293                 $member->isAdmin() or $this->disallow();
8294                 
8295                 $skin = new SKIN($skinid);
8296                 $default_skin_types = $skin->getDefaultTypes();
8297                 $available_skin_types = $skin->getAvailableTypes();
8298                 
8299                 $this->pagehead();
8300                 
8301                 echo "<p>";
8302                 echo '( <a href="index.php?action=skinoverview">' . _SKIN_BACK . "</a> )";
8303                 echo "</p>\n";
8304                 echo '<h2>' . _SKIN_EDITONE_TITLE . $skin->getName() . "</h2>\n";
8305                 
8306                 echo '<h3>' . _SKIN_PARTS_TITLE . "</h3>\n";
8307                 echo _SKIN_PARTS_MSG . "\n";
8308                 echo "<ul>\n";
8309                 
8310                 $tabindex = 10;
8311                 foreach ( $default_skin_types as $type => $friendly_name )
8312                 {
8313                         echo "<li>\n";
8314                         echo "<a tabindex=\"{$tabindex}\" href=\"index.php?action=skinedittype&amp;skinid={$skinid}&amp;type={$type}\">";
8315                         echo $friendly_name;
8316                         echo "</a>\n";
8317                         help("skinpart{$type}");
8318                         echo "</li>\n";
8319                         $tabindex++;
8320                 }
8321                 echo "</ul>\n";
8322                 
8323                 echo '<h3>' . _SKIN_PARTS_SPECIAL . '</h3>';
8324                 echo "<form method=\"get\" action=\"index.php\">\n";
8325                 echo "<input type=\"hidden\" name=\"action\" value=\"skinedittype\" />\n";
8326                 echo "<input type=\"hidden\" name=\"skinid\" value=\"{$skinid}\" />\n";
8327                 echo "<input type=\"text\" name=\"type\" tabindex=\"89\" size=\"20\" maxlength=\"20\" />\n";
8328                 echo '<input type="submit" tabindex="140" value="' . _SKIN_CREATE . "\" onclick=\"return checkSubmit();\" />\n";
8329                 echo "</form>\n";
8330                 
8331                 /* NOTE: special skin parts has FALSE in its value */
8332                 if ( in_array(FALSE, array_values($available_skin_types)) )
8333                 {
8334                         $tabstart = 75;
8335                         
8336                         echo '<ul>';
8337                         foreach ( $available_skin_types as $type => $friendly_name )
8338                         {
8339                                 if ( !$friendly_name )
8340                                 {
8341                                         $tabstart++;
8342                                         echo "<li>\n";
8343                                         echo "<a tabindex=\"{$tabstart}\" href=\"index.php?action=skinedittype&amp;skinid={$skinid}&amp;type=" . Entity::hsc(strtolower($type)) . '">';
8344                                         echo Entity::hsc(ucfirst($type));
8345                                         echo "</a>\n";
8346                                         $tabstart++;
8347                                         echo "(<a tabindex=\"{$tabstart}\" href=\"index.php?action=skinremovetype&amp;skinid={$skinid}&amp;type=" . Entity::hsc(strtolower($type)) . '">';
8348                                         echo _LISTS_DELETE;
8349                                         echo "</a>)\n";
8350                                         echo "</li>\n";
8351                                 }
8352                         }
8353                         echo '</ul>';
8354                 }
8355                 
8356                 echo '<h3>' . _SKIN_GENSETTINGS_TITLE . "</h3>\n";
8357                 echo "<form method=\"post\" action=\"index.php\">\n";
8358                 echo "<div>\n";
8359                 echo "<input type=\"hidden\" name=\"action\" value=\"skineditgeneral\" />\n";
8360                 $manager->addTicketHidden() . "\n";
8361                 echo "<input type=\"hidden\" name=\"skinid\" value=\"{$skinid}\" />\n";
8362                 
8363                 echo '<table frame="box" rules="all" summary="' . _SKIN_GENSETTINGS_TITLE . '">' . "\n";
8364                 echo "<tr>\n";
8365                 echo '<td>';
8366                 echo _SKIN_NAME;
8367                 help('shortnames');
8368                 echo "</td>\n";
8369                 echo '<td><input type="text" name="name" tabindex="90" value="' . Entity::hsc($skin->getName()) . '" maxlength="20" size="20" />' . "</td>\n";
8370                 echo "</tr>\n";
8371                 echo "<tr>\n";
8372                 echo '<td>' . _SKIN_DESC . "</td>\n";
8373                 echo '<td><input type="text" name="desc" tabindex="100" value="' . Entity::hsc($skin->getDescription()) . '" maxlength="200" size="50" />' . "</td>\n";
8374                 echo "</tr>\n";
8375                 echo "<tr>\n";
8376                 echo '<td>' . _SKIN_TYPE . "</td>\n";
8377                 echo '<td><input type="text" name="type" tabindex="110" value="' . Entity::hsc($skin->getContentType()) . '" maxlength="40" size="20" />' . "</td>\n";
8378                 echo "</tr>\n";
8379                 echo "<tr>\n";
8380                 echo '<td>';
8381                 echo _SKIN_INCLUDE_MODE;
8382                 help('includemode');
8383                 echo "</td>\n";
8384                 echo '<td>';
8385                 $this->input_yesno('inc_mode', $skin->getIncludeMode(), 120, 'skindir', 'normal', _PARSER_INCMODE_SKINDIR, _PARSER_INCMODE_NORMAL);
8386                 echo "</td>\n";
8387                 echo "</tr>\n";
8388                 echo "<tr>\n";
8389                 echo '<td>';
8390                 echo _SKIN_INCLUDE_PREFIX;
8391                 help('includeprefix');
8392                 echo "</td>\n";
8393                 echo '<td><input type="text" name="inc_prefix" tabindex="130" value="' . Entity::hsc($skin->getIncludePrefix()) . '" maxlength="40" size="20" />' . "</td>\n";
8394                 echo "</tr>\n";
8395                 echo "<tr>\n";
8396                 echo '<td>' . _SKIN_CHANGE . "</td>\n";
8397                 echo '<td><input type="submit" tabindex="140" value="' . _SKIN_CHANGE_BTN . '" onclick="return checkSubmit();" />' . "</td>\n";
8398                 echo "</tr>\n";
8399                 echo "</table>\n";
8400                 
8401                 echo "</div>\n";
8402                 echo "</form>\n";
8403                 $this->pagefoot();
8404                 return;
8405         }
8406
8407     /**
8408      * @todo document this
8409      */
8410     function action_skineditgeneral() {
8411         global $member;
8412
8413         $skinid = intRequestVar('skinid');
8414
8415         $member->isAdmin() or $this->disallow();
8416
8417         $name = postVar('name');
8418         $desc = postVar('desc');
8419         $type = postVar('type');
8420         $inc_mode = postVar('inc_mode');
8421         $inc_prefix = postVar('inc_prefix');
8422
8423         $skin = new SKIN($skinid);
8424
8425         // 1. Some checks
8426         if (!isValidSkinName($name))
8427             $this->error(_ERROR_BADSKINNAME);
8428
8429         if (($skin->getName() != $name) && Skin::exists($name))
8430             $this->error(_ERROR_DUPSKINNAME);
8431
8432         if (!$type) $type = 'text/html';
8433         if (!$inc_mode) $inc_mode = 'normal';
8434
8435         // 2. Update description
8436         $skin->updateGeneralInfo($name, $desc, $type, $inc_mode, $inc_prefix);
8437
8438         $this->action_skinedit();
8439
8440     }
8441
8442         /**
8443          * Admin::action_skinedittype()
8444          * 
8445          * @param       string  $msg    message for pageheader
8446          * @return      void
8447          */
8448         public function action_skinedittype($msg = '')
8449         {
8450                 global $member, $manager;
8451                 
8452                 $skinid = intRequestVar('skinid');
8453                 $type = requestVar('type');
8454                 
8455                 $member->isAdmin() or $this->disallow();
8456                 
8457                 $type = trim($type);
8458                 $type = strtolower($type);
8459                 
8460                 if ( !isValidShortName($type) )
8461                 {
8462                         $this->error(_ERROR_SKIN_PARTS_SPECIAL_FORMAT);
8463                 }
8464                 
8465                 $skin = new SKIN($skinid);
8466                 $skin_types = $skin->getAvailableTypes();
8467                 if ( !array_key_exists($type, $skin_types) || !$skin_types[$type] )
8468                 {
8469                         $friendlyName = ucfirst($type);
8470                 }
8471                 else
8472                 {
8473                         $friendlyName = $skin_types[$type];
8474                 }
8475                 
8476                 $this->pagehead();
8477                 
8478                 echo '<p>(<a href="index.php?action=skinoverview">' . _SKIN_GOBACK . "</a>)</p>\n";
8479                 
8480                 echo '<h2>' . _SKIN_EDITPART_TITLE . " '" . Entity::hsc($skin->getName()) . "': " . Entity::hsc($friendlyName) . "</h2>\n";
8481                 
8482                 if ( $msg != '')
8483                 {
8484                         echo "<p>" . _MESSAGE . ": $msg</p>\n";
8485                 }
8486                 
8487                 echo "<form method=\"post\" action=\"index.php\">\n";
8488                 echo "<div>\n";
8489                 
8490                 echo "<input type=\"hidden\" name=\"action\" value=\"skinupdate\" />\n";
8491                 $manager->addTicketHidden() . "\n";
8492                 echo "<input type=\"hidden\" name=\"skinid\" value=\"{$skinid}\" />\n";
8493                 echo "<input type=\"hidden\" name=\"type\" value=\"{$type}\" />\n";
8494                 
8495                 echo '<input type="submit" value="' . _SKIN_UPDATE_BTN . '" onclick="return checkSubmit();" />' . "\n";
8496                 echo '<input type="reset" value="' . _SKIN_RESET_BTN . '" />' . "\n";
8497                 echo '(skin type: ' . Entity::hsc($friendlyName) . ")\n";
8498                 
8499                 if ( !array_key_exists($type, $skin_types) || !$skin_types[$type] )
8500                 {
8501                         help('skinpartspecial');
8502                 }
8503                 else
8504                 {
8505                         help('skinpart' . $type);
8506                 }
8507                 echo "<br />\n";
8508                 
8509                 echo "<textarea class=\"skinedit\" tabindex=\"10\" rows=\"20\" cols=\"80\" name=\"content\">\n";
8510                 echo Entity::hsc($skin->getContentFromDB($type)) . "\n";
8511                 echo "</textarea>\n";
8512                 
8513                 echo "<br />\n";
8514                 echo '<input type="submit" tabindex="20" value="' . _SKIN_UPDATE_BTN . '" onclick="return checkSubmit();" />' . "\n";
8515                 echo '<input type="reset" value="' . _SKIN_RESET_BTN . '" />' . "\n";
8516                 echo '(skin type: ' . Entity::hsc($friendlyName) . ")\n";
8517                 
8518                 echo "<br />\n";
8519                 echo "<br />\n";
8520                 echo _SKIN_ALLOWEDVARS;
8521                 
8522                 $actions = $skin->getAllowedActionsForType($type);
8523                 
8524                 sort($actions);
8525                 
8526                 while ( $current = array_shift($actions) )
8527                 {
8528                         // skip deprecated vars
8529                         if ( in_array($current, array('ifcat', 'imagetext', 'vars')) )
8530                         {
8531                                 continue;
8532                         }
8533                         
8534                         echo helplink("skinvar-{$current}") . "{$current}</a>\n";
8535                         
8536                         if ( count($actions) != 0 )
8537                         {
8538                                 echo ", ";
8539                         }
8540                 }
8541                 
8542                 echo "<br />\n";
8543                 echo "<br />\n";
8544                 echo _SKINEDIT_ALLOWEDBLOGS;
8545                 
8546                 $query = 'SELECT bshortname, bname FROM '.sql_table('blog');
8547                 showlist($query, 'table', array('content'=>'shortblognames'));
8548                 
8549                 echo "<br />\n";
8550                 echo _SKINEDIT_ALLOWEDTEMPLATESS;
8551                 
8552                 $query = 'SELECT tdname as name, tddesc as description FROM '.sql_table('template_desc');
8553                 showlist($query, 'table', array('content'=>'shortnames'));
8554                 
8555                 echo "</div>\n";
8556                 echo "</form>\n";
8557                 
8558                 $this->pagefoot();
8559                 
8560                 return;
8561         }
8562
8563     /**
8564      * @todo document this
8565      */
8566     function action_skinupdate() {
8567         global $member;
8568
8569         $skinid = intRequestVar('skinid');
8570         $content = trim(postVar('content'));
8571         $type = postVar('type');
8572
8573         $member->isAdmin() or $this->disallow();
8574
8575         $skin = new SKIN($skinid);
8576         $skin->update($type, $content);
8577
8578         $this->action_skinedittype(_SKIN_UPDATED);
8579     }
8580
8581     /**
8582      * @todo document this
8583      */
8584     function action_skindelete() {
8585         global $member, $manager, $CONF;
8586
8587         $skinid = intRequestVar('skinid');
8588
8589         $member->isAdmin() or $this->disallow();
8590
8591         // don't allow default skin to be deleted
8592         if ($skinid == $CONF['BaseSkin'])
8593             $this->error(_ERROR_DEFAULTSKIN);
8594
8595         // don't allow deletion of default skins for blogs
8596         $query = 'SELECT bname FROM '.sql_table('blog').' WHERE bdefskin=' . $skinid;
8597         $r = DB::getValue($query);
8598         if ( $r )
8599             $this->error(_ERROR_SKINDEFDELETE . Entity::hsc($r));
8600
8601         $this->pagehead();
8602
8603         $skin = new SKIN($skinid);
8604         $name = $skin->getName();
8605         $desc = $skin->getDescription();
8606
8607         ?>
8608             <h2><?php echo _DELETE_CONFIRM ?></h2>
8609
8610             <p>
8611                 <?php echo _CONFIRMTXT_SKIN ?><b><?php echo Entity::hsc($name) ?></b> (<?php echo  Entity::hsc($desc) ?>)
8612             </p>
8613
8614             <form method="post" action="index.php"><div>
8615                 <input type="hidden" name="action" value="skindeleteconfirm" />
8616                 <?php $manager->addTicketHidden() ?>
8617                 <input type="hidden" name="skinid" value="<?php echo  $skinid ?>" />
8618                 <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN ?>" />
8619             </div></form>
8620         <?php
8621         $this->pagefoot();
8622     }
8623
8624     /**
8625      * @todo document this
8626      */
8627     function action_skindeleteconfirm() {
8628         global $member, $CONF, $manager;
8629
8630         $skinid = intRequestVar('skinid');
8631
8632         $member->isAdmin() or $this->disallow();
8633
8634         // don't allow default skin to be deleted
8635         if ($skinid == $CONF['BaseSkin'])
8636             $this->error(_ERROR_DEFAULTSKIN);
8637
8638         // don't allow deletion of default skins for blogs
8639         $query = 'SELECT bname FROM '.sql_table('blog').' WHERE bdefskin=' . $skinid;
8640         $r = DB::getValue($query);
8641         if ($r)
8642             $this->error(_ERROR_SKINDEFDELETE .$r);
8643
8644         $manager->notify('PreDeleteSkin', array('skinid' => $skinid));
8645
8646         // 1. delete description
8647         DB::execute('DELETE FROM '.sql_table('skin_desc').' WHERE sdnumber=' . $skinid);
8648
8649         // 2. delete parts
8650         DB::execute('DELETE FROM '.sql_table('skin').' WHERE sdesc=' . $skinid);
8651
8652         $manager->notify('PostDeleteSkin', array('skinid' => $skinid));
8653
8654         $this->action_skinoverview();
8655     }
8656         
8657         /**
8658          * Admin::action_skinremovetype()
8659          *
8660          * @param       void
8661          * @return      void
8662          */
8663         public function action_skinremovetype()
8664         {
8665                 global $member, $manager, $CONF;
8666                 
8667                 $skinid = intRequestVar('skinid');
8668                 $skintype = requestVar('type');
8669                 
8670                 if ( !isValidShortName($skintype) )
8671                 {
8672                         $this->error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);
8673                 }
8674                 
8675                 $member->isAdmin() or $this->disallow();
8676                 
8677                 // don't allow default skinparts to be deleted
8678                 $skin = new Skin($skinid);
8679                 $default_skin_types = $skin->getDefaultTypes();
8680                 if ( array_key_exists($skintype, $default_skin_types) )
8681                 {
8682                         $this->error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);
8683                 }
8684                 
8685                 $name = $skin->getName();
8686                 $desc = $skin->getDescription();
8687                 
8688                 $this->pagehead();
8689                 
8690                 echo '<h2>' . _DELETE_CONFIRM . "</h2>\n";
8691                 echo "<p>\n";
8692                 echo _CONFIRMTXT_SKIN_PARTS_SPECIAL;
8693                 echo Entity::hsc($skintype);
8694                 echo  '(' . Entity::hsc($name) . ')</b>';
8695                 echo ' (' . Entity::hsc($desc) . ')';
8696                 echo "</p>\n";
8697                 
8698                 echo "<form method=\"post\" action=\"index.php\">\n";
8699                 echo "<div>\n";
8700                 echo "<input type=\"hidden\" name=\"action\" value=\"skinremovetypeconfirm\" />\n";
8701                 $manager->addTicketHidden();
8702                 echo "<input type=\"hidden\" name=\"skinid\" value=\"{$skinid}\" />\n";
8703                 echo '<input type="hidden" name="type" value="' . Entity::hsc($skintype) . '" />' . "\n";
8704                 echo '<input type="submit" tabindex="10" value="' . _DELETE_CONFIRM_BTN . '" />' . "\n";
8705                 echo "</div>\n";
8706                 echo "</form>\n";
8707                 $this->pagefoot();
8708                 return;
8709         }
8710         
8711         /**
8712          * Admin::action_skinremovetypeconfirm()
8713          * 
8714          * @param       void
8715          * @return      void
8716          */
8717         public function action_skinremovetypeconfirm()
8718         {
8719                 global $member, $CONF, $manager;
8720                 
8721                 $skinid = intRequestVar('skinid');
8722                 $skintype = requestVar('type');
8723                 
8724                 if ( !isValidShortName($skintype) )
8725                 {
8726                         $this->error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);
8727                 }
8728                 
8729                 $member->isAdmin() or $this->disallow();
8730                 
8731                 // don't allow default skinparts to be deleted
8732                 $skin = new Skin($skinid);
8733                 $default_skin_types = $skin->getDefaultTypes();
8734                 if ( array_key_exists($skintype, $default_skin_types) )
8735                 {
8736                         $this->error(_ERROR_SKIN_PARTS_SPECIAL_DELETE);
8737                 }
8738                 
8739                 $data = array(
8740                         'skinid'        => $skinid,
8741                         'skintype'      => $skintype
8742                 );
8743                 $manager->notify('PreDeleteSkinPart', $data);
8744                 
8745                 // delete part
8746                 $query = "DELETE FROM %s WHERE sdesc=%d AND stype='%s';";
8747                 $query = sprintf($query, sql_table('skin'), (integer) $skinid, $skintype);
8748                 DB::execute($query);
8749                 
8750                 $data = array(
8751                         'skinid'        => $skinid,
8752                         'skintype'      => $skintype
8753                 );
8754                 $manager->notify('PostDeleteSkinPart', $data);
8755                 
8756                 $this->action_skinedit();
8757                 return;
8758         }
8759         
8760     /**
8761      * @todo document this
8762      */
8763     function action_skinclone() {
8764         global $member;
8765
8766         $skinid = intRequestVar('skinid');
8767
8768         $member->isAdmin() or $this->disallow();
8769
8770         // 1. read skin to clone
8771         $skin = new SKIN($skinid);
8772
8773         $name = "clone_" . $skin->getName();
8774
8775         // if a skin with that name already exists:
8776         if (Skin::exists($name)) {
8777             $i = 1;
8778             while (Skin::exists($name . $i))
8779                 $i++;
8780             $name .= $i;
8781         }
8782
8783         // 2. create skin desc
8784         $newid = Skin::createNew(
8785             $name,
8786             $skin->getDescription(),
8787             $skin->getContentType(),
8788             $skin->getIncludeMode(),
8789             $skin->getIncludePrefix()
8790         );
8791         
8792         $query = "SELECT stype FROM " . sql_table('skin') . " WHERE sdesc = " . $skinid;
8793         $res = DB::getResult($query);
8794         foreach ( $res as $row) {
8795             $this->skinclonetype($skin, $newid, $row['stype']);
8796         }
8797
8798         $this->action_skinoverview();
8799
8800     }
8801 =======
8802                 if ( !is_object(self::$skin) )
8803                 {
8804                         global $DIR_SKINS;
8805                         $query  = "SELECT min(sdnumber) FROM %s WHERE sdname != 'admin/bookmarklet' AND sdname LIKE 'admin/%%'";
8806                         $query  = sprintf($query, sql_table('skin_desc'));
8807                         $res    = intval(DB::getValue($query));
8808                         $query  = "UPDATE %s SET value = %d WHERE name = 'AdminSkin'";
8809                         $query  = sprintf($query, sql_table('config'), $res);
8810                         DB::execute($query);
8811                         if ( $res )
8812                         {
8813                                 redirect($CONF['AdminURL']);
8814                                 exit;
8815                         }
8816                         $skin   = new Skin(0, 'AdminActions', 'AdminSkin');
8817                         $skin->parse('importAdmin', $DIR_SKINS . 'admin/defaultimporter.skn');
8818                 }
8819                 else
8820                 {
8821                         self::$skin->parse('adminskiniedoimport');
8822                 }
8823                 return;
8824         }
8825 >>>>>>> skinnable-master
8826
8827         /**
8828          * Admin::action_adminskinieexport()
8829          * 
8830          * @param       void
8831          * @return      void
8832          */
8833         static private function action_adminskinieexport()
8834         {
8835 <<<<<<< HEAD
8836                 $newid = intval($newid);
8837                 $content = $skin->getContentFromDB($type);
8838                 
8839                 if ( $content )
8840                 {
8841                         $query = "INSERT INTO %s (sdesc, scontent, stype) VALUES (%d, '%s', '%s')";
8842                         $query = sprintf($query, sql_table('skin'), (integer) $newid, $content, $type);
8843                         DB::execute($query);
8844                 }
8845 =======
8846                 global $member;
8847                 
8848                 $member->isAdmin() or self::disallow();
8849                 
8850                 // load skinie class
8851                 $aSkins = requestIntArray('skin');
8852                 $aTemplates = requestIntArray('template');
8853                 $info = postVar('info');
8854                 
8855                 self::skinieexport($aSkins, $aTemplates, $info);
8856                 
8857 >>>>>>> skinnable-master
8858                 return;
8859         }
8860         
8861         /**
8862          * Admin::action_settingsedit()
8863          * 
8864          * @param       Void
8865          * @return      Void
8866          */
8867         static private function action_settingsedit()
8868         {
8869                 global $member, $manager, $CONF, $DIR_NUCLEUS, $DIR_MEDIA;
8870 <<<<<<< HEAD
8871
8872                 $member->isAdmin() or $this->disallow();
8873
8874                 $this->pagehead();
8875
8876                 echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';
8877                 ?>
8878
8879                 <h2><?php echo _SETTINGS_TITLE ?></h2>
8880
8881                 <form action="index.php" method="post">
8882                 <div>
8883
8884                 <input type="hidden" name="action" value="settingsupdate" />
8885                 <?php $manager->addTicketHidden() ?>
8886
8887                 <table><tr>
8888                         <th colspan="2"><?php echo _SETTINGS_SUB_GENERAL ?></th>
8889                 </tr><tr>
8890                         <td><?php echo _SETTINGS_DEFBLOG ?> <?php help('defaultblog'); ?></td>
8891                         <td>
8892                                 <?php
8893                                         $query =  'SELECT bname as text, bnumber as value'
8894                                                    . ' FROM '.sql_table('blog');
8895                                         $template['name'] = 'DefaultBlog';
8896                                         $template['selected'] = $CONF['DefaultBlog'];
8897                                         $template['tabindex'] = 10;
8898                                         showlist($query,'select',$template);
8899                                 ?>
8900                         </td>
8901                 </tr><tr>
8902                         <td><?php echo _SETTINGS_BASESKIN ?> <?php help('baseskin'); ?></td>
8903                         <td>
8904                                 <?php
8905                                         $query =  'SELECT sdname as text, sdnumber as value'
8906                                                    . ' FROM '.sql_table('skin_desc');
8907                                         $template['name'] = 'BaseSkin';
8908                                         $template['selected'] = $CONF['BaseSkin'];
8909                                         $template['tabindex'] = 1;
8910                                         showlist($query,'select',$template);
8911                                 ?>
8912                         </td>
8913                 </tr><tr>
8914                         <td><?php echo _SETTINGS_ADMINMAIL ?></td>
8915                         <td><input name="AdminEmail" tabindex="10010" size="40" value="<?php echo  Entity::hsc($CONF['AdminEmail']) ?>" /></td>
8916                 </tr><tr>
8917                         <td><?php echo _SETTINGS_SITENAME ?></td>
8918                         <td><input name="SiteName" tabindex="10020" size="40" value="<?php echo  Entity::hsc($CONF['SiteName']) ?>" /></td>
8919                 </tr><tr>
8920                         <td><?php echo _SETTINGS_SITEURL ?></td>
8921                         <td><input name="IndexURL" tabindex="10030" size="40" value="<?php echo  Entity::hsc($CONF['IndexURL']) ?>" /></td>
8922                 </tr><tr>
8923                         <td><?php echo _SETTINGS_ADMINURL ?></td>
8924                         <td><input name="AdminURL" tabindex="10040" size="40" value="<?php echo  Entity::hsc($CONF['AdminURL']) ?>" /></td>
8925                 </tr><tr>
8926                         <td><?php echo _SETTINGS_PLUGINURL ?> <?php help('pluginurl'); ?></td>
8927                         <td><input name="PluginURL" tabindex="10045" size="40" value="<?php echo  Entity::hsc($CONF['PluginURL']) ?>" /></td>
8928                 </tr><tr>
8929                         <td><?php echo _SETTINGS_SKINSURL ?> <?php help('skinsurl'); ?></td>
8930                         <td><input name="SkinsURL" tabindex="10046" size="40" value="<?php echo  Entity::hsc($CONF['SkinsURL']) ?>" /></td>
8931                 </tr><tr>
8932                         <td><?php echo _SETTINGS_ACTIONSURL ?> <?php help('actionurl'); ?></td>
8933                         <td><input name="ActionURL" tabindex="10047" size="40" value="<?php echo  Entity::hsc($CONF['ActionURL']) ?>" /></td>
8934                 </tr><tr>
8935                         <td><?php echo _SETTINGS_LOCALE ?> <?php help('locale'); ?>
8936                         </td>
8937                         <td>
8938                                 <select name="Locale" tabindex="10050">
8939                         <?php
8940                                 $locales = i18n::get_available_locale_list();
8941                                 if ( !i18n::get_current_locale() || !in_array(i18n::get_current_locale(), $locales) )
8942                                 {
8943                                         echo "<option value=\"\" selected=\"selected\">en_Latn_US</option>\n";
8944                                 }
8945                                 else
8946                                 {
8947                                         echo "<option value=\"\">en_Latn_US</option>\n";
8948                                 }
8949                                 
8950                                 foreach ( $locales as $locale )
8951                                 {
8952                                         if ( $locale == 'en_Latn_US' )
8953                                         {
8954                                                 continue;
8955                                         }
8956                                         if ( $locale == i18n::get_current_locale() )
8957                                         {
8958                                                 echo "<option value=\"{$locale}\" selected=\"selected\">{$locale}</option>\n";
8959                                         }
8960                                         else
8961                                         {
8962                                                 echo "<option value=\"{$locale}\">{$locale}</option>\n";
8963                                         }
8964                                 }
8965                         ?>
8966                         </select>
8967
8968                         </td>
8969                 </tr><tr>
8970                         <td><?php echo _SETTINGS_DISABLESITE ?> <?php help('disablesite'); ?>
8971                         </td>
8972                         <td><?php $this->input_yesno('DisableSite',$CONF['DisableSite'],10060); ?>
8973                                         <br />
8974                                 <?php echo _SETTINGS_DISABLESITEURL ?> <input name="DisableSiteURL" tabindex="10070" size="40" value="<?php echo  Entity::hsc($CONF['DisableSiteURL']) ?>" />
8975                         </td>
8976                 </tr><tr>
8977                         <td><?php echo _SETTINGS_DIRS ?></td>
8978                         <td><?php echo  Entity::hsc($DIR_NUCLEUS) ?>
8979                                 <i><?php echo _SETTINGS_SEECONFIGPHP ?></i></td>
8980                 </tr><tr>
8981                         <td><?php echo _SETTINGS_DBLOGIN ?></td>
8982                         <td><i><?php echo _SETTINGS_SEECONFIGPHP ?></i></td>
8983                 </tr><tr>
8984                         <td>
8985                         <?php
8986                                 echo _SETTINGS_JSTOOLBAR
8987                                 /* =_SETTINGS_DISABLEJS
8988
8989                                         I temporary changed the meaning of DisableJsTools, until I can find a good
8990                                         way to select the javascript version to use
8991
8992                                         now, its:
8993                                                 0 : IE
8994                                                 1 : all javascript disabled
8995                                                 2 : 'simpler' javascript (for mozilla/opera/mac)
8996                                 */
8997                            ?>
8998                         </td>
8999                         <td><?php /* $this->input_yesno('DisableJsTools',$CONF['DisableJsTools'],10075); */ ?>
9000                                 <select name="DisableJsTools" tabindex="10075">
9001                         <?php                              $extra = ($CONF['DisableJsTools'] == 1) ? 'selected="selected"' : '';
9002                                         echo "<option $extra value='1'>",_SETTINGS_JSTOOLBAR_NONE,"</option>";
9003                                         $extra = ($CONF['DisableJsTools'] == 2) ? 'selected="selected"' : '';
9004                                         echo "<option $extra value='2'>",_SETTINGS_JSTOOLBAR_SIMPLE,"</option>";
9005                                         $extra = ($CONF['DisableJsTools'] == 0) ? 'selected="selected"' : '';
9006                                         echo "<option $extra value='0'>",_SETTINGS_JSTOOLBAR_FULL,"</option>";
9007                         ?>
9008                                 </select>
9009                         </td>
9010                 </tr><tr>
9011                         <td><?php echo _SETTINGS_URLMODE ?> <?php help('urlmode'); ?></td>
9012                                            <td><?php
9013
9014                                            $this->input_yesno('URLMode',$CONF['URLMode'],10077,
9015                                                           'normal','pathinfo',_SETTINGS_URLMODE_NORMAL,_SETTINGS_URLMODE_PATHINFO);
9016
9017                                            echo ' ', _SETTINGS_URLMODE_HELP;
9018
9019                                                          ?>
9020
9021                                            </td>
9022                 </tr><tr>
9023                         <td><?php echo _SETTINGS_DEBUGVARS ?> <?php help('debugvars'); ?></td>
9024                                            <td><?php
9025
9026                                                 $this->input_yesno('DebugVars',$CONF['DebugVars'],10078);
9027
9028                                                          ?>
9029
9030                                            </td>
9031                 </tr><tr>
9032                         <td><?php echo _SETTINGS_DEFAULTLISTSIZE ?> <?php help('defaultlistsize'); ?></td>
9033                         <td>
9034                         <?php
9035                                 if (!array_key_exists('DefaultListSize',$CONF)) {
9036                                         DB::execute("INSERT INTO ".sql_table('config')." VALUES ('DefaultListSize', '10')");
9037                                         $CONF['DefaultListSize'] = 10;
9038                                 }
9039                         ?>
9040                                 <input name="DefaultListSize" tabindex="10079" size="40" value="<?php echo  Entity::hsc((intval($CONF['DefaultListSize']) < 1 ? '10' : $CONF['DefaultListSize'])) ?>" />
9041                         </td>
9042                 </tr><tr>
9043                         <td><?php echo _SETTINGS_ADMINCSS ?> 
9044                         </td>
9045                         <td>
9046
9047                                 <select name="AdminCSS" tabindex="10080">
9048                                 <?php                      // show a dropdown list of all available admin css files
9049                                 global $DIR_NUCLEUS;
9050                                 
9051                                 $dirhandle = opendir($DIR_NUCLEUS."styles/");
9052
9053                                 while ($filename = readdir($dirhandle) )
9054                                 {
9055
9056                                         # replaced ereg() below with preg_match(). ereg* functions are deprecated in PHP 5.3.0
9057                                         # original ereg: ereg("^(.*)\.php$",$filename,$matches)
9058
9059                                         if (preg_match('#^admin_(.*)\.css$#', $filename, $matches) )
9060                                         {
9061
9062                                                 $name = $matches[1];
9063                                                 echo "<option value=\"$name\"";
9064
9065                                                 if ($name == $CONF['AdminCSS'])
9066                                                 {
9067                                                         echo " selected=\"selected\"";
9068                                                 }
9069
9070                                                 echo ">$name</option>";
9071
9072                                         }
9073
9074                                 }
9075
9076                                 closedir($dirhandle);
9077
9078                                 ?>
9079                                 </select>
9080
9081                         </td>
9082                 </tr><tr>
9083                         <th colspan="2"><?php echo _SETTINGS_MEDIA ?> <?php help('media'); ?></th>
9084                 </tr><tr>
9085                         <td><?php echo _SETTINGS_MEDIADIR ?></td>
9086                         <td><?php echo  Entity::hsc($DIR_MEDIA) ?>
9087                                 <i><?php echo _SETTINGS_SEECONFIGPHP ?></i>
9088                                 <?php                              if (!is_dir($DIR_MEDIA))
9089                                                 echo "<br /><b>" . _WARNING_NOTADIR . "</b>";
9090                                         if (!is_readable($DIR_MEDIA))
9091                                                 echo "<br /><b>" . _WARNING_NOTREADABLE . "</b>";
9092                                         if (!is_writeable($DIR_MEDIA))
9093                                                 echo "<br /><b>" . _WARNING_NOTWRITABLE . "</b>";
9094                                 ?>
9095                         </td>
9096                 </tr><tr>
9097                         <td><?php echo _SETTINGS_MEDIAURL ?></td>
9098                         <td>
9099                                 <input name="MediaURL" tabindex="10090" size="40" value="<?php echo  Entity::hsc($CONF['MediaURL']) ?>" />
9100                         </td>
9101                 </tr><tr>
9102                         <td><?php echo _SETTINGS_ALLOWUPLOAD ?></td>
9103                         <td><?php $this->input_yesno('AllowUpload',$CONF['AllowUpload'],10090); ?></td>
9104                 </tr><tr>
9105                         <td><?php echo _SETTINGS_ALLOWUPLOADTYPES ?></td>
9106                         <td>
9107                                 <input name="AllowedTypes" tabindex="10100" size="40" value="<?php echo  Entity::hsc($CONF['AllowedTypes']) ?>" />
9108                         </td>
9109                 </tr><tr>
9110                         <td><?php echo _SETTINGS_MAXUPLOADSIZE ?></td>
9111                         <td>
9112                                 <input name="MaxUploadSize" tabindex="10105" size="40" value="<?php echo  Entity::hsc($CONF['MaxUploadSize']) ?>" />
9113                         </td>
9114                 </tr><tr>
9115                         <td><?php echo _SETTINGS_MEDIAPREFIX ?></td>
9116                         <td><?php $this->input_yesno('MediaPrefix',$CONF['MediaPrefix'],10110); ?></td>
9117
9118                 </tr><tr>
9119                         <th colspan="2"><?php echo _SETTINGS_MEMBERS ?></th>
9120                 </tr><tr>
9121                         <td><?php echo _SETTINGS_CHANGELOGIN ?></td>
9122                         <td><?php $this->input_yesno('AllowLoginEdit',$CONF['AllowLoginEdit'],10120); ?></td>
9123                 </tr><tr>
9124                         <td><?php echo _SETTINGS_ALLOWCREATE ?>
9125                                 <?php help('allowaccountcreation'); ?>
9126                         </td>
9127                         <td><?php $this->input_yesno('AllowMemberCreate',$CONF['AllowMemberCreate'],10130); ?>
9128                         </td>
9129                 </tr><tr>
9130                         <td><?php echo _SETTINGS_NEWLOGIN ?> <?php help('allownewmemberlogin'); ?>
9131                                 <br /><?php echo _SETTINGS_NEWLOGIN2 ?>
9132                         </td>
9133                         <td><?php $this->input_yesno('NewMemberCanLogon',$CONF['NewMemberCanLogon'],10140); ?>
9134                         </td>
9135                 </tr><tr>
9136                         <td><?php echo _SETTINGS_MEMBERMSGS ?>
9137                                 <?php help('messageservice'); ?>
9138                         </td>
9139                         <td><?php $this->input_yesno('AllowMemberMail',$CONF['AllowMemberMail'],10150); ?>
9140                         </td>
9141                 </tr><tr>
9142                         <td><?php echo _SETTINGS_NONMEMBERMSGS ?>
9143                                 <?php help('messageservice'); ?>
9144                         </td>
9145                         <td><?php $this->input_yesno('NonmemberMail',$CONF['NonmemberMail'],10155); ?>
9146                         </td>
9147                 </tr><tr>
9148                         <td><?php echo _SETTINGS_PROTECTMEMNAMES ?>
9149                                 <?php help('protectmemnames'); ?>
9150                         </td>
9151                         <td><?php $this->input_yesno('ProtectMemNames',$CONF['ProtectMemNames'],10156); ?>
9152                         </td>
9153
9154
9155
9156                 </tr><tr>
9157                         <th colspan="2"><?php echo _SETTINGS_COOKIES_TITLE ?> <?php help('cookies'); ?></th>
9158                 </tr><tr>
9159                         <td><?php echo _SETTINGS_COOKIEPREFIX ?></td>
9160                         <td><input name="CookiePrefix" tabindex="10159" size="40" value="<?php echo  Entity::hsc($CONF['CookiePrefix']) ?>" /></td>
9161                 </tr><tr>
9162                         <td><?php echo _SETTINGS_COOKIEDOMAIN ?></td>
9163                         <td><input name="CookieDomain" tabindex="10160" size="40" value="<?php echo  Entity::hsc($CONF['CookieDomain']) ?>" /></td>
9164                 </tr><tr>
9165                         <td><?php echo _SETTINGS_COOKIEPATH ?></td>
9166                         <td><input name="CookiePath" tabindex="10170" size="40" value="<?php echo  Entity::hsc($CONF['CookiePath']) ?>" /></td>
9167                 </tr><tr>
9168                         <td><?php echo _SETTINGS_COOKIESECURE ?></td>
9169                         <td><?php $this->input_yesno('CookieSecure',$CONF['CookieSecure'],10180); ?></td>
9170                 </tr><tr>
9171                         <td><?php echo _SETTINGS_COOKIELIFE ?></td>
9172                         <td><?php $this->input_yesno('SessionCookie',$CONF['SessionCookie'],10190,
9173                                                           1,0,_SETTINGS_COOKIESESSION,_SETTINGS_COOKIEMONTH); ?>
9174                         </td>
9175                 </tr><tr>
9176                         <td><?php echo _SETTINGS_LASTVISIT ?></td>
9177                         <td><?php $this->input_yesno('LastVisit',$CONF['LastVisit'],10200); ?></td>
9178
9179
9180
9181                 </tr><tr>
9182                         <th colspan="2"><?php echo _SETTINGS_UPDATE ?></th>
9183                 </tr><tr>
9184                         <td><?php echo _SETTINGS_UPDATE ?></td>
9185                         <td><input type="submit" tabindex="10210" value="<?php echo _SETTINGS_UPDATE_BTN ?>" onclick="return checkSubmit();" /></td>
9186                 </tr></table>
9187
9188                 </div>
9189                 </form>
9190
9191                 <?php
9192                         echo '<h2>',_PLUGINS_EXTRA,'</h2>';
9193
9194                         $manager->notify(
9195                                 'GeneralSettingsFormExtras',
9196                                 array()
9197                         );
9198
9199                 $this->pagefoot();
9200 =======
9201                 
9202                 $member->isAdmin() or self::disallow();
9203                 
9204                 self::$skin->parse('settingsedit');
9205                 return;
9206 >>>>>>> skinnable-master
9207         }
9208         
9209         /**
9210          * Admin::action_settingsupdate()
9211          * Update $CONFIG and redirect
9212          * 
9213          * @param       void
9214          * @return      void
9215          */
9216         static private function action_settingsupdate()
9217         {
9218                 global $member, $CONF;
9219                 
9220                 $member->isAdmin() or self::disallow();
9221                 
9222                 // check if email address for admin is valid
9223                 if ( !NOTIFICATION::address_validation(postVar('AdminEmail')) )
9224                 {
9225                         self::error(_ERROR_BADMAILADDRESS);
9226                         return;
9227                 }
9228                 
9229                 // save settings
9230                 self::updateConfig('DefaultBlog',               postVar('DefaultBlog'));
9231                 self::updateConfig('BaseSkin',                  postVar('BaseSkin'));
9232                 self::updateConfig('IndexURL',                  postVar('IndexURL'));
9233                 self::updateConfig('AdminURL',                  postVar('AdminURL'));
9234                 self::updateConfig('PluginURL',                 postVar('PluginURL'));
9235                 self::updateConfig('SkinsURL',                  postVar('SkinsURL'));
9236                 self::updateConfig('ActionURL',                 postVar('ActionURL'));
9237                 self::updateConfig('Locale',                    postVar('Locale'));
9238                 self::updateConfig('AdminEmail',                postVar('AdminEmail'));
9239                 self::updateConfig('SessionCookie',             postVar('SessionCookie'));
9240                 self::updateConfig('AllowMemberCreate', postVar('AllowMemberCreate'));
9241                 self::updateConfig('AllowMemberMail',   postVar('AllowMemberMail'));
9242                 self::updateConfig('NonmemberMail',             postVar('NonmemberMail'));
9243                 self::updateConfig('ProtectMemNames',   postVar('ProtectMemNames'));
9244                 self::updateConfig('SiteName',                  postVar('SiteName'));
9245                 self::updateConfig('NewMemberCanLogon', postVar('NewMemberCanLogon'));
9246                 self::updateConfig('DisableSite',               postVar('DisableSite'));
9247                 self::updateConfig('DisableSiteURL',    postVar('DisableSiteURL'));
9248                 self::updateConfig('LastVisit',                 postVar('LastVisit'));
9249                 self::updateConfig('MediaURL',                  postVar('MediaURL'));
9250                 self::updateConfig('AllowedTypes',              postVar('AllowedTypes'));
9251                 self::updateConfig('AllowUpload',               postVar('AllowUpload'));
9252                 self::updateConfig('MaxUploadSize',             postVar('MaxUploadSize'));
9253                 self::updateConfig('MediaPrefix',               postVar('MediaPrefix'));
9254                 self::updateConfig('AllowLoginEdit',    postVar('AllowLoginEdit'));
9255                 self::updateConfig('DisableJsTools',    postVar('DisableJsTools'));
9256                 self::updateConfig('CookieDomain',              postVar('CookieDomain'));
9257                 self::updateConfig('CookiePath',                postVar('CookiePath'));
9258                 self::updateConfig('CookieSecure',              postVar('CookieSecure'));
9259                 self::updateConfig('URLMode',                   postVar('URLMode'));
9260                 self::updateConfig('CookiePrefix',              postVar('CookiePrefix'));
9261                 self::updateConfig('DebugVars',                 postVar('DebugVars'));
9262                 self::updateConfig('DefaultListSize',   postVar('DefaultListSize'));
9263                 self::updateConfig('AdminCSS',                  postVar('AdminCSS'));
9264                 self::updateConfig('AdminSkin',                 postVar('adminskin'));
9265                 self::updateConfig('BookmarkletSkin',   postVar('bookmarklet'));
9266
9267                 // load new config and redirect (this way, the new locale will be used is necessary)
9268                 // note that when changing cookie settings, this redirect might cause the user
9269                 // to have to log in again.
9270                 getConfig();
9271                 redirect($CONF['AdminURL'] . '?action=manage');
9272                 return;
9273         }
9274         
9275         /**
9276          * Admin::action_systemoverview()
9277          * Output system overview
9278          * 
9279          * @param       void
9280          * @return      void
9281          */
9282         static private function action_systemoverview()
9283         {
9284 <<<<<<< HEAD
9285                 global $member, $nucleus, $CONF;
9286                 
9287                 $this->pagehead();
9288                 
9289                 echo '<h2>' . _ADMIN_SYSTEMOVERVIEW_HEADING . "</h2>\n";
9290                 
9291                 if ( $member->isLoggedIn() && $member->isAdmin() )
9292                 {
9293                         // Information about the used PHP and MySQL installation
9294                         echo '<h3>' . _ADMIN_SYSTEMOVERVIEW_PHPANDMYSQL . "</h3>\n\n";
9295                         
9296                         // Version of PHP MySQL
9297                         echo '<table frame="box" rules="all" summary="' . _ADMIN_SYSTEMOVERVIEW_VERSIONS . "\" class=\"systemoverview\">\n";
9298                         echo "<thead>\n";
9299                         echo "<tr>\n";
9300                         echo '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_VERSIONS . "</th>\n";
9301                         echo "</tr>\n";
9302                         echo "</thead>\n";
9303                         echo "<tbody>\n";
9304                         echo "<tr>\n";
9305                         echo '<td>' . _ADMIN_SYSTEMOVERVIEW_PHPVERSION . "</td>\n";
9306                         echo '<td>' . phpversion() . "</td>\n";
9307                         echo "</tr>\n";
9308                         echo "<tr>\n";
9309                         echo '<td>' . _ADMIN_SYSTEMOVERVIEW_MYSQLVERSION . "</td>\n";
9310                         echo '<td>' . DB::getAttribute(PDO::ATTR_SERVER_VERSION) . ' (' . DB::getAttribute(PDO::ATTR_CLIENT_VERSION) . ')' . "</td>\n";
9311                         echo "</tr>\n";
9312                         echo "</tbody>\n";
9313                         echo "</table>\n\n";
9314                         
9315                         // Important PHP settings
9316                         echo '<table frame="box" rules="all" summary="' . _ADMIN_SYSTEMOVERVIEW_SETTINGS . "\" class=\"systemoverview\">\n";
9317                         echo "<thead>\n";
9318                         echo "<tr>\n";
9319                         echo '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_SETTINGS . "</th>\n";
9320                         echo "</tr>\n";
9321                         echo "</thead>\n";
9322                         echo "<tbody>\n";
9323                         echo "<tr>\n";
9324                         echo '<td>magic_quotes_gpc' . "</td>\n";
9325                         $mqg = get_magic_quotes_gpc() ? 'On' : 'Off';
9326                         echo '<td>' . $mqg . "</td>\n";
9327                         echo "</tr>\n";
9328                         echo "<tr>\n";
9329                         echo '<td>magic_quotes_runtime' . "</td>\n";
9330                         $mqr = get_magic_quotes_runtime() ? 'On' : 'Off';
9331                         echo '<td>' . $mqr . "</td>\n";
9332                         echo "</tr>\n";
9333                         echo "<tr>\n";
9334                         echo '<td>register_globals' . "</td>\n";
9335                         $rg = ini_get('register_globals') ? 'On' : 'Off';
9336                         echo '<td>' . $rg . "</td>\n";
9337                         echo "</tr>\n";
9338                         echo "</tbody>\n";
9339                         echo "</table>\n\n";
9340                         
9341                         // Information about GD library
9342                         $gdinfo = gd_info();
9343                         echo '<table frame="box" rules="all" summary="' . _ADMIN_SYSTEMOVERVIEW_GDLIBRALY . "\" class=\"systemoverview\">\n";
9344                         echo "<thead>\n";
9345                         echo "<tr>\n";
9346                         echo '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_GDLIBRALY . "</th>\n";
9347                         echo "</tr>\n";
9348                         echo "</thead>\n";
9349                         echo "<tbody>\n";
9350                         foreach ( $gdinfo as $key=>$value )
9351                         {
9352                                 if ( is_bool($value) )
9353                                 {
9354                                         $value = $value ? _ADMIN_SYSTEMOVERVIEW_ENABLE : _ADMIN_SYSTEMOVERVIEW_DISABLE;
9355                                 }
9356                                 else
9357                                 {
9358                                         $value = Entity::hsc($value);
9359                                 }
9360                                 echo "<tr>\n";
9361                                 echo '<td>' . $key . "</td>\n";
9362                                 echo '<td>' . $value . "</td>\n";
9363                                 echo "</tr>\n";
9364                         }
9365                         echo "</tbody>\n";
9366                         echo "</table>\n\n";
9367
9368                         // Check if special modules are loaded
9369                         ob_start();
9370                         phpinfo(INFO_MODULES);
9371                         $im = ob_get_contents();
9372                         ob_clean();
9373                         echo '<table frame="box" rules="all" summary="' . _ADMIN_SYSTEMOVERVIEW_MODULES . "\" class=\"systemoverview\">\n";
9374                         echo "<thead>\n";
9375                         echo "<tr>";
9376                         echo '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_MODULES . "</th>\n";
9377                         echo "</tr>\n";
9378                         echo "<tbody>\n";
9379                         echo "<tr>\n";
9380                         echo '<td>mod_rewrite' . "</td>\n";
9381                         $modrewrite = (i18n::strpos($im, 'mod_rewrite') !== FALSE) ?
9382                                                 _ADMIN_SYSTEMOVERVIEW_ENABLE :
9383                                                 _ADMIN_SYSTEMOVERVIEW_DISABLE;
9384                         echo '<td>' . $modrewrite . "</td>\n";
9385                         echo "</tr>\n";
9386                         echo "</tbody>\n";
9387                         echo "</table>\n\n";
9388
9389                         // Information about the used Nucleus CMS
9390                         echo '<h3>' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSSYSTEM . "</h3>\n";
9391                         global $nucleus;
9392                         $nv = getNucleusVersion() / 100 . '(' . $nucleus['version'] . ')';
9393                         $np = getNucleusPatchLevel();
9394                         echo "<table frame=\"box\" rules=\"all\" summary=\"Nucleus CMS\" class=\"systemoverview\" class=\"systemoverview\">\n";
9395                         echo "<thead>\n";
9396                         echo "<tr>\n";
9397                         echo '<th colspan="2">Nucleus CMS' . "</th>\n";
9398                         echo "</tr>\n";
9399                         echo "</thead>\n";
9400                         echo "<tbody>\n";
9401                         echo "<tr>\n";
9402                         echo '<td>' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSVERSION . "</td>\n";
9403                         echo '<td>' . $nv . "</td>\n";
9404                         echo "</tr>\n";
9405                         echo "<tr>\n";
9406                         echo '<td>' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSPATCHLEVEL . "</td>\n";
9407                         echo '<td>' . $np . "</td>\n";
9408                         echo "</tr>\n";
9409                         echo "</tbody>\n";
9410                         echo "</table>\n\n";
9411
9412                         // Important settings of the installation
9413                         echo '<table frame="box" rules="all" summary="' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSSETTINGS . "\" class=\"systemoverview\">\n";
9414                         echo "<thead>\n";
9415                         echo "<tr>\n";
9416                         echo '<th colspan="2">' . _ADMIN_SYSTEMOVERVIEW_NUCLEUSSETTINGS . "</th>\n";
9417                         echo "</tr>\n";
9418                         echo "</thead>\n";
9419                         echo "<tbody>\n";
9420                         echo "<tr>\n";
9421                         echo '<td>' . '$CONF[' . "'Self']</td>\n";
9422                         echo '<td>' . $CONF['Self'] . "</td>\n";
9423                         echo "</tr>\n";
9424                         echo "<tr>\n";
9425                         echo '<td>' . '$CONF[' . "'ItemURL']</td>\n";
9426                         echo '<td>' . $CONF['ItemURL'] . "</td>\n";
9427                         echo "</tr>\n";
9428                         echo "<tr>\n";
9429                         echo '<td>' . '$CONF[' . "'alertOnHeadersSent']</td>\n";
9430                         $ohs = $CONF['alertOnHeadersSent'] ?
9431                                                 _ADMIN_SYSTEMOVERVIEW_ENABLE :
9432                                                 _ADMIN_SYSTEMOVERVIEW_DISABLE;
9433                         echo '<td>' . $ohs . "</td>\n";
9434                         echo "</tr>\n";
9435                         echo "<tr>\n";
9436                         echo "<td>i18n::get_current_charset()</td>\n";
9437                         echo '<td>' . i18n::get_current_charset() . "</td>\n";
9438                         echo "</tr>\n";
9439                         echo "</tbody>\n";
9440                         echo "</table>\n\n";
9441
9442                         // Link to the online version test at the Nucleus CMS website
9443                         echo '<h3>' . _ADMIN_SYSTEMOVERVIEW_VERSIONCHECK . "</h3>\n";
9444                         if ( $nucleus['codename'] != '')
9445                         {
9446                                 $codenamestring = ' &quot;' . $nucleus['codename'] . '&quot;';
9447                         }
9448                         else
9449                         {
9450                                 $codenamestring = '';
9451                         }
9452                         echo _ADMIN_SYSTEMOVERVIEW_VERSIONCHECK_TXT;
9453                         $checkURL = sprintf(_ADMIN_SYSTEMOVERVIEW_VERSIONCHECK_URL, getNucleusVersion(), getNucleusPatchLevel());
9454                         echo '<a href="' . $checkURL . '" title="' . _ADMIN_SYSTEMOVERVIEW_VERSIONCHECK_TITLE . '">';
9455                         echo 'Nucleus CMS ' . $nv . $codenamestring;
9456                         echo '</a>';
9457                 }
9458                 else
9459                 {
9460                         echo _ADMIN_SYSTEMOVERVIEW_NOT_ADMIN;
9461                 }
9462                 $this->pagefoot();
9463 =======
9464                 self::$skin->parse('systemoverview');
9465                 return;
9466 >>>>>>> skinnable-master
9467         }
9468         
9469         /**
9470          * Admin::updateConfig()
9471          * 
9472          * @param       string  $name   
9473          * @param       string  $val    
9474          * @return      integer return the ID in which the latest query posted
9475          */
9476         static private function updateConfig($name, $val)
9477         {
9478 <<<<<<< HEAD
9479                 $name = DB::quoteValue($name);
9480                 $val = DB::quoteValue(trim($val));
9481                 
9482                 $query = "UPDATE %s SET value=%s WHERE name=%s";
9483                 $query = sprintf($query, sql_table('config'), $val, $name);
9484                 if ( DB::execute($query) === FALSE )
9485                 {
9486                         $err = DB::getError();
9487                         die("Query error: " . $err[2]);
9488 =======
9489                 $query = "UPDATE %s SET value=%s WHERE name=%s";
9490                 $query = sprintf($query, sql_table('config'), DB::quoteValue($val), DB::quoteValue($name));
9491                 if ( DB::execute($query) === FALSE )
9492                 {
9493                         $err = DB::getError();
9494                         die(_ADMIN_SQLDIE_QUERYERROR . $err[2]);
9495 >>>>>>> skinnable-master
9496                 }
9497                 return DB::getInsertId();
9498         }
9499         
9500         /**
9501          * Admin::error()
9502          * Error message
9503          * 
9504          * @param       string  $msg    message that will be shown
9505          * @return      void
9506          */
9507         static public function error($msg)
9508         {
9509                 self::$headMess = $msg;
9510                 self::$skin->parse('adminerrorpage');
9511                 return;
9512         }
9513         
9514         /**
9515          * Admin::disallow()
9516          * add error log and show error page 
9517          * 
9518          * @param       void
9519          * @return      void
9520          */
9521         static public function disallow()
9522         {
9523                 ActionLog::add(WARNING, _ACTIONLOG_DISALLOWED . serverVar('REQUEST_URI'));
9524                 self::error(_ERROR_DISALLOWED);
9525                 return;
9526         }
9527
9528         /**
9529          * Admin::action_PluginAdmin()
9530          * Output pluginadmin
9531          *
9532          * @param       string  $skinContents
9533          * @param       string  $extrahead
9534          * @return      void
9535          */
9536         static public function action_PluginAdmin($skinContents, $extrahead = '')
9537         {
9538                 self::$extrahead .= $extrahead;
9539                 self::$skin->parse('pluginadmin', $skinContents);
9540                 return;
9541         }
9542         
9543         /**
9544          * Admin::action_bookmarklet()
9545          * 
9546          * @param       void
9547          * @return      void
9548          */
9549 <<<<<<< HEAD
9550         function pagehead($extrahead = '')
9551         {
9552                 global $member, $nucleus, $CONF, $manager;
9553                 
9554                 $manager->notify(
9555                         'AdminPrePageHead',
9556                         array(
9557                                 'extrahead' => &$extrahead,
9558                                 'action' => $this->action));
9559                 
9560                 $baseUrl = Entity::hsc($CONF['AdminURL']);
9561                 if ( !array_key_exists('AdminCSS',$CONF) )
9562                 {
9563                         DB::execute("INSERT INTO ".sql_table('config')." VALUES ('AdminCSS', 'original')");
9564                         $CONF['AdminCSS'] = 'original';
9565                 }
9566                 
9567                 /* HTTP 1.1 application for no caching */
9568                 header("Cache-Control: no-cache, must-revalidate");
9569                 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
9570                 
9571                 $root_element = 'html';
9572                 $charset = i18n::get_current_charset();
9573                 $locale = preg_replace('#_#', '-', i18n::get_current_locale());
9574                 
9575                 echo "<?xml version=\"{$this->xml_version_info}\" encoding=\"{$charset}\" ?>\n";
9576                 echo "<!DOCTYPE {$root_element} PUBLIC \"{$this->formal_public_identifier}\" \"{$this->system_identifier}\">\n";
9577                 echo "<{$root_element} xmlns=\"{$this->xhtml_namespace}\" xml:lang=\"{$locale}\" lang=\"{$locale}\">\n";
9578                 echo "<head>\n";
9579                 echo '<title>' . Entity::hsc($CONF['SiteName']) . " - Admin</title>\n";
9580                 echo "<link rel=\"stylesheet\" title=\"Nucleus Admin Default\" type=\"text/css\" href=\"{$baseUrl}styles/admin_{$CONF["AdminCSS"]}.css\" />\n";
9581                 echo "<link rel=\"stylesheet\" title=\"Nucleus Admin Default\" type=\"text/css\" href=\"{$baseUrl}styles/addedit.css\" />\n";
9582                 echo "<script type=\"text/javascript\" src=\"{$baseUrl}javascript/edit.js\"></script>\n";
9583                 echo "<script type=\"text/javascript\" src=\"{$baseUrl}javascript/admin.js\"></script>\n";
9584                 echo "<script type=\"text/javascript\" src=\"{$baseUrl}javascript/compatibility.js\"></script>\n";
9585                 echo "{$extrahead}\n";
9586                 echo "</head>\n\n";
9587                 echo "<body>\n";
9588                 echo "<div id=\"adminwrapper\">\n";
9589                 echo "<div class=\"header\">\n";
9590                 echo '<h1>' . Entity::hsc($CONF['SiteName']) . "</h1>\n";
9591                 echo "</div>\n";
9592                 echo "<div id=\"container\">\n";
9593                 echo "<div id=\"content\">\n";
9594                 echo "<div class=\"loginname\">\n";
9595                 if ( $member->isLoggedIn() )
9596                 {
9597                         echo _LOGGEDINAS . ' ' . $member->getDisplayName() ." - <a href='index.php?action=logout'>" . _LOGOUT. "</a><br />\n";
9598                         echo "<a href='index.php?action=overview'>" . _ADMINHOME . "</a> - ";
9599                 }
9600                 else
9601                 {
9602                         echo '<a href="index.php?action=showlogin" title="Log in">' . _NOTLOGGEDIN . "</a><br />\n";
9603                 }
9604                 echo "<a href='".$CONF['IndexURL']."'>"._YOURSITE."</a><br />\n";
9605                 echo '(';
9606 =======
9607         static private function action_bookmarklet()
9608         {
9609                 global $member, $manager;
9610 >>>>>>> skinnable-master
9611                 
9612                 $blogid = intRequestVar('blogid');
9613                 $member->teamRights($blogid) or self::disallow();
9614                 
9615                 self::$skin->parse('bookmarklet');
9616                 return;
9617         }
9618         
9619         /**
9620          * Admin::action_actionlog()
9621          * 
9622          * @param       void
9623          * @return      void
9624          */
9625         static private function action_actionlog()
9626         {
9627                 global $member, $manager;
9628                 
9629                 $member->isAdmin() or self::disallow();
9630                 
9631                 self::$skin->parse('actionlog');
9632                 return;
9633         }
9634         
9635         /**
9636          * Admin::action_banlist()
9637          * 
9638          * @param       void
9639          * @return      void
9640          */
9641         static private function action_banlist()
9642         {
9643                 global $member, $manager;
9644                 
9645                 $blogid = intRequestVar('blogid');
9646                 $member->blogAdminRights($blogid) or self::disallow();
9647                 
9648                 self::$skin->parse('banlist');
9649                 return;
9650         }
9651         
9652         /**
9653          * Admin::action_banlistdelete()
9654          * 
9655          * @param       void
9656          * @return      void
9657          */
9658         static private function action_banlistdelete()
9659         {
9660                 global $member, $manager;
9661                 
9662                 $blogid = intRequestVar('blogid');
9663                 $member->blogAdminRights($blogid) or self::disallow();
9664                 
9665                 self::$skin->parse('banlistdelete');
9666                 return;
9667         }
9668         
9669         /**
9670          * Admin::action_banlistdeleteconfirm()
9671          * 
9672          * @param       void
9673          * @return      void
9674          */
9675         static private function action_banlistdeleteconfirm()
9676         {
9677                 global $member, $manager;
9678                 
9679                 $blogid         = intPostVar('blogid');
9680                 $allblogs       = postVar('allblogs');
9681                 $iprange        = postVar('iprange');
9682                 
9683                 $member->blogAdminRights($blogid) or self::disallow();
9684                 
9685                 $deleted = array();
9686                 
9687                 if ( !$allblogs )
9688                 {
9689                         if ( Ban::removeBan($blogid, $iprange) )
9690                         {
9691                                 $deleted[] = $blogid;
9692                         }
9693                 }
9694                 else
9695                 {
9696                         // get blogs fot which member has admin rights
9697                         $adminblogs = $member->getAdminBlogs();
9698                         foreach ($adminblogs as $blogje)
9699                         {
9700                                 if ( Ban::removeBan($blogje, $iprange) )
9701                                 {
9702                                         $deleted[] = $blogje;
9703                                 }
9704                         }
9705                 }
9706                 
9707                 if ( sizeof($deleted) == 0 )
9708                 {
9709                         self::error(_ERROR_DELETEBAN);
9710                         return;
9711                 }
9712                 
9713                 /* TODO: we should use other ways */
9714                 $_REQUEST['delblogs'] = $deleted;
9715                 
9716                 self::$skin->parse('banlistdeleteconfirm');
9717                 return;
9718         }
9719         
9720         /**
9721 <<<<<<< HEAD
9722          * Admin::action_bookmarklet()
9723 =======
9724          * Admin::action_banlistnewfromitem()
9725 >>>>>>> skinnable-master
9726          * 
9727          * @param       void
9728          * @return      void
9729          */
9730 <<<<<<< HEAD
9731         public function action_bookmarklet()
9732         {
9733                 global $member, $manager;
9734                 
9735                 $blogid = intRequestVar('blogid');
9736                 $member->teamRights($blogid) or $this->disallow();
9737                 $blog =& $manager->getBlog($blogid);
9738                 
9739                 $this->pagehead();
9740                 
9741                 echo '<p><a href="index.php?action=overview">(' . _BACKHOME . ")</a></p>\n";
9742                 
9743                 echo '<h2>' . _BOOKMARKLET_TITLE . "</h2>\n";
9744                 echo '<p>';
9745                 echo _BOOKMARKLET_DESC1 . _BOOKMARKLET_DESC2 . _BOOKMARKLET_DESC3 . _BOOKMARKLET_DESC4 . _BOOKMARKLET_DESC5;
9746                 echo "</p>\n";
9747                 
9748                 echo '<h3>' . _BOOKMARKLET_BOOKARKLET . "</h3>\n";
9749                 echo '<p>';
9750                 echo _BOOKMARKLET_BMARKTEXT . '<small>' . _BOOKMARKLET_BMARKTEST . '</small>';
9751                 echo "</p>\n";
9752                 echo '<p>';
9753                 echo '<a href="javascript:' . rawurlencode(getBookmarklet($blogid)) . '">' . sprintf(_BOOKMARKLET_ANCHOR, Entity::hsc($blog->getName())) . '</a>';
9754                 echo _BOOKMARKLET_BMARKFOLLOW;
9755                 echo "</p>\n";
9756                 
9757                 $this->pagefoot();
9758                 return;
9759         }
9760         
9761     /**
9762      * @todo document this
9763      */
9764     function action_actionlog() {
9765         global $member, $manager;
9766
9767         $member->isAdmin() or $this->disallow();
9768
9769         $this->pagehead();
9770
9771         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';
9772
9773         $url = $manager->addTicketToUrl('index.php?action=clearactionlog');
9774
9775         ?>
9776             <h2><?php echo _ACTIONLOG_CLEAR_TITLE ?></h2>
9777             <p><a href="<?php echo Entity::hsc($url) ?>"><?php echo _ACTIONLOG_CLEAR_TEXT ?></a></p>
9778         <?php
9779         echo '<h2>' . _ACTIONLOG_TITLE . '</h2>';
9780
9781         $query =  'SELECT * FROM '.sql_table('actionlog').' ORDER BY timestamp DESC';
9782         $template['content'] = 'actionlist';
9783         $amount = showlist($query,'table',$template);
9784
9785         $this->pagefoot();
9786
9787     }
9788
9789     /**
9790      * @todo document this
9791      */
9792     function action_banlist() {
9793         global $member, $manager;
9794
9795         $blogid = intRequestVar('blogid');
9796
9797         $member->blogAdminRights($blogid) or $this->disallow();
9798
9799         $blog =& $manager->getBlog($blogid);
9800
9801         $this->pagehead();
9802
9803         echo '<p><a href="index.php?action=overview">(',_BACKHOME,')</a></p>';
9804
9805         echo '<h2>' . _BAN_TITLE . " '". $this->bloglink($blog) ."'</h2>";
9806
9807         $query =  'SELECT * FROM '.sql_table('ban').' WHERE blogid='.$blogid.' ORDER BY iprange';
9808         $template['content'] = 'banlist';
9809         $amount = showlist($query,'table',$template);
9810
9811         if ($amount == 0)
9812             echo _BAN_NONE;
9813
9814         echo '<h2>'._BAN_NEW_TITLE.'</h2>';
9815         echo "<p><a href='index.php?action=banlistnew&amp;blogid=$blogid'>"._BAN_NEW_TEXT."</a></p>";
9816
9817
9818         $this->pagefoot();
9819
9820     }
9821
9822     /**
9823      * @todo document this
9824      */
9825     function action_banlistdelete() {
9826         global $member, $manager;
9827
9828         $blogid = intRequestVar('blogid');
9829         $iprange = requestVar('iprange');
9830
9831         $member->blogAdminRights($blogid) or $this->disallow();
9832
9833         $blog =& $manager->getBlog($blogid);
9834         $banBlogName =  Entity::hsc($blog->getName());
9835
9836         $this->pagehead();
9837         ?>
9838             <h2><?php echo _BAN_REMOVE_TITLE ?></h2>
9839
9840             <form method="post" action="index.php">
9841
9842             <h3><?php echo _BAN_IPRANGE ?></h3>
9843
9844             <p>
9845                 <?php echo _CONFIRMTXT_BAN ?> <?php echo Entity::hsc($iprange) ?>
9846                 <input name="iprange" type="hidden" value="<?php echo Entity::hsc($iprange) ?>" />
9847             </p>
9848
9849             <h3><?php echo _BAN_BLOGS ?></h3>
9850
9851             <div>
9852                 <input type="hidden" name="blogid" value="<?php echo $blogid ?>" />
9853                 <input name="allblogs" type="radio" value="0" id="allblogs_one" />
9854                 <label for="allblogs_one"><?php echo sprintf(_BAN_BANBLOGNAME, $banBlogName) ?></label>
9855                 <br />
9856                 <input name="allblogs" type="radio" value="1" checked="checked" id="allblogs_all" /><label for="allblogs_all"><?php echo _BAN_ALLBLOGS ?></label>
9857             </div>
9858
9859             <h3><?php echo _BAN_DELETE_TITLE ?></h3>
9860
9861             <div>
9862                 <?php $manager->addTicketHidden() ?>
9863                 <input type="hidden" name="action" value="banlistdeleteconfirm" />
9864                 <input type="submit" value="<?php echo _DELETE_CONFIRM_BTN ?>" />
9865             </div>
9866
9867             </form>
9868         <?php
9869         $this->pagefoot();
9870     }
9871
9872     /**
9873      * @todo document this
9874      */
9875     function action_banlistdeleteconfirm() {
9876         global $member, $manager;
9877
9878         $blogid = intPostVar('blogid');
9879         $allblogs = postVar('allblogs');
9880         $iprange = postVar('iprange');
9881
9882         $member->blogAdminRights($blogid) or $this->disallow();
9883
9884         $deleted = array();
9885
9886         if (!$allblogs) {
9887             if (Ban::removeBan($blogid, $iprange))
9888                 array_push($deleted, $blogid);
9889         } else {
9890             // get blogs fot which member has admin rights
9891             $adminblogs = $member->getAdminBlogs();
9892             foreach ($adminblogs as $blogje) {
9893                 if (Ban::removeBan($blogje, $iprange))
9894                     array_push($deleted, $blogje);
9895             }
9896         }
9897
9898         if (sizeof($deleted) == 0)
9899             $this->error(_ERROR_DELETEBAN);
9900
9901         $this->pagehead();
9902
9903         echo '<a href="index.php?action=banlist&amp;blogid=',$blogid,'">(',_BACK,')</a>';
9904         echo '<h2>'._BAN_REMOVED_TITLE.'</h2>';
9905         echo "<p>"._BAN_REMOVED_TEXT."</p>";
9906
9907         echo "<ul>";
9908         foreach ($deleted as $delblog) {
9909             $b =& $manager->getBlog($delblog);
9910             echo "<li>" . Entity::hsc($b->getName()). "</li>";
9911         }
9912         echo "</ul>";
9913
9914         $this->pagefoot();
9915
9916     }
9917
9918     /**
9919      * @todo document this
9920      */
9921     function action_banlistnewfromitem() {
9922         $this->action_banlistnew(getBlogIDFromItemID(intRequestVar('itemid')));
9923     }
9924
9925     /**
9926      * @todo document this
9927      */
9928     function action_banlistnew($blogid = '') {
9929         global $member, $manager;
9930
9931         if ($blogid == '')
9932             $blogid = intRequestVar('blogid');
9933
9934         $ip = requestVar('ip');
9935
9936         $member->blogAdminRights($blogid) or $this->disallow();
9937
9938         $blog =& $manager->getBlog($blogid);
9939
9940         $this->pagehead();
9941         ?>
9942         <h2><?php echo _BAN_ADD_TITLE ?></h2>
9943
9944
9945         <form method="post" action="index.php">
9946
9947         <h3><?php echo _BAN_IPRANGE ?></h3>
9948
9949         <p><?php echo _BAN_IPRANGE_TEXT ?></p>
9950
9951         <div class="note">
9952             <strong><?php echo _BAN_EXAMPLE_TITLE ?></strong>
9953             <?php echo _BAN_EXAMPLE_TEXT ?>
9954         </div>
9955
9956         <div>
9957         <?php
9958         if ($ip) {
9959             $iprangeVal = Entity::hsc($ip);
9960         ?>
9961             <input name="iprange" type="radio" value="<?php echo $iprangeVal ?>" checked="checked" id="ip_fixed" />
9962             <label for="ip_fixed"><?php echo $iprangeVal ?></label>
9963             <br />
9964             <input name="iprange" type="radio" value="custom" id="ip_custom" />
9965             <label for="ip_custom"><?php echo _BAN_IP_CUSTOM ?></label>
9966             <input name='customiprange' value='<?php echo $iprangeVal ?>' maxlength='15' size='15' />
9967         <?php
9968         } else {
9969             echo "<input name='iprange' value='custom' type='hidden' />";
9970             echo "<input name='customiprange' value='' maxlength='15' size='15' />";
9971         }
9972         ?>
9973         </div>
9974
9975         <h3><?php echo _BAN_BLOGS ?></h3>
9976
9977         <p><?php echo _BAN_BLOGS_TEXT ?></p>
9978
9979         <div>
9980             <input type="hidden" name="blogid" value="<?php echo $blogid ?>" />
9981             <input name="allblogs" type="radio" value="0" id="allblogs_one" /><label for="allblogs_one">'<?php echo Entity::hsc($blog->getName()) ?>'</label>
9982             <br />
9983             <input name="allblogs" type="radio" value="1" checked="checked" id="allblogs_all" /><label for="allblogs_all"><?php echo _BAN_ALLBLOGS ?></label>
9984         </div>
9985
9986         <h3><?php echo _BAN_REASON_TITLE ?></h3>
9987
9988         <p><?php echo _BAN_REASON_TEXT ?></p>
9989
9990         <div><textarea name="reason" cols="40" rows="5"></textarea></div>
9991
9992         <h3><?php echo _BAN_ADD_TITLE ?></h3>
9993
9994         <div>
9995             <input name="action" type="hidden" value="banlistadd" />
9996             <?php $manager->addTicketHidden() ?>
9997             <input type="submit" value="<?php echo _BAN_ADD_BTN ?>" />
9998         </div>
9999
10000         </form>
10001
10002         <?php       $this->pagefoot();
10003     }
10004
10005     /**
10006      * @todo document this
10007      */
10008     function action_banlistadd() {
10009         global $member;
10010
10011         $blogid =       intPostVar('blogid');
10012         $allblogs =     postVar('allblogs');
10013         $iprange =      postVar('iprange');
10014         if ($iprange == "custom")
10015             $iprange = postVar('customiprange');
10016         $reason =       postVar('reason');
10017
10018         $member->blogAdminRights($blogid) or $this->disallow();
10019
10020         // TODO: check IP range validity
10021
10022         if (!$allblogs) {
10023             if (!Ban::addBan($blogid, $iprange, $reason))
10024                 $this->error(_ERROR_ADDBAN);
10025         } else {
10026             // get blogs fot which member has admin rights
10027             $adminblogs = $member->getAdminBlogs();
10028             $failed = 0;
10029             foreach ($adminblogs as $blogje) {
10030                 if (!Ban::addBan($blogje, $iprange, $reason))
10031                     $failed = 1;
10032             }
10033             if ($failed)
10034                 $this->error(_ERROR_ADDBAN);
10035         }
10036
10037         $this->action_banlist();
10038
10039     }
10040
10041     /**
10042      * @todo document this
10043      */
10044     function action_clearactionlog() {
10045         global $member;
10046
10047         $member->isAdmin() or $this->disallow();
10048
10049         ActionLog::clear();
10050
10051         $this->action_manage(_MSG_ACTIONLOGCLEARED);
10052     }
10053
10054     /**
10055      * @todo document this
10056      */
10057     function action_backupoverview() {
10058         global $member, $manager;
10059
10060         $member->isAdmin() or $this->disallow();
10061
10062         $this->pagehead();
10063
10064         echo '<p><a href="index.php?action=manage">(',_BACKTOMANAGE,')</a></p>';
10065         ?>
10066         <h2><?php echo _BACKUPS_TITLE ?></h2>
10067
10068         <h3><?php echo _BACKUP_TITLE ?></h3>
10069
10070         <p><?php echo _BACKUP_INTRO ?></p>
10071
10072         <form method="post" action="index.php"><p>
10073         <input type="hidden" name="action" value="backupcreate" />
10074         <?php $manager->addTicketHidden() ?>
10075
10076         <input type="radio" name="gzip" value="1" checked="checked" id="gzip_yes" tabindex="10" /><label for="gzip_yes"><?php echo _BACKUP_ZIP_YES ?></label>
10077         <br />
10078         <input type="radio" name="gzip" value="0" id="gzip_no" tabindex="10" /><label for="gzip_no" ><?php echo _BACKUP_ZIP_NO ?></label>
10079         <br /><br />
10080         <input type="submit" value="<?php echo _BACKUP_BTN ?>" tabindex="20" />
10081
10082         </p></form>
10083
10084         <div class="note"><?php echo _BACKUP_NOTE ?></div>
10085
10086
10087         <h3><?php echo _RESTORE_TITLE ?></h3>
10088
10089         <div class="note"><?php echo _RESTORE_NOTE ?></div>
10090
10091         <p><?php echo _RESTORE_INTRO ?></p>
10092
10093         <form method="post" action="index.php" enctype="multipart/form-data"><p>
10094             <input type="hidden" name="action" value="backuprestore" />
10095             <?php $manager->addTicketHidden() ?>
10096             <input name="backup_file" type="file" tabindex="30" />
10097             <br /><br />
10098             <input type="submit" value="<?php echo _RESTORE_BTN ?>" tabindex="40" />
10099             <br /><input type="checkbox" name="letsgo" value="1" id="letsgo" tabindex="50" /><label for="letsgo"><?php echo _RESTORE_IMSURE ?></label>
10100             <br /><?php echo _RESTORE_WARNING ?>
10101         </p></form>
10102 =======
10103         static private function action_banlistnewfromitem()
10104         {
10105                 global $manager;
10106                 
10107                 $itemid = intRequestVar('itemid');
10108                 $item =& $manager->getItem($itemid, 1, 1);
10109                 self::action_banlistnew($item['blogid']);
10110                 return;
10111         }
10112         
10113         /**
10114          * Admin::action_banlistnew()
10115          * 
10116          * @param       integer $blogid ID for weblog
10117          * @return      void
10118          */
10119         static private function action_banlistnew($blogid = '')
10120         {
10121                 global $member, $manager;
10122                 
10123                 if ( $blogid == '' )
10124                 {
10125                         $blogid = intRequestVar('blogid');
10126                 }
10127                 
10128                 $ip = requestVar('ip');
10129                 
10130                 $member->blogAdminRights($blogid) or self::disallow();
10131                 
10132                 /* TODO: we should consider to use the other way instead of this */
10133                 $_REQUEST['blogid'] = $blogid;          
10134                 
10135                 self::$skin->parse('banlistnew');
10136                 
10137                 return;
10138         }
10139 >>>>>>> skinnable-master
10140
10141         /**
10142          * Admin::action_banlistadd()
10143          * 
10144          * @param       void
10145          * @return      void
10146          */
10147         static private function action_banlistadd()
10148         {
10149                 global $member;
10150                 
10151                 $blogid         = intPostVar('blogid');
10152                 $allblogs       = postVar('allblogs');
10153                 $iprange        = postVar('iprange');
10154                 
10155                 if ( $iprange == "custom" )
10156                 {
10157                         $iprange = postVar('customiprange');
10158                 }
10159                 $reason   = postVar('reason');
10160                 
10161                 $member->blogAdminRights($blogid) or self::disallow();
10162                 
10163                 // TODO: check IP range validity
10164                 
10165                 if ( !$allblogs )
10166                 {
10167                         if ( !Ban::addBan($blogid, $iprange, $reason) )
10168                         {
10169                                 self::error(_ERROR_ADDBAN);
10170                                 return;
10171                         }
10172                 }
10173                 else
10174                 {
10175                         // get blogs fot which member has admin rights
10176                         $adminblogs = $member->getAdminBlogs();
10177                         $failed = 0;
10178                         foreach ($adminblogs as $blogje)
10179                         {
10180                                 if ( !Ban::addBan($blogje, $iprange, $reason) )
10181                                 {
10182                                         $failed = 1;
10183                                 }
10184                         }
10185                         if ( $failed )
10186                         {
10187                                 self::error(_ERROR_ADDBAN);
10188                                 return;
10189                         }
10190                 }
10191                 self::action_banlist();
10192                 return;
10193         }
10194         
10195         /**
10196          * Admin::action_clearactionlog()
10197          * 
10198          * @param       void
10199          * @return      void
10200          */
10201         static private function action_clearactionlog()
10202         {
10203                 global $member;
10204                 
10205                 $member->isAdmin() or self::disallow();
10206                 
10207                 ActionLog::clear();
10208                 
10209                 self::action_manage(_MSG_ACTIONLOGCLEARED);
10210                 return;
10211         }
10212         
10213         /**
10214          * Admin::action_backupoverview()
10215          * 
10216          * @param       void
10217          * @return      void
10218          */
10219         static private function action_backupoverview()
10220         {
10221                 global $member, $manager;
10222                 
10223                 $member->isAdmin() or self::disallow();
10224                 
10225                 self::$skin->parse('backupoverview');
10226                 return;
10227         }
10228
10229         /**
10230          * Admin::action_backupcreate()
10231          * create file for backup
10232          * 
10233          * @param               void
10234          * @return      void
10235          * 
10236          */
10237         static private function action_backupcreate()
10238         {
10239                 global $member, $DIR_LIBS;
10240                 
10241                 $member->isAdmin() or self::disallow();
10242                 
10243                 // use compression ?
10244                 $useGzip = (integer) postVar('gzip');
10245                 
10246                 include($DIR_LIBS . 'backup.php');
10247                 
10248                 // try to extend time limit
10249                 // (creating/restoring dumps might take a while)
10250                 @set_time_limit(1200);
10251                 
10252                 Backup::do_backup($useGzip);
10253                 return;
10254         }
10255         
10256         /**
10257          * Admin::action_backuprestore()
10258          * restoring from uploaded file
10259          * 
10260          * @param               void
10261          * @return      void
10262          */
10263         static private function action_backuprestore()
10264         {
10265                 global $member, $DIR_LIBS;
10266                 
10267                 $member->isAdmin() or self::disallow();
10268                 
10269                 if ( intPostVar('letsgo') != 1 )
10270                 {
10271                         self::error(_ERROR_BACKUP_NOTSURE);
10272                         return;
10273                 }
10274                 
10275                 include($DIR_LIBS . 'backup.php');
10276                 
10277                 // try to extend time limit
10278                 // (creating/restoring dumps might take a while)
10279                 @set_time_limit(1200);
10280                 
10281                 $message = Backup::do_restore();
10282                 if ( $message != '' )
10283                 {
10284                         self::error($message);
10285                         return;
10286                 }
10287                 self::$skin->parse('backuprestore');
10288                 return;
10289         }
10290         
10291         /**
10292          * Admin::action_pluginlist()
10293          * output the list of installed plugins
10294          * 
10295          * @param       void
10296          * @return      void
10297          * 
10298          */
10299         static private function action_pluginlist()
10300         {
10301                 global $DIR_PLUGINS, $member, $manager;
10302                 
10303                 // check if allowed
10304                 $member->isAdmin() or self::disallow();
10305                 
10306                 self::$skin->parse('pluginlist');
10307                 return;
10308         }
10309         
10310         /**
10311          * Admin::action_pluginhelp()
10312          * 
10313          * @param       void
10314          * @return      void
10315          */
10316         static private function action_pluginhelp()
10317         {
10318                 global $member, $manager, $DIR_PLUGINS, $CONF;
10319                 
10320 <<<<<<< HEAD
10321                 while ( $filename = readdir($dirhandle) )
10322                 {
10323                         if ( preg_match('#^NP_(.*)\.php$#', $filename, $matches) )
10324                         {
10325                                 $name = $matches[1];
10326                                 
10327                                 // only show in list when not yet installed
10328                                 $query = 'SELECT * FROM %s WHERE pfile = %s';
10329                                 $query = sprintf($query, sql_table('plugin'), DB::quoteValue('NP_'.$name));
10330                                 $res = DB::getResult($query);
10331                                 
10332                                 if ( $res->rowCount() == 0 )
10333                                 {
10334                                         array_push($candidates, $name);
10335                                 }
10336                         }
10337                 }
10338 =======
10339                 // check if allowed
10340                 $member->isAdmin() or self::disallow();
10341 >>>>>>> skinnable-master
10342                 
10343                 $plugid = intGetVar('plugid');
10344                 
10345                 if ( !$manager->pidInstalled($plugid) )
10346                 {
10347                         self::error(_ERROR_NOSUCHPLUGIN);
10348                         return;
10349                 }
10350                 
10351                 self::$skin->parse('pluginhelp');
10352                 return;
10353         }
10354         
10355 <<<<<<< HEAD
10356     /**
10357      * @todo document this
10358      */
10359     function action_pluginhelp() {
10360         global $member, $manager, $DIR_PLUGINS, $CONF;
10361
10362         // check if allowed
10363         $member->isAdmin() or $this->disallow();
10364
10365         $plugid = intGetVar('plugid');
10366
10367         if (!$manager->pidInstalled($plugid))
10368             $this->error(_ERROR_NOSUCHPLUGIN);
10369
10370         $plugName = $manager->getPluginNameFromPid($plugid);
10371
10372         $this->pagehead();
10373
10374         echo '<p><a href="index.php?action=pluginlist">(',_PLUGS_BACK,')</a></p>';
10375
10376         echo '<h2>',_PLUGS_HELP_TITLE,': ',Entity::hsc($plugName),'</h2>';
10377
10378         $plug =& $manager->getPlugin($plugName);
10379         $helpFile = $DIR_PLUGINS.$plug->getShortName().'/help.html';
10380
10381         if (($plug->supportsFeature('HelpPage') > 0) && (@file_exists($helpFile))) {
10382             @readfile($helpFile);
10383         } else {
10384             echo '<p>Error: ', _ERROR_PLUGNOHELPFILE,'</p>';
10385             echo '<p><a href="index.php?action=pluginlist">(',_BACK,')</a></p>';
10386         }
10387
10388
10389         $this->pagefoot();
10390     }
10391
10392 =======
10393 >>>>>>> skinnable-master
10394         /**
10395          * Admin::action_pluginadd()
10396          * 
10397          * @param       Void
10398          * @return      Void
10399          * 
10400          */
10401         static private function action_pluginadd()
10402         {
10403                 global $member, $manager, $DIR_PLUGINS;
10404                 
10405                 // check if allowed
10406                 $member->isAdmin() or self::disallow();
10407                 
10408                 $name = postVar('filename');
10409                 
10410                 if ( $manager->pluginInstalled($name) )
10411                 {
10412                         self::error(_ERROR_DUPPLUGIN);
10413                         return;
10414                 }
10415                 
10416                 if ( !checkPlugin($name) )
10417                 {
10418                         self::error(_ERROR_PLUGFILEERROR . ' (' . Entity::hsc($name) . ')');
10419                         return;
10420                 }
10421                 
10422                 // get number of currently installed plugins
10423 <<<<<<< HEAD
10424                 $res = DB::getResult('SELECT * FROM '.sql_table('plugin'));
10425 =======
10426                 $res = DB::getResult('SELECT * FROM ' . sql_table('plugin'));
10427 >>>>>>> skinnable-master
10428                 $numCurrent = $res->rowCount();
10429                 
10430                 // plugin will be added as last one in the list
10431                 $newOrder = $numCurrent + 1;
10432                 
10433                 $data = array('file' => &$name);
10434                 $manager->notify('PreAddPlugin', $data);
10435                 
10436                 // do this before calling getPlugin (in case the plugin id is used there)
10437 <<<<<<< HEAD
10438                 $query = 'INSERT INTO '.sql_table('plugin').' (porder, pfile) VALUES ('.$newOrder.','.DB::quoteValue($name).')';
10439 =======
10440                 $query = "INSERT INTO %s (porder, pfile) VALUES (%d, %s);";
10441                 $query = sprintf($query, sql_table('plugin'), (integer) $newOrder, DB::quoteValue($name));
10442 >>>>>>> skinnable-master
10443                 DB::execute($query);
10444                 $iPid = DB::getInsertId();
10445                 
10446                 $manager->clearCachedInfo('installedPlugins');
10447                 
10448                 // Load the plugin for condition checking and instalation
10449                 $plugin =& $manager->getPlugin($name);
10450                 
10451                 // check if it got loaded (could have failed)
10452                 if ( !$plugin )
10453                 {
10454 <<<<<<< HEAD
10455                         DB::execute('DELETE FROM ' . sql_table('plugin') . ' WHERE pid='. intval($iPid));
10456 =======
10457                         $query = "DELETE FROM %s WHERE pid=%d;";
10458                         $query = sprintf($query, sql_table('plugin'), (integer) $iPid);
10459                         
10460                         DB::execute($query);
10461                         
10462 >>>>>>> skinnable-master
10463                         $manager->clearCachedInfo('installedPlugins');
10464                         self::error(_ERROR_PLUGIN_LOAD);
10465                         return;
10466                 }
10467                 
10468                 // check if plugin needs a newer Nucleus version
10469                 if ( getNucleusVersion() < $plugin->getMinNucleusVersion() )
10470                 {
10471                         // uninstall plugin again...
10472                         self::deleteOnePlugin($plugin->getID());
10473                         
10474                         // ...and show error
10475                         self::error(_ERROR_NUCLEUSVERSIONREQ . Entity::hsc($plugin->getMinNucleusVersion()));
10476                         return;
10477                 }
10478                 
10479                 // check if plugin needs a newer Nucleus version
10480                 if ( (getNucleusVersion() == $plugin->getMinNucleusVersion()) && (getNucleusPatchLevel() < $plugin->getMinNucleusPatchLevel()) )
10481                 {
10482                         // uninstall plugin again...
10483                         self::deleteOnePlugin($plugin->getID());
10484                         
10485                         // ...and show error
10486                         self::error(_ERROR_NUCLEUSVERSIONREQ . Entity::hsc( $plugin->getMinNucleusVersion() . ' patch ' . $plugin->getMinNucleusPatchLevel() ) );
10487                         return;
10488                 }
10489                 
10490                 $pluginList = $plugin->getPluginDep();
10491                 foreach ( $pluginList as $pluginName )
10492                 {
10493                         $res = DB::getResult('SELECT * FROM '.sql_table('plugin') . ' WHERE pfile=' . DB::quoteValue($pluginName));
10494                         if ($res->rowCount() == 0)
10495                         {
10496                                 // uninstall plugin again...
10497                                 self::deleteOnePlugin($plugin->getID());
10498                                 self::error(sprintf(_ERROR_INSREQPLUGIN, Entity::hsc($pluginName)));
10499                                 return;
10500                         }
10501                 }
10502                 
10503                 // call the install method of the plugin
10504                 $plugin->install();
10505                 
10506                 $data = array('plugin' => &$plugin);
10507                 $manager->notify('PostAddPlugin', $data);
10508                 
10509                 // update all events
10510                 self::action_pluginupdate();
10511                 return;
10512         }
10513         
10514         /**
10515          * ADMIN:action_pluginupdate():
10516          * 
10517          * @param       Void
10518          * @return      Void
10519          * 
10520          */
10521         static private function action_pluginupdate()
10522         {
10523                 global $member, $manager, $CONF;
10524                 
10525                 // check if allowed
10526                 $member->isAdmin() or self::disallow();
10527                 
10528                 // delete everything from plugin_events
10529                 DB::execute('DELETE FROM '.sql_table('plugin_event'));
10530                 
10531                 // loop over all installed plugins
10532                 $res = DB::getResult('SELECT pid, pfile FROM '.sql_table('plugin'));
10533                 foreach ( $res as $row )
10534                 {
10535                         $pid  =  $row['pid'];
10536                         $plug =& $manager->getPlugin($row['pfile']);
10537                         if ( $plug )
10538                         {
10539                                 $eventList = $plug->getEventList();
10540                                 foreach ( $eventList as $eventName )
10541                                 {
10542                                         $query = "INSERT INTO %s (pid, event) VALUES (%d, %s)";
10543                                         $query = sprintf($query, sql_table('plugin_event'), (integer) $pid, DB::quoteValue($eventName));
10544                                         DB::execute($query);
10545                                 }
10546                         }
10547                 }
10548                 redirect($CONF['AdminURL'] . '?action=pluginlist');
10549                 return;
10550         }
10551         
10552         /**
10553          * Admin::action_plugindelete()
10554          * 
10555          * @param       void
10556          * @return      void
10557          */
10558         static private function action_plugindelete()
10559         {
10560                 global $member, $manager;
10561                 
10562                 // check if allowed
10563                 $member->isAdmin() or self::disallow();
10564                 
10565                 $pid = intGetVar('plugid');
10566                 
10567                 if ( !$manager->pidInstalled($pid) )
10568                 {
10569                         self::error(_ERROR_NOSUCHPLUGIN);
10570                         return;
10571                 }
10572                 
10573                 self::$skin->parse('plugindelete');
10574                 return;
10575         }
10576
10577         /**
10578          * Admin::action_plugindeleteconfirm()
10579          * 
10580          * @param       void
10581          * @return      void
10582          */
10583         static private function action_plugindeleteconfirm()
10584         {
10585                 global $member, $manager, $CONF;
10586                 
10587                 // check if allowed
10588                 $member->isAdmin() or self::disallow();
10589                 
10590                 $pid = intPostVar('plugid');
10591                 
10592                 $error = self::deleteOnePlugin($pid, 1);
10593                 if ( $error )
10594                 {
10595                         self::error($error);
10596                         return;
10597                 }
10598                 
10599                 redirect($CONF['AdminURL'] . '?action=pluginlist');
10600                 return;
10601         }
10602         
10603         /**
10604          * Admin::deleteOnePlugin()
10605          * 
10606          * @param       integer $pid
10607          * @param       boolean $callUninstall
10608          * @return      string  empty or message if failed
10609          */
10610         static public function deleteOnePlugin($pid, $callUninstall = 0)
10611         {
10612                 global $manager;
10613                 
10614                 $pid = intval($pid);
10615                 
10616                 if ( !$manager->pidInstalled($pid) )
10617                 {
10618                         return _ERROR_NOSUCHPLUGIN;
10619                 }
10620                 
10621                 $query = "SELECT pfile as result FROM %s WHERE pid=%d;";
10622                 $query = sprintf($query, sql_table('plugin'), (integer) $pid);
10623                 $name = DB::getValue($query);
10624                 
10625                 // check dependency before delete
10626                 $res = DB::getResult('SELECT pfile FROM ' . sql_table('plugin'));
10627                 foreach ( $res as $row )
10628                 {
10629                         $plug =& $manager->getPlugin($row['pfile']);
10630                         if ( $plug )
10631                         {
10632                                 $depList = $plug->getPluginDep();
10633                                 foreach ( $depList as $depName )
10634                                 {
10635                                         if ( $name == $depName )
10636                                         {
10637                                                 return sprintf(_ERROR_DELREQPLUGIN, $row['pfile']);
10638                                         }
10639                                 }
10640                         }
10641                 }
10642                 
10643                 $data = array('plugid' => $pid);
10644                 $manager->notify('PreDeletePlugin', $data);
10645                 
10646                 // call the unInstall method of the plugin
10647                 if ( $callUninstall )
10648                 {
10649                         $plugin =& $manager->getPlugin($name);
10650                         if ( $plugin )
10651                         {
10652                                 $plugin->unInstall();
10653                         }
10654                 }
10655                 
10656                 // delete all subscriptions
10657                 DB::execute('DELETE FROM ' . sql_table('plugin_event') . ' WHERE pid=' . $pid);
10658                 
10659                 // delete all options
10660                 // get OIDs from plugin_option_desc
10661                 $res = DB::getResult('SELECT oid FROM ' . sql_table('plugin_option_desc') . ' WHERE opid=' . $pid);
10662                 $aOIDs = array();
10663                 foreach ( $res as $row )
10664                 {
10665                         array_push($aOIDs, $row['oid']);
10666                 }
10667                 
10668                 // delete from plugin_option and plugin_option_desc
10669                 DB::execute('DELETE FROM ' . sql_table('plugin_option_desc') . ' WHERE opid=' . $pid);
10670                 if (count($aOIDs) > 0)
10671                 {
10672                         DB::execute('DELETE FROM ' . sql_table('plugin_option') . ' WHERE oid in (' . implode(',', $aOIDs) . ')');
10673                 }
10674                 
10675                 // update order numbers
10676                 $res = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $pid);
10677                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=(porder - 1) WHERE porder>' . $res);
10678                 
10679                 // delete row
10680                 DB::execute('DELETE FROM ' . sql_table('plugin') . ' WHERE pid=' . $pid);
10681                 
10682                 $manager->clearCachedInfo('installedPlugins');
10683                 $data = array('plugid' => $pid);
10684                 $manager->notify('PostDeletePlugin', $data);
10685                 
10686                 return '';
10687         }
10688         
10689         /**
10690          * Admin::action_pluginup()
10691          * 
10692          * @param       void
10693          * @return      void
10694          */
10695         static private function action_pluginup()
10696         {
10697                 global $member, $manager, $CONF;
10698                 
10699                 // check if allowed
10700                 $member->isAdmin() or self::disallow();
10701                 
10702                 $plugid = intGetVar('plugid');
10703                 
10704                 if ( !$manager->pidInstalled($plugid) )
10705                 {
10706 <<<<<<< HEAD
10707                         $res = DB::getResult('SELECT * FROM '.sql_table('plugin') . ' WHERE pfile=' . DB::quoteValue($pluginName));
10708                         if ($res->rowCount() == 0)
10709                         {
10710                                 // uninstall plugin again...
10711                                 $this->deleteOnePlugin($plugin->getID());
10712                                 $this->error(sprintf(_ERROR_INSREQPLUGIN, Entity::hsc($pluginName)));
10713                         }
10714 =======
10715                         self::error(_ERROR_NOSUCHPLUGIN);
10716                         return;
10717 >>>>>>> skinnable-master
10718                 }
10719                 
10720                 // 1. get old order number
10721                 $oldOrder = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $plugid);
10722                 
10723                 // 2. calculate new order number
10724                 $newOrder = ($oldOrder > 1) ? ($oldOrder - 1) : 1;
10725                 
10726                 // 3. update plug numbers
10727                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $oldOrder . ' WHERE porder=' . $newOrder);
10728                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $newOrder . ' WHERE pid=' . $plugid);
10729                 
10730                 //self::action_pluginlist();
10731                 // To avoid showing ticket in the URL, redirect to pluginlist, instead.
10732                 redirect($CONF['AdminURL'] . '?action=pluginlist');
10733                 return;
10734         }
10735         
10736         /**
10737          * Admin::action_plugindown()
10738          * 
10739          * @param       void
10740          * @return      void
10741          */
10742         static private function action_plugindown()
10743         {
10744                 global $member, $manager, $CONF;
10745                 
10746                 // check if allowed
10747 <<<<<<< HEAD
10748                 $member->isAdmin() or $this->disallow();
10749                 
10750                 // delete everything from plugin_events
10751                 DB::execute('DELETE FROM '.sql_table('plugin_event'));
10752                 
10753                 // loop over all installed plugins
10754                 $res = DB::getResult('SELECT pid, pfile FROM '.sql_table('plugin'));
10755                 foreach ( $res as $row )
10756                 {
10757                         $pid = $row['pid'];
10758                         $plug =& $manager->getPlugin($row['pfile']);
10759                         if ( $plug )
10760                         {
10761                                 $eventList = $plug->getEventList();
10762                                 foreach ( $eventList as $eventName )
10763                                 {
10764                                         $query = "INSERT INTO %s (pid, event) VALUES (%d, %s)";
10765                                         $query = sprintf($query, sql_table('plugin_event'), (integer) $pid, DB::quoteValue($eventName));
10766                                         DB::execute($query);
10767                                 }
10768                         }
10769 =======
10770                 $member->isAdmin() or self::disallow();
10771                 
10772                 $plugid = intGetVar('plugid');
10773                 if ( !$manager->pidInstalled($plugid) )
10774                 {
10775                         self::error(_ERROR_NOSUCHPLUGIN);
10776                         return;
10777 >>>>>>> skinnable-master
10778                 }
10779                 
10780                 // 1. get old order number
10781                 $oldOrder = DB::getValue('SELECT porder FROM ' . sql_table('plugin') . ' WHERE pid=' . $plugid);
10782                 
10783                 $res = DB::getResult('SELECT * FROM ' . sql_table('plugin'));
10784                 $maxOrder = $res->rowCount();
10785                 
10786                 // 2. calculate new order number
10787                 $newOrder = ($oldOrder < $maxOrder) ? ($oldOrder + 1) : $maxOrder;
10788                 
10789                 // 3. update plug numbers
10790                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $oldOrder . ' WHERE porder=' . $newOrder);
10791                 DB::execute('UPDATE ' . sql_table('plugin') . ' SET porder=' . $newOrder . ' WHERE pid=' . $plugid);
10792                 
10793                 //self::action_pluginlist();
10794                 // To avoid showing ticket in the URL, redirect to pluginlist, instead.
10795                 redirect($CONF['AdminURL'] . '?action=pluginlist');
10796                 return;
10797         }
10798         
10799 <<<<<<< HEAD
10800     /**
10801      * @todo document this
10802      */
10803     function action_plugindelete() {
10804         global $member, $manager;
10805
10806         // check if allowed
10807         $member->isAdmin() or $this->disallow();
10808
10809         $pid = intGetVar('plugid');
10810
10811         if (!$manager->pidInstalled($pid))
10812             $this->error(_ERROR_NOSUCHPLUGIN);
10813
10814         $this->pagehead();
10815         ?>
10816             <h2><?php echo _DELETE_CONFIRM ?></h2>
10817
10818             <p><?php echo _CONFIRMTXT_PLUGIN ?> <strong><?php echo $manager->getPluginNameFromPid($pid) ?></strong>?</p>
10819
10820             <form method="post" action="index.php"><div>
10821             <?php $manager->addTicketHidden() ?>
10822             <input type="hidden" name="action" value="plugindeleteconfirm" />
10823             <input type="hidden" name="plugid" value="<?php echo $pid; ?>" />
10824             <input type="submit" tabindex="10" value="<?php echo _DELETE_CONFIRM_BTN ?>" />
10825             </div></form>
10826         <?php
10827         $this->pagefoot();
10828     }
10829
10830     /**
10831      * @todo document this
10832      */
10833     function action_plugindeleteconfirm() {
10834         global $member, $manager, $CONF;
10835
10836         // check if allowed
10837         $member->isAdmin() or $this->disallow();
10838
10839         $pid = intPostVar('plugid');
10840
10841         $error = $this->deleteOnePlugin($pid, 1);
10842         if ($error) {
10843             $this->error($error);
10844         }
10845
10846         redirect($CONF['AdminURL'] . '?action=pluginlist');
10847 //              $this->action_pluginlist();
10848     }
10849
10850     /**
10851      * @todo document this
10852      */
10853     function deleteOnePlugin($pid, $callUninstall = 0) {
10854         global $manager;
10855
10856         $pid = intval($pid);
10857
10858         if (!$manager->pidInstalled($pid))
10859             return _ERROR_NOSUCHPLUGIN;
10860
10861         $name = DB::getValue('SELECT pfile as result FROM '.sql_table('plugin').' WHERE pid='.$pid);
10862
10863 /*              // call the unInstall method of the plugin
10864         if ($callUninstall) {
10865             $plugin =& $manager->getPlugin($name);
10866             if ($plugin) $plugin->unInstall();
10867         }*/
10868
10869         // check dependency before delete
10870         $res = DB::getResult('SELECT pfile FROM '.sql_table('plugin'));
10871         foreach ( $res as $row ) {
10872             $plug =& $manager->getPlugin($row['pfile']);
10873             if ($plug)
10874             {
10875                 $depList = $plug->getPluginDep();
10876                 foreach ($depList as $depName)
10877                 {
10878                     if ($name == $depName)
10879                     {
10880                         return sprintf(_ERROR_DELREQPLUGIN, $row['pfile']);
10881                     }
10882                 }
10883             }
10884         }
10885
10886         $manager->notify('PreDeletePlugin', array('plugid' => $pid));
10887
10888         // call the unInstall method of the plugin
10889         if ($callUninstall) {
10890             $plugin =& $manager->getPlugin($name);
10891             if ($plugin) $plugin->unInstall();
10892         }
10893
10894         // delete all subscriptions
10895         DB::execute('DELETE FROM '.sql_table('plugin_event').' WHERE pid=' . $pid);
10896
10897         // delete all options
10898         // get OIDs from plugin_option_desc
10899         $res = DB::getResult('SELECT oid FROM ' . sql_table('plugin_option_desc') . ' WHERE opid=' . $pid);
10900         $aOIDs = array();
10901         foreach ( $res as $row ) {
10902             array_push($aOIDs, $row['oid']);
10903         }
10904
10905         // delete from plugin_option and plugin_option_desc
10906         DB::execute('DELETE FROM '.sql_table('plugin_option_desc').' WHERE opid=' . $pid);
10907         if (count($aOIDs) > 0)
10908             DB::execute('DELETE FROM '.sql_table('plugin_option').' WHERE oid in ('.implode(',',$aOIDs).')');
10909
10910         // update order numbers
10911         $res = DB::getValue('SELECT porder FROM '.sql_table('plugin').' WHERE pid=' . $pid);
10912         DB::execute('UPDATE '.sql_table('plugin').' SET porder=(porder - 1) WHERE porder>'.$res);
10913
10914         // delete row
10915         DB::execute('DELETE FROM '.sql_table('plugin').' WHERE pid='.$pid);
10916
10917         $manager->clearCachedInfo('installedPlugins');
10918         $manager->notify('PostDeletePlugin', array('plugid' => $pid));
10919
10920         return '';
10921     }
10922
10923     /**
10924      * @todo document this
10925      */
10926     function action_pluginup() {
10927         global $member, $manager, $CONF;
10928
10929         // check if allowed
10930         $member->isAdmin() or $this->disallow();
10931
10932         $plugid = intGetVar('plugid');
10933
10934         if (!$manager->pidInstalled($plugid))
10935             $this->error(_ERROR_NOSUCHPLUGIN);
10936
10937         // 1. get old order number
10938         $oldOrder = DB::getValue('SELECT porder FROM '.sql_table('plugin').' WHERE pid='.$plugid);
10939
10940         // 2. calculate new order number
10941         $newOrder = ($oldOrder > 1) ? ($oldOrder - 1) : 1;
10942
10943         // 3. update plug numbers
10944         DB::execute('UPDATE '.sql_table('plugin').' SET porder='.$oldOrder.' WHERE porder='.$newOrder);
10945         DB::execute('UPDATE '.sql_table('plugin').' SET porder='.$newOrder.' WHERE pid='.$plugid);
10946
10947         //$this->action_pluginlist();
10948         // To avoid showing ticket in the URL, redirect to pluginlist, instead.
10949         redirect($CONF['AdminURL'] . '?action=pluginlist');
10950     }
10951
10952     /**
10953      * @todo document this
10954      */
10955     function action_plugindown() {
10956         global $member, $manager, $CONF;
10957
10958         // check if allowed
10959         $member->isAdmin() or $this->disallow();
10960
10961         $plugid = intGetVar('plugid');
10962         if (!$manager->pidInstalled($plugid))
10963             $this->error(_ERROR_NOSUCHPLUGIN);
10964
10965         // 1. get old order number
10966         $oldOrder = DB::getValue('SELECT porder FROM '.sql_table('plugin').' WHERE pid='.$plugid);
10967
10968         $res = DB::getResult('SELECT * FROM '.sql_table('plugin'));
10969         $maxOrder = $res->rowCount();
10970
10971         // 2. calculate new order number
10972         $newOrder = ($oldOrder < $maxOrder) ? ($oldOrder + 1) : $maxOrder;
10973
10974         // 3. update plug numbers
10975         DB::execute('UPDATE '.sql_table('plugin').' SET porder='.$oldOrder.' WHERE porder='.$newOrder);
10976         DB::execute('UPDATE '.sql_table('plugin').' SET porder='.$newOrder.' WHERE pid='.$plugid);
10977
10978         //$this->action_pluginlist();
10979         // To avoid showing ticket in the URL, redirect to pluginlist, instead.
10980         redirect($CONF['AdminURL'] . '?action=pluginlist');
10981     }
10982         
10983 =======
10984 >>>>>>> skinnable-master
10985         /**
10986          * Admin::action_pluginoptions()
10987          * 
10988          * Output Plugin option page
10989          * 
10990          * @access      public
10991          * @param       string $message message when fallbacked
10992          * @return      void
10993          * 
10994          */
10995         static private function action_pluginoptions($message = '')
10996         {
10997                 global $member, $manager;
10998                 
10999                 // check if allowed
11000                 $member->isAdmin() or self::disallow();
11001                 
11002                 $pid = intRequestVar('plugid');
11003                 if ( !$manager->pidInstalled($pid) )
11004                 {
11005                         self::error(_ERROR_NOSUCHPLUGIN);
11006                         return;
11007                 }
11008                 
11009 <<<<<<< HEAD
11010                 $pname = $manager->getPluginNameFromPid($pid);
11011                 
11012                 /* NOTE: to include translation file */
11013                 $manager->getPlugin($pname);
11014                 
11015                 $extrahead = "<script type=\"text/javascript\" src=\"javascript/numbercheck.js\"></script>\n";
11016                 $this->pagehead($extrahead);
11017                 echo '<p><a href="index.php?action=pluginlist">(' . _PLUGS_BACK . ")</a></p>\n";
11018                 echo '<h2>' . sprintf(_PLUGIN_OPTIONS_TITLE, Entity::hsc($pname)) . "</h2>\n";
11019                 
11020                 if ( isset($message) )
11021                 {
11022                         echo $message;
11023                 }
11024                 
11025                 echo "<form action=\"index.php\" method=\"post\">\n";
11026                 echo "<div>\n";
11027                 echo "<input type=\"hidden\" name=\"action\" value=\"pluginoptionsupdate\" />\n";
11028                 echo "<input type=\"hidden\" name=\"plugid\" value=\"{$pid}\" />\n";
11029                 $manager->addTicketHidden();
11030                 
11031                 $options = array();
11032                 $query = "SELECT * FROM %s WHERE ocontext='global' and opid=%d ORDER BY oid ASC";
11033                 $query = sprintf($query, sql_table('plugin_option_desc'), $pid);
11034                 $result = DB::getResult($query);
11035                 foreach ( $result as $row )
11036                 {
11037                         $options[$row['oid']] = array(
11038                                 'oid'           => $row['oid'],
11039                                 'value'         => $row['odef'],
11040                                 'name'          => $row['oname'],
11041                                 'description' => $row['odesc'],
11042                                 'type'          => $row['otype'],
11043                                 'typeinfo'      => $row['oextra'],
11044                                 'contextid'     => 0
11045                         );
11046                 }
11047                 // fill out actual values
11048                 if ( count($options) > 0 )
11049                 {
11050                         $query = "SELECT oid, ovalue FROM %s WHERE oid in (%s)";
11051                         $query = sprintf($query, sql_table('plugin_option'), implode(',',array_keys($options)));
11052                         $result = DB::getResult($query);
11053                         foreach ( $result as $row )
11054                         {
11055                                 $options[$row['oid']]['value'] = $row['ovalue'];
11056                         }
11057                 }
11058                 
11059                 // call plugins
11060                 $data = array('context' => 'global', 'plugid' => $pid, 'options'=>&$options);
11061                 $manager->notify('PrePluginOptionsEdit',$data);
11062                 
11063                 $template['content'] = 'plugoptionlist';
11064                 $amount = showlist($options,'table', $template);
11065                 if ( $amount == 0 )
11066                 {
11067                         echo '<p>',_ERROR_NOPLUGOPTIONS,'</p>';
11068 =======
11069                 if ( isset($message) )
11070                 {
11071                         self::$headMess = $message;
11072 >>>>>>> skinnable-master
11073                 }
11074                 $plugname       = $manager->getPluginNameFromPid($pid);
11075                 $plugin         = $manager->getPlugin($plugname);
11076                 self::$extrahead .= "<script type=\"text/javascript\" src=\"<%skinfile(/javascripts/numbercheck.js)%>\"></script>\n";
11077                 
11078                 self::$skin->parse('pluginoptions');
11079                 return;
11080         }
11081         
11082         /**
11083          * Admin::action_pluginoptionsupdate()
11084          * 
11085          * Update plugin options and fallback to plugin option page
11086          * 
11087          * @access      public
11088          * @param       void
11089          * @return      void
11090          */
11091         static private function action_pluginoptionsupdate()
11092         {
11093                 global $member, $manager;
11094                 
11095                 // check if allowed
11096                 $member->isAdmin() or self::disallow();
11097                 
11098                 $pid = intRequestVar('plugid');
11099                 
11100                 if ( !$manager->pidInstalled($pid) )
11101                 {
11102                         self::error(_ERROR_NOSUCHPLUGIN);
11103                         return;
11104                 }
11105                 
11106                 $aOptions = requestArray('plugoption');
11107                 NucleusPlugin::apply_plugin_options($aOptions);
11108                 
11109                 $data = array(
11110                         'context'       => 'global',
11111                         'plugid'        => $pid
11112                 );
11113                 $manager->notify('PostPluginOptionsUpdate', $data);
11114                 
11115                 self::action_pluginoptions(_PLUGS_OPTIONS_UPDATED);
11116                 return;
11117         }
11118         
11119         /**
11120          * Admin::skineditgeneral()
11121          * 
11122          * @param       integer $skinid
11123          * @param       string  $handler
11124          * @return      string  empty or message if failed
11125          */
11126         static private function skineditgeneral($skinid, $handler='')
11127         {
11128                 global $manager;
11129                 
11130                 $name = postVar('name');
11131                 $desc = postVar('desc');
11132                 $type = postVar('type');
11133                 $inc_mode = postVar('inc_mode');
11134                 $inc_prefix = postVar('inc_prefix');
11135                 
11136                 $skin =& $manager->getSkin($skinid, $handler);
11137                 
11138                 // 1. Some checks
11139                 if ( !isValidSkinName($name) )
11140                 {
11141                         return _ERROR_BADSKINNAME;
11142                 }
11143                 
11144                 if ( ($skin->getName() != $name) && SKIN::exists($name) )
11145                 {
11146                         return _ERROR_DUPSKINNAME;
11147                 }
11148                 
11149                 if ( !$type )
11150                 {
11151                         $type = 'text/html';
11152                 }
11153                 
11154                 if ( !$inc_mode )
11155                 {
11156                         $inc_mode = 'normal';
11157                 }
11158                 
11159                 // 2. Update description
11160                 $skin->updateGeneralInfo($name, $desc, $type, $inc_mode, $inc_prefix);
11161                 
11162                 return '';
11163         }
11164         /**
11165          * Admin::skindeleteconfirm()
11166          * 
11167          * @param       integer $skinid
11168          * @return      void
11169          */
11170         static private function skindeleteconfirm($skinid)
11171         {
11172                 global $manager;
11173                 
11174                 if ( !in_array(self::$action, self::$adminskin_actions) )
11175                 {
11176                         $event_identifier = 'Skin';
11177                 }
11178                 else
11179                 {
11180                         $event_identifier = 'AdminSkin';
11181                 }
11182
11183                 $data = array('skinid' => $skinid);
11184                 $manager->notify("PreDelete{$event_identifier}", $data);
11185                 
11186                 // 1. delete description
11187                 $query = "DELETE FROM %s WHERE sdnumber=%d;";
11188                 $query = sprintf($query, sql_table('skin_desc'), (integer) $skinid);
11189                 DB::execute($query);
11190                 
11191                 // 2. delete parts
11192                 $query = "DELETE FROM %s WHERE sdesc=%d;";
11193                 $query = sprintf($query, sql_table('skin'), (integer) $skinid);
11194                 DB::execute($query);
11195                 
11196                 $manager->notify("PostDelete{$event_identifier}", $data);
11197                 
11198                 return;
11199         }
11200         
11201         /**
11202          * Admin::skinremovetypeconfirm()
11203          * 
11204          * @param       integer $skinid
11205          * @param       string  $skintype
11206          * @return      string  empty or message if failed
11207          */
11208         static private function skinremovetypeconfirm($skinid, $skintype)
11209         {
11210                 global $manager;
11211                 
11212 <<<<<<< HEAD
11213                 /* get current registered plugin option list in this context even if it's not used */
11214                 $query = 'SELECT * FROM %s AS plugins, %s AS options LEFT OUTER JOIN %s AS added '
11215                        . 'ON ( options.oid=added.oid ) '
11216                        . 'WHERE plugins.pid=options.opid AND options.ocontext=%s AND added.ocontextid=%d '
11217                        . 'ORDER BY options.oid ASC';
11218                 $query = sprintf($query, sql_table('plugin'), sql_table('plugin_option_desc'), sql_table('plugin_option'), DB::quoteValue($context), intval($contextid));
11219                 
11220                 $res = DB::getResult($query);
11221                 
11222                 $options = array();
11223                 foreach ( $res as $row )
11224                 {
11225                         /* NOTE: to include translation file */
11226                         $manager->getPlugin($row['pfile']);
11227                         
11228                         $options[] = array(
11229                                 'pid'           => $row['pid'],
11230                                 'pfile'         => $row['pfile'],
11231                                 'oid'           => $row['oid'],
11232                                 'value'         => ( !$row['ovalue'] ) ? $row['odef'] : $row['ovalue'],
11233                                 'name'          => $row['oname'],
11234                                 'description' => $row['odesc'],
11235                                 'type'          => $row['otype'],
11236                                 'typeinfo'      => $row['oextra'],
11237                                 'contextid'     => $contextid,
11238                                 'extra'         => ''
11239                         );
11240                 }
11241                 
11242                 $manager->notify('PrePluginOptionsEdit',array('context' => $context, 'contextid' => $contextid, 'options'=>&$options));
11243                 
11244                 $iPrevPid = -1;
11245                 foreach ( $options as $option)
11246                 {
11247                         // new plugin?
11248                         if ( $iPrevPid != $option['pid'] )
11249                         {
11250                                 $iPrevPid = $option['pid'];
11251                                 if ( !defined('_PLUGIN_OPTIONS_TITLE') )
11252                                 {
11253                                         define('_PLUGIN_OPTIONS_TITLE', 'Options for %s');
11254                                 }
11255                                 echo "<tr>\n";
11256                                 echo '<th colspan="2">' . sprintf(_PLUGIN_OPTIONS_TITLE, Entity::hsc($option['pfile'])) . "</th>\n";
11257                                 echo "</tr>\n";
11258                         }
11259                         
11260                         $meta = NucleusPlugin::getOptionMeta($option['typeinfo']);
11261                         if ( @$meta['access'] != 'hidden' )
11262                         {
11263                                 echo '<tr>';
11264                                 listplug_plugOptionRow($option);
11265                                 echo '</tr>';
11266 =======
11267                 if ( !in_array(self::$action, self::$adminskin_actions) )
11268                 {
11269                         $event_identifier = 'Skin';
11270                 }
11271                 else
11272                 {
11273                         $event_identifier = 'AdminSkin';
11274                 }
11275                 
11276                 if ( !isValidShortName($skintype) )
11277                 {
11278                         return _ERROR_SKIN_PARTS_SPECIAL_DELETE;
11279                 }
11280                 
11281                 $data = array(
11282                         'skinid'        => $skinid,
11283                         'skintype'      => $skintype
11284                 );
11285                 $manager->notify("PreDelete{$event_identifier}Part", $data);
11286                 
11287                 // delete part
11288                 $query = 'DELETE FROM %s WHERE sdesc = %d AND stype = %s;';
11289                 $query = sprintf($query, sql_table('skin'), (integer) $skinid, DB::quoteValue($skintype) );
11290                 DB::execute($query);
11291                 
11292                 $data = array(
11293                         'skinid'        => $skinid,
11294                         'skintype'      => $skintype
11295                 );
11296                 $manager->notify("PostDelete{$event_identifier}Part", $data);
11297                 
11298                 return '';
11299         }
11300         
11301         /**
11302          * Admin::skinclone()
11303          * 
11304          * @param       integer $skinid
11305          * @param       string  $handler
11306          * @return      void
11307          */
11308         static private function skinclone($skinid, $handler='')
11309         {
11310                 global $manager;
11311                 
11312                 // 1. read skin to clone
11313                 $skin =& $manager->getSkin($skinid, $handler);
11314                 $name = "{$skin->getName()}_clone";
11315                 
11316                 // if a skin with that name already exists:
11317                 if ( Skin::exists($name) )
11318                 {
11319                         $i = 1;
11320                         while ( Skin::exists($name . $i) )
11321                         {
11322                                 $i++;
11323                         }
11324                         $name .= $i;
11325                 }
11326                 
11327                 // 2. create skin desc
11328                 $newid = Skin::createNew(
11329                         $name,
11330                         $skin->getDescription(),
11331                         $skin->getContentType(),
11332                         $skin->getIncludeMode(),
11333                         $skin->getIncludePrefix()
11334                 );
11335                 
11336                 // 3. clone
11337                 $query = "SELECT stype FROM %s WHERE sdesc=%d;";
11338                 $query = sprintf($query, sql_table('skin'), (integer) $skinid);
11339                 
11340                 $res = DB::getResult($query);
11341                 foreach ( $res as $row )
11342                 {
11343                         $content = $skin->getContentFromDB($row['stype']);
11344                         if ( $content )
11345                         {
11346                                 $query = "INSERT INTO %s (sdesc, scontent, stype) VALUES (%d, %s, %s)";
11347                                 $query = sprintf($query, sql_table('skin'), (integer) $newid, DB::quoteValue($content), DB::quoteValue($row['stype']));
11348                                 DB::execute($query);
11349 >>>>>>> skinnable-master
11350                         }
11351                 }
11352                 return;
11353         }
11354         
11355         /**
11356          * Admin::skinieimport()
11357          * 
11358          * @param       string  $mode
11359          * @param       string  $skinFileRaw
11360          * @return      string  empty or message if failed
11361          */
11362         static private function skinieimport($mode, $skinFileRaw)
11363         {
11364                 global $DIR_LIBS, $DIR_SKINS;
11365                 
11366                 // load skinie class
11367                 include_once($DIR_LIBS . 'skinie.php');
11368                 
11369                 $importer = new SkinImport();
11370                 
11371                 // get full filename
11372                 if ( $mode == 'file' )
11373                 {
11374                         $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';
11375                 }
11376                 else
11377                 {
11378                         $skinFile = $skinFileRaw;
11379                 }
11380                 
11381                 // read only metadata
11382                 $error = $importer->readFile($skinFile, 1);
11383                 if ( $error )
11384                 {
11385                         unset($importer);
11386                         return $error;
11387                 }
11388                 
11389                 self::$contents['mode']         = $mode;
11390                 self::$contents['skinfile']     = $skinFileRaw;
11391                 self::$contents['skininfo']     = $importer->getInfo();
11392                 self::$contents['skinnames']    = $importer->getSkinNames();
11393                 self::$contents['tpltnames']    = $importer->getTemplateNames();
11394                 
11395                 // clashes
11396                 $skinNameClashes                = $importer->checkSkinNameClashes();
11397                 $templateNameClashes    = $importer->checkTemplateNameClashes();
11398                 $hasNameClashes                 = (count($skinNameClashes) > 0) || (count($templateNameClashes) > 0);
11399                 
11400                 self::$contents['skinclashes'] = $skinNameClashes;
11401                 self::$contents['tpltclashes'] = $templateNameClashes;
11402                 self::$contents['nameclashes'] = $hasNameClashes ? 1 : 0;
11403                 
11404                 unset($importer);
11405                 return '';
11406         }
11407         
11408         /**
11409          * Admin::skinieedoimport()
11410          * 
11411          * @param       string  $mode
11412          * @param       string  $skinFileRaw
11413          * @param       boolean $allowOverwrite
11414          * @return      string  empty   or message if failed
11415          */
11416         static private function skiniedoimport($mode, $skinFileRaw, $allowOverwrite)
11417         {
11418                 global $DIR_LIBS, $DIR_SKINS;
11419                 
11420                 // load skinie class
11421                 include_once($DIR_LIBS . 'skinie.php');
11422                 
11423                 $importer = new SkinImport();
11424                 
11425                 // get full filename
11426                 if ( $mode == 'file' )
11427                 {
11428                         $skinFile = $DIR_SKINS . $skinFileRaw . '/skinbackup.xml';
11429                 }
11430                 else
11431                 {
11432                         $skinFile = $skinFileRaw;
11433                 }
11434                 
11435                 $error = $importer->readFile($skinFile);
11436                 if ( $error )
11437                 {
11438                         unset($importer);
11439                         return $error;
11440                 }
11441                 
11442                 $error = $importer->writeToDatabase($allowOverwrite);
11443                 if ( $error )
11444                 {
11445                         unset($importer);
11446                         return $error;
11447                 }
11448                 
11449                 self::$contents['mode']         = $mode;
11450                 self::$contents['skinfile']     = $skinFileRaw;
11451                 self::$contents['skininfo']     = $importer->getInfo();
11452                 self::$contents['skinnames']    = $importer->getSkinNames();
11453                 self::$contents['tpltnames']    = $importer->getTemplateNames();
11454                 
11455                 unset($importer);
11456                 return '';
11457         }
11458         
11459         /**
11460          * Admin::skinieexport()
11461          * 
11462          * @param       array   $aSkins
11463          * @param       array   $aTemplates
11464          * @param       string  $info
11465          * @return      void
11466          */
11467         static private function skinieexport($aSkins, $aTemplates, $info)
11468         {
11469                 global $DIR_LIBS;
11470                 
11471                 // load skinie class
11472                 include_once($DIR_LIBS . 'skinie.php');
11473                 
11474                 if ( !is_array($aSkins) )
11475                 {
11476                         $aSkins = array();
11477                 }
11478                 
11479                 if (!is_array($aTemplates))
11480                 {
11481                         $aTemplates = array();
11482                 }
11483                 
11484                 $skinList = array_keys($aSkins);
11485                 $templateList = array_keys($aTemplates);
11486                 
11487                 $exporter = new SkinExport();
11488                 foreach ( $skinList as $skinId )
11489                 {
11490                         $exporter->addSkin($skinId);
11491                 }
11492                 foreach ( $templateList as $templateId )
11493                 {
11494                         $exporter->addTemplate($templateId);
11495                 }
11496                 $exporter->setInfo($info);
11497                 $exporter->export();
11498                 
11499                 return;
11500         }
11501         
11502         /**
11503          * Admin::action_parseSpecialskin()
11504          * 
11505          * @param       void
11506          * @return      void
11507          */
11508         static private function action_parseSpecialskin()
11509         {
11510                 self::$skin->parse(self::$action);
11511                 return;
11512         }
11513 }