plugins/Newsboy.php
changeset 0 902822492a68
equal deleted inserted replaced
-1:000000000000 0:902822492a68
       
     1 <?php
       
     2 /*
       
     3 Plugin Name: Newsboy
       
     4 Plugin URI: javascript: // No URL yet, stay tuned!
       
     5 Description: Newsboy adds a news management system to Enano. It can integrate with the Feed Me plugin to provide an additional RSS feed. 
       
     6 Author: Dan Fuhry
       
     7 Version: 0.1
       
     8 Author URI: http://www.enanocms.org/
       
     9 */
       
    10 
       
    11 /*
       
    12  * Newsboy
       
    13  * Version 0.1
       
    14  * Copyright (C) 2007 Dan Fuhry
       
    15  *
       
    16  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
       
    17  * as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
       
    18  *
       
    19  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
       
    20  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
       
    21  */
       
    22 
       
    23 // Insert our News namespace
       
    24 $plugins->attachHook('acl_rule_init', 'NewsBoy_namespace_setup($this);');
       
    25 
       
    26 // Hook into page rendering
       
    27 $plugins->attachHook('page_not_found', 'NewsBoy_namespace_handler();');
       
    28 $plugins->attachHook('send_page_footers', 'NewsBoy_PortalLink();');
       
    29 
       
    30 // String to determine page type string
       
    31 $plugins->attachHook('page_type_string_set', 'NewsBoy_set_page_string();');
       
    32 
       
    33 // Attach to the Feed Me plugin, if it's loaded (if not, the feed handler simply won't get called)
       
    34 $plugins->attachHook('feed_me_request', 'NewsBoy_feed_handler($mode);');
       
    35 
       
    36 function NewsBoy_namespace_setup(&$paths)
       
    37 {
       
    38   $paths->create_namespace('NewsBoy', 'News:');
       
    39   $paths->addAdminNode('Newsboy portal', 'Configuration', 'NewsboyConfiguration');
       
    40   $paths->addAdminNode('Newsboy portal', 'Manage news items', 'NewsboyItemManager');
       
    41   
       
    42   global $db, $session, $paths, $template, $plugins; // Common objects
       
    43   
       
    44   $session->acl_extend_scope('read',                   'NewsBoy', $paths);
       
    45   $session->acl_extend_scope('post_comments',          'NewsBoy', $paths);
       
    46   $session->acl_extend_scope('edit_comments',          'NewsBoy', $paths);
       
    47   $session->acl_extend_scope('edit_page',              'NewsBoy', $paths);
       
    48   $session->acl_extend_scope('view_source',            'NewsBoy', $paths);
       
    49   $session->acl_extend_scope('mod_comments',           'NewsBoy', $paths);
       
    50   $session->acl_extend_scope('history_view',           'NewsBoy', $paths);
       
    51   $session->acl_extend_scope('history_rollback',       'NewsBoy', $paths);
       
    52   $session->acl_extend_scope('history_rollback_extra', 'NewsBoy', $paths);
       
    53   $session->acl_extend_scope('protect',                'NewsBoy', $paths);
       
    54   $session->acl_extend_scope('rename',                 'NewsBoy', $paths);
       
    55   $session->acl_extend_scope('clear_logs',             'NewsBoy', $paths);
       
    56   $session->acl_extend_scope('vote_delete',            'NewsBoy', $paths);
       
    57   $session->acl_extend_scope('vote_reset',             'NewsBoy', $paths);
       
    58   $session->acl_extend_scope('delete_page',            'NewsBoy', $paths);
       
    59   $session->acl_extend_scope('set_wiki_mode',          'NewsBoy', $paths);
       
    60   $session->acl_extend_scope('password_set',           'NewsBoy', $paths);
       
    61   $session->acl_extend_scope('password_reset',         'NewsBoy', $paths);
       
    62   $session->acl_extend_scope('mod_misc',               'NewsBoy', $paths);
       
    63   $session->acl_extend_scope('edit_cat',               'NewsBoy', $paths);
       
    64   $session->acl_extend_scope('even_when_protected',    'NewsBoy', $paths);
       
    65   $session->acl_extend_scope('upload_files',           'NewsBoy', $paths);
       
    66   $session->acl_extend_scope('upload_new_version',     'NewsBoy', $paths);
       
    67   $session->acl_extend_scope('create_page',            'NewsBoy', $paths);
       
    68   $session->acl_extend_scope('php_in_pages',           'NewsBoy', $paths);
       
    69   $session->acl_extend_scope('edit_acl',               'NewsBoy', $paths);
       
    70   
       
    71 }
       
    72 
       
    73 function NewsBoy_namespace_handler()
       
    74 {
       
    75   global $db, $session, $paths, $template, $plugins; // Common objects
       
    76   
       
    77   if ( defined('ENANO_FEEDBURNER_INCLUDED') )
       
    78   {
       
    79     $template->add_header('<link rel="alternate" title="'.getConfig('site_name').' News feed" href="'.makeUrlNS('Special', 'RSS/news', null, true).'" type="application/rss+xml" />');
       
    80   }
       
    81   
       
    82   if ( $paths->namespace != 'NewsBoy' )
       
    83     return;
       
    84   
       
    85   $chk = $paths->page;
       
    86   $chk1 = substr($chk, 0, ( strlen($paths->nslist['NewsBoy']) + 8 ));
       
    87   $chk2 = substr($chk, 0, ( strlen($paths->nslist['NewsBoy']) + 7 ));
       
    88   
       
    89   if ( $paths->cpage['urlname_nons'] == 'Portal' || $paths->cpage['urlname_nons'] == 'Archive' || $chk1 == $paths->nslist['NewsBoy'] . 'Archive/' || $chk2 == $paths->nslist['NewsBoy'] . 'Archive' )
       
    90   {
       
    91     
       
    92     // Add admin opener Javascript function
       
    93     $template->add_header('<!-- NewsBoy: admin panel nav function -->
       
    94     <script type="text/javascript">
       
    95       function newsboy_open_admin()
       
    96       {
       
    97         if ( auth_level < USER_LEVEL_ADMIN )
       
    98         {
       
    99           ajaxPromptAdminAuth(function(k) {
       
   100             ENANO_SID = k;
       
   101             auth_level = USER_LEVEL_ADMIN;
       
   102             var loc = String(window.location + \'\');
       
   103             window.location = append_sid(loc);
       
   104             var loc = makeUrlNS(\'Special\', \'Administration\', \'module=\' + namespace_list[\'Admin\'] + \'NewsboyItemManager\');
       
   105             if ( (ENANO_SID + \' \').length > 1 )
       
   106               window.location = loc;
       
   107           }, 9);
       
   108           return false;
       
   109         }
       
   110         var loc = makeUrlNS(\'Special\', \'Administration\', \'module=\' + namespace_list[\'Admin\'] + \'NewsboyItemManager\');
       
   111         window.location = loc;
       
   112       }
       
   113     </script>');
       
   114     
       
   115     $x = getConfig('nb_portal_title');
       
   116     
       
   117     $template->tpl_strings['PAGE_NAME'] = ( $paths->cpage['urlname_nons'] == 'Portal' ) ?
       
   118           ( ( empty($x) ) ?
       
   119               'Welcome to ' . getConfig('site_name') :
       
   120               $x ) :
       
   121           'News Archive';
       
   122     
       
   123     if ( !$session->get_permissions('read') )
       
   124     {
       
   125       die_friendly('Access denied', '<div class="error-box"><b>Access to this page is denied.</b><br />This may be because you are not logged in or you have not met certain criteria for viewing this page.</div>');
       
   126     }
       
   127     
       
   128     $paths->cpage['comments_on'] = 0;
       
   129     
       
   130     $template->header();
       
   131     ( $paths->cpage['urlname_nons'] == 'Portal' ) ? NewsBoy_portal() : NewsBoy_archive();
       
   132     $template->footer();
       
   133   }
       
   134 }
       
   135 
       
   136 function NewsBoy_set_page_string()
       
   137 {
       
   138   global $db, $session, $paths, $template, $plugins; // Common objects
       
   139   if ( $paths->namespace == 'NewsBoy' )
       
   140   {
       
   141     if ( $paths->cpage['urlname_nons'] == 'Portal' )
       
   142     {
       
   143       $template->namespace_string = 'portal';
       
   144       
       
   145       // block editing
       
   146       $perm_arr = Array('edit_page' => AUTH_DENY, 'view_source' => AUTH_DENY);
       
   147       $session->acl_merge_with_current($perm_arr, false, 2);
       
   148     }
       
   149     else
       
   150     {
       
   151       $template->namespace_string = 'news item';
       
   152     }
       
   153   }
       
   154 }
       
   155 
       
   156 function NewsBoy_format_title($title)
       
   157 {
       
   158   $title = strtolower($title);
       
   159   $title = preg_replace('/\W/', '-', $title);
       
   160   $title = preg_replace('/([-]+)/', '-', $title);
       
   161   $title = trim($title, '-');
       
   162   return $title;
       
   163 }
       
   164 
       
   165 function NewsBoy_feed_handler($mode)
       
   166 {
       
   167   global $db, $session, $paths, $template, $plugins; // Common objects
       
   168   
       
   169   if ( $mode != 'news' )
       
   170     return;
       
   171   
       
   172   $limit = ( $x = $paths->getParam(1) ) ? $x : 20;
       
   173   $limit = intval($limit);
       
   174   if ( $limit > 50 )
       
   175     $limit = 50;
       
   176   
       
   177   $title = getConfig('site_name') . ': Site news';
       
   178   
       
   179   $x = getConfig('nb_portal_title');
       
   180   $desc = ( empty($x) ) ? 'Welcome to ' . getConfig('site_name') : $x;
       
   181   
       
   182   $link = makeUrlComplete('NewsBoy', 'Portal');
       
   183   $generator = 'Enano CMS ' . enano_version() . ' - NewsBoy plugin';
       
   184   $email = getConfig('contact_email');
       
   185   
       
   186   $rss = new RSS($title, $desc, $link, $generator, $email);
       
   187   
       
   188   $sql = 'SELECT p.*, l.time_id, l.author, u.user_level,COUNT(c.comment_id) AS num_comments,t.page_text FROM '.table_prefix.'pages AS p
       
   189          LEFT JOIN '.table_prefix.'comments AS c
       
   190            ON ( c.page_id=p.urlname AND c.namespace=p.namespace )
       
   191          LEFT JOIN '.table_prefix.'logs AS l
       
   192            ON ( l.page_id=p.urlname AND l.namespace=p.namespace )
       
   193          LEFT JOIN '.table_prefix.'users AS u
       
   194            ON ( u.username=l.author )
       
   195          LEFT JOIN '.table_prefix.'page_text AS t
       
   196            ON ( t.page_id=p.urlname AND t.namespace=p.namespace )
       
   197          WHERE p.namespace=\'NewsBoy\'
       
   198            AND l.action=\'create\'
       
   199            AND p.urlname REGEXP \'^([0-9]+)$\'
       
   200            AND p.visible=1
       
   201          GROUP BY p.urlname
       
   202          ORDER BY urlname DESC
       
   203          LIMIT '.$limit.';';
       
   204   
       
   205   $q = $db->sql_unbuffered_query($sql);
       
   206   
       
   207   if ( !$q )
       
   208     $db->_die();
       
   209   
       
   210   $formatter = new NewsBoyFormatter();
       
   211   
       
   212   if ( $row = $db->fetchrow() )
       
   213   {
       
   214     do {
       
   215       
       
   216       $title = $row['name'];
       
   217       $link = makeUrlComplete('NewsBoy', $row['urlname']);
       
   218       $desc = RenderMan::render($row['page_text']);
       
   219       $time = intval($row['urlname']);
       
   220       
       
   221       $rss->add_item($title, $link, $desc, $time);
       
   222       
       
   223     } while ( $row = $db->fetchrow() );
       
   224   }
       
   225   else
       
   226   {
       
   227     $rss->add_item('Error', $link, 'No news items yet.', time());
       
   228   }
       
   229   
       
   230   echo $rss->render();
       
   231   
       
   232 }
       
   233 
       
   234 function NewsBoy_portal()
       
   235 {
       
   236   global $db, $session, $paths, $template, $plugins; // Common objects
       
   237   
       
   238   $news_template = <<<TPLCODE
       
   239   <div class="tblholder news">
       
   240     <table border="0" cellspacing="1" cellpadding="4" style="width: 100%;">
       
   241       <tr>
       
   242         <th><a href="{LINK}" style="color: inherit;">{TITLE}</a></th>
       
   243       </tr>
       
   244       <tr>
       
   245         <td class="row3">
       
   246           {CONTENT}
       
   247         </td>
       
   248       </tr>
       
   249       <tr>
       
   250         <th class="subhead" style="font-weight: normal; font-size: 67%;">
       
   251           Posted by {USER_LINK} on {DATE}<br />
       
   252           [ {NUM_COMMENTS} comment{COMMENT_S} | {COMMENT_LINK} ]
       
   253         </th>
       
   254       </tr>
       
   255     </table>
       
   256   </div>
       
   257 TPLCODE;
       
   258   
       
   259   /*
       
   260   $p = RenderMan::strToPageID(getConfig('main_page'));
       
   261   if ( $p[1] != 'NewsBoy' )
       
   262   {
       
   263     echo RenderMan::getPage($p[0], $p[1]);
       
   264   }
       
   265   else
       
   266   { */
       
   267     /*
       
   268     $s = $paths->nslist['NewsBoy'] . 'Announce';
       
   269     if ( isPage($s) )
       
   270     {
       
   271       $p = RenderMan::getPage('Announce', 'NewsBoy');
       
   272       echo $p;
       
   273     }
       
   274   /* } */
       
   275   
       
   276   $s = $paths->nslist['NewsBoy'] . 'Announce';
       
   277   $announce_page = getConfig('nb_announce_page');
       
   278   if ( !empty($announce_page) && isPage($announce_page) )
       
   279   {
       
   280     $s = $announce_page;
       
   281   }
       
   282   else if ( !isPage($s) )
       
   283   {
       
   284     $s = false;
       
   285   }
       
   286   if ( $s )
       
   287   {
       
   288     $stuff = RenderMan::strToPageID($s);
       
   289     $p = RenderMan::getPage($stuff[0], $stuff[1]);
       
   290     echo $p;
       
   291   }
       
   292   
       
   293   echo '<h2>Latest news</h2>';
       
   294     
       
   295   $q = $db->sql_unbuffered_query('SELECT p.*, COUNT(c.comment_id) AS num_comments, t.page_text, l.time_id, l.author, u.user_level FROM '.table_prefix.'pages AS p
       
   296          LEFT JOIN '.table_prefix.'comments AS c
       
   297            ON ( c.page_id=p.urlname AND c.namespace=p.namespace )
       
   298          LEFT JOIN '.table_prefix.'page_text AS t
       
   299            ON ( t.page_id=p.urlname AND t.namespace=p.namespace )
       
   300          LEFT JOIN '.table_prefix.'logs AS l
       
   301            ON ( l.page_id=p.urlname AND l.namespace=p.namespace )
       
   302          LEFT JOIN '.table_prefix.'users AS u
       
   303            ON ( u.username=l.author OR u.user_id=1 )
       
   304          WHERE p.namespace=\'NewsBoy\'
       
   305            AND l.action=\'create\'
       
   306            AND p.urlname!=\'Announce\'
       
   307            AND p.visible=1
       
   308          GROUP BY p.urlname
       
   309          ORDER BY urlname DESC;');
       
   310   if ( !$q )
       
   311     $db->_die();
       
   312   
       
   313   if ( $row = $db->fetchrow() )
       
   314   {
       
   315     $i = 0;
       
   316     $parser = $template->makeParserText($news_template);
       
   317     do
       
   318     {
       
   319       if ( $i < 5 )
       
   320       {
       
   321         $title = htmlspecialchars($row['name']);
       
   322         $content = RenderMan::render($row['page_text']);
       
   323         if ( strlen($content) > 400 )
       
   324         {
       
   325           $content = nb_trim_paragraph($content, 400, $trimmed);
       
   326         }
       
   327         if ( $trimmed )
       
   328         {
       
   329           $content .= ' <a href="' . makeUrlNS('NewsBoy', $row['urlname'], false, true) . '">Read more...</a>';
       
   330         }
       
   331         $user_link = nb_make_username_link($row['author'], $row['user_level']);
       
   332         $date = date('F d, Y h:i:s a', $row['urlname']);
       
   333         $num_comments = $row['num_comments'];
       
   334         $comment_s = ( $num_comments == 1 ) ? '' : 's';
       
   335         $comment_link = '<a href="' . makeUrlNS('NewsBoy', $row['urlname'], false, true) . '#do:comments" style="color: inherit;">add a comment</a>';
       
   336         $parser->assign_vars(array(
       
   337             'TITLE' => $title,
       
   338             'LINK' => makeUrlNS('NewsBoy', $row['urlname']),
       
   339             'CONTENT' => $content,
       
   340             'USER_LINK' => $user_link,
       
   341             'DATE' => $date,
       
   342             'NUM_COMMENTS' => $num_comments,
       
   343             'COMMENT_S' => $comment_s,
       
   344             'COMMENT_LINK' => $comment_link
       
   345           ));
       
   346         echo $parser->run();
       
   347       }
       
   348       else
       
   349       {
       
   350         echo '<p><a href="'.makeUrlNS('NewsBoy', 'Archive').'">Older news...</a></p>';
       
   351         break;
       
   352       }
       
   353       $i++;
       
   354     } while ( $row = $db->fetchrow() );
       
   355   }
       
   356   else
       
   357   {
       
   358     echo '<p>No news items yet.</p>';
       
   359   }
       
   360   if ( $session->user_level >= USER_LEVEL_ADMIN )
       
   361   {
       
   362     echo '<div class="tblholder" style="margin: 10px auto 0 auto; display: table;">
       
   363             <table border="0" cellspacing="1" cellpadding="4">
       
   364               <tr>
       
   365                 <th>Administrative tools:</th>
       
   366                 <td class="row3" style="text-align: center;"><a style="color: inherit;" href="' . makeUrlNS('NewsBoy', 'Announce', '', true) . '#do:edit">Edit announcement &raquo;</a></td>
       
   367                 <td class="row3" style="text-align: center;"><a style="color: inherit;" href="' . makeUrlNS('Special', 'Administration', 'module='.$paths->nslist['Admin'].'NewsboyItemManager', true) . '" onclick="newsboy_open_admin(); return false;">Portal Administration</a></td>
       
   368               </tr>
       
   369             </table>
       
   370           </div><br />';
       
   371   }
       
   372 }
       
   373 
       
   374 /**
       
   375  * Formats row data in the archive.
       
   376  * @package Enano
       
   377  * @subpackage Newsboy
       
   378  * @license GNU General Public License
       
   379  */
       
   380 
       
   381 class NewsBoyFormatter
       
   382 {
       
   383   function article_link($name, $row)
       
   384   {
       
   385     $article_link = '<a href="' . makeUrlNS('NewsBoy', $row['urlname']) . '">' . $row['name'] . '</a>';
       
   386     return $article_link;
       
   387   }
       
   388   function format_date($date, $row)
       
   389   {
       
   390     $date = date('Y-m-j g:m', intval ( $date ));
       
   391     return $date;
       
   392   }
       
   393   function format_username($x, $row)
       
   394   {
       
   395     $ul = intval($row['user_level']);
       
   396     $author = nb_make_username_link($row['author'], $ul);
       
   397     return $author;
       
   398   }
       
   399   function format_commentlink($x, $row)
       
   400   {
       
   401     $comments = '<a href="' . makeUrlNS('NewsBoy', $row['urlname']) . '#do:comments">' . $row['num_comments'] . '</a>';
       
   402     return $comments;
       
   403   }
       
   404 }
       
   405 
       
   406 function NewsBoy_archive()
       
   407 {
       
   408   global $db, $session, $paths, $template, $plugins; // Common objects
       
   409   
       
   410   $lower_limit = ( isset($_GET['start']) ) ? intval($_GET['start']) : ( ( $xx = $paths->getParam(0) ) ? intval($xx) : 0 );
       
   411   $entries_per_page = 50;
       
   412   
       
   413   $row_count = $entries_per_page + 1;
       
   414   
       
   415   // Determine number of total news entries
       
   416   $q = $db->sql_query('SELECT urlname FROM '.table_prefix.'pages WHERE namespace=\'NewsBoy\' AND urlname REGEXP \'^([0-9]+)$\' AND visible=1;');
       
   417   if ( !$q )
       
   418     $db->_die();
       
   419   $r = $db->fetchrow();
       
   420   $num_total = intval($db->numrows());
       
   421   $db->free_result();
       
   422   
       
   423   if ( $lower_limit >= $num_total )
       
   424     $lower_limit = 0;
       
   425   
       
   426   $sql = 'SELECT p.*, l.time_id, l.author, u.user_level,COUNT(c.comment_id) AS num_comments FROM '.table_prefix.'pages AS p
       
   427          LEFT JOIN '.table_prefix.'comments AS c
       
   428            ON ( c.page_id=p.urlname AND c.namespace=p.namespace )
       
   429          LEFT JOIN '.table_prefix.'logs AS l
       
   430            ON ( l.page_id=p.urlname AND l.namespace=p.namespace )
       
   431          LEFT JOIN '.table_prefix.'users AS u
       
   432            ON ( u.username=l.author )
       
   433          WHERE p.namespace=\'NewsBoy\'
       
   434            AND l.action=\'create\'
       
   435            AND p.urlname REGEXP \'^([0-9]+)$\'
       
   436            AND p.visible=1
       
   437          GROUP BY p.urlname
       
   438          ORDER BY urlname DESC;';
       
   439   
       
   440   $q = $db->sql_unbuffered_query($sql);
       
   441   
       
   442   if ( !$q )
       
   443     $db->_die();
       
   444   
       
   445   $formatter = new NewsBoyFormatter();
       
   446   
       
   447   $callers = Array(
       
   448       'name' => Array($formatter, 'article_link'),
       
   449       'urlname' => Array($formatter, 'format_date'),
       
   450       'author' => Array($formatter, 'format_username'),
       
   451       'num_comments' => Array($formatter, 'format_commentlink')
       
   452     );
       
   453   
       
   454   $head = '<div class="tblholder">
       
   455           <table border="0" cellspacing="1" cellpadding="4">
       
   456             <tr>
       
   457               <th>Article</th><th>Date</th><th>Author</th><th>Comments</th>
       
   458             </tr>';
       
   459   $foot = "</table></div>";
       
   460   
       
   461   $content = paginate($q, "\n".'<tr><td class="{_css_class}">{name}</td><td class="{_css_class}">{urlname}</td><td class="{_css_class}">{author}</td><td class="{_css_class}">{num_comments}</td></tr>',
       
   462                       $num_total, makeUrlNS('NewsBoy', 'Archive/%s'), $lower_limit, 20, $callers, $head, $foot);
       
   463   echo $content;  
       
   464   
       
   465   $code = $plugins->setHook('send_page_footers');
       
   466   foreach ( $code as $cmd )
       
   467   {
       
   468     eval($cmd);
       
   469   }
       
   470   
       
   471 }
       
   472 
       
   473 function nb_make_username_link($username, $user_level)
       
   474 {
       
   475   $color = '#0000AA';
       
   476   $user_level = intval($user_level);
       
   477   if ( $user_level < USER_LEVEL_MEMBER ) return $username;
       
   478   if ( $user_level >= USER_LEVEL_MOD ) $color = '#00AA00';
       
   479   if ( $user_level >= USER_LEVEL_ADMIN ) $color = '#AA0000';
       
   480   $link = '<a style="color: ' . $color . '" href="' . makeUrlNS('User', str_replace(' ', '_', $username) ) . '">' . $username . '</a>';
       
   481   return $link;
       
   482 }
       
   483 
       
   484 function NewsBoy_PortalLink()
       
   485 {
       
   486   global $db, $session, $paths, $template, $plugins; // Common objects
       
   487   if ( $paths->namespace == 'NewsBoy' )
       
   488     echo '<div class="tblholder"><table border="0" style="width: 100%;" cellspacing="1" cellpadding="4"><tr><th><a style="color: inherit;" href="' . makeUrlNS('NewsBoy', 'Portal') . '">&laquo; Return to News Portal</a></th></tr></table></div><br />';
       
   489 }
       
   490 
       
   491 // Administration panel
       
   492 function page_Admin_NewsboyItemManager()
       
   493 {
       
   494   global $db, $session, $paths, $template, $plugins; if($session->auth_level < USER_LEVEL_ADMIN || $session->user_level < USER_LEVEL_ADMIN) { redirect(makeUrlNS('Special', 'Administration', 'noheaders', true), '', '', 0); die('Hacking attempt'); }
       
   495   
       
   496   $done = false;
       
   497   
       
   498   if ( isset( $_GET['act'] ) )
       
   499   {
       
   500     switch ( $_GET['act'] )
       
   501     {
       
   502       case 'edit':
       
   503         
       
   504         // Error list
       
   505         $errors = Array();
       
   506         
       
   507         if ( isset ( $_POST['submitting'] ) )
       
   508         {
       
   509           // Generate timestamp
       
   510           $year = intval($_POST['pub_year']);
       
   511           $month = intval($_POST['pub_month']);
       
   512           $day = intval($_POST['pub_day']);
       
   513           $hour = intval($_POST['pub_hour']);
       
   514           $minute = intval($_POST['pub_minute']);
       
   515           $second = intval($_POST['pub_second']);
       
   516           
       
   517           // Validation
       
   518           if ( $year < 1500 || $year > 10000 )
       
   519             $errors[] = 'Invalid year.';
       
   520           
       
   521           if ( $month < 1 || $month > 12 )
       
   522             $errors[] = 'Invalid month.';
       
   523           
       
   524           if ( $day < 1 || $day > 31 )
       
   525             $errors[] = 'Invalid day.';
       
   526           
       
   527           if ( $hour < 0 || $hour > 23 )
       
   528             $errors[] = 'Invalid hour.';
       
   529           
       
   530           if ( $minute < 0 || $minute > 60 )
       
   531             $errors[] = 'Invalid minute.';
       
   532           
       
   533           if ( $second < 0 || $second > 60 )
       
   534             $errors[] = 'Invalid second.';
       
   535           
       
   536           $name = $_POST['article_name'];
       
   537           $name = $db->escape($name);
       
   538           
       
   539           $author = $_POST['author'];
       
   540           $author = $db->escape($author);
       
   541           
       
   542           if ( count($errors) < 1 )
       
   543           {
       
   544             $time = mktime($hour, $minute, $second, $month, $day, $year);
       
   545           }
       
   546           
       
   547           if ( isset($paths->pages[ $paths->nslist['NewsBoy'] . $time ]) && $paths->pages[ $paths->nslist['NewsBoy'] . $time ] != $paths->pages[ $paths->nslist['NewsBoy'] . $_POST['page_id'] ] )
       
   548             $errors[] = 'You cannot have two news articles with the same publish time.';
       
   549           
       
   550           if ( count($errors) < 1 )
       
   551           {
       
   552             $publ = ( isset($_POST['published']) ) ? '1' : '0';
       
   553             $sql = 'UPDATE '.table_prefix.'pages SET name=\'' . $name . '\',visible='.$publ.',urlname=\''.$time.'\' WHERE urlname=\'' . $db->escape($_POST['page_id']) . '\' AND namespace=\'NewsBoy\';';
       
   554             $q = $db->sql_query($sql);
       
   555             
       
   556             if ( !$q )
       
   557               $db->_die();
       
   558             
       
   559             // Update author
       
   560             $q = $db->sql_query('UPDATE '.table_prefix.'logs SET author=\'' . $author . '\' WHERE page_id=\'' . $db->escape($_POST['page_id']) . '\' AND namespace=\'NewsBoy\' AND action=\'create\';');
       
   561             
       
   562             if ( !$q )
       
   563               $db->_die();
       
   564             
       
   565             // Update other tables with urlname info
       
   566             $q = $db->sql_query('UPDATE '.table_prefix.'logs SET page_id=\'' . $time . '\' WHERE page_id=\'' . $db->escape($_POST['page_id']) . '\' AND namespace=\'NewsBoy\';');
       
   567             if ( !$q )
       
   568               $db->_die();
       
   569             
       
   570             $q = $db->sql_query('UPDATE '.table_prefix.'comments SET page_id=\'' . $time . '\' WHERE page_id=\'' . $db->escape($_POST['page_id']) . '\' AND namespace=\'NewsBoy\';');
       
   571             if ( !$q )
       
   572               $db->_die();
       
   573             
       
   574             $q = $db->sql_query('UPDATE '.table_prefix.'page_text SET page_id=\'' . $time . '\' WHERE page_id=\'' . $db->escape($_POST['page_id']) . '\' AND namespace=\'NewsBoy\';');
       
   575             if ( !$q )
       
   576               $db->_die();
       
   577             
       
   578             $q = $db->sql_query('UPDATE '.table_prefix.'categories SET page_id=\'' . $time . '\' WHERE page_id=\'' . $db->escape($_POST['page_id']) . '\' AND namespace=\'NewsBoy\';');
       
   579             if ( !$q )
       
   580               $db->_die();
       
   581             
       
   582             echo '<div class="info-box">Your changes have been saved.</div>';
       
   583             
       
   584             break;
       
   585           }
       
   586         }
       
   587         
       
   588         if ( count($errors) > 0 )
       
   589           echo '<div class="warning-box">Errors encountered while saving data:<ul><li>' . implode('</li><li>', $errors) . '</li></ul></div>';
       
   590         
       
   591         // Obtain page information
       
   592         if ( !isset($paths->pages[ $paths->nslist['NewsBoy'] . $_GET['id'] ]) )
       
   593         {
       
   594           echo 'Invalid ID';
       
   595           return false;
       
   596         }
       
   597         $page_info =& $paths->pages[ $paths->nslist['NewsBoy'] . $_GET['id'] ];
       
   598         $time = intval($page_info['urlname_nons']);
       
   599         
       
   600         // Get author
       
   601         $q = $db->sql_query('SELECT author FROM '.table_prefix.'logs WHERE page_id=\'' . $db->escape($page_info['urlname_nons']) . '\' AND namespace=\'NewsBoy\' AND action=\'create\' ORDER BY time_id DESC LIMIT 1;');
       
   602         
       
   603         if ( !$q )
       
   604           $db->_die();
       
   605         
       
   606         $row = $db->fetchrow();
       
   607         $author = ( isset($row['author']) ) ? $row['author'] : '';
       
   608         if ( empty($author) )
       
   609           $author = 'Anonymous';
       
   610         
       
   611         // Set date & time
       
   612         $month  = date('n', $time);
       
   613         $year   = date('Y', $time);
       
   614         $day    = date('j', $time);
       
   615         $hour   = date('G', $time);
       
   616         $minute = date('m', $time);
       
   617         $second = date('s', $time);
       
   618         
       
   619         echo '<form id="nb_edit_form" action="'.makeUrlNS('Special', 'Administration', (( isset($_GET['sqldbg'])) ? 'sqldbg&amp;' : '') .'module='.$paths->cpage['module'] . '&act=edit').'" method="post" onsubmit="if ( !submitAuthorized ) return false;">';
       
   620         echo '<div class="tblholder">
       
   621                 <table border="0" cellspacing="1" cellpadding="4">
       
   622                   <tr>
       
   623                     <th colspan="2">Editing news article</th>
       
   624                   </tr>
       
   625                   <tr>
       
   626                     <td class="row1">Article name:</td><td class="row2"><input name="article_name" value="' . htmlspecialchars($page_info['name']) . '" /></td>
       
   627                   </tr>
       
   628                   <tr>
       
   629                     <td class="row1">Published date:</td>
       
   630                     <td class="row2">
       
   631                       <input name="pub_year" type="text" size="5" value="'.$year.'" />-<select name="pub_month">';
       
   632        for ( $i = 1; $i <= 12; $i++ )
       
   633        {
       
   634          $m = "[$i] ";
       
   635          switch ( $i )
       
   636          {
       
   637            case 1:  $m .= 'January'; break;
       
   638            case 2:  $m .= 'February'; break;
       
   639            case 3:  $m .= 'March'; break;
       
   640            case 4:  $m .= 'April'; break;
       
   641            case 5:  $m .= 'May'; break;
       
   642            case 6:  $m .= 'June'; break;
       
   643            case 7:  $m .= 'July'; break;
       
   644            case 8:  $m .= 'August'; break;
       
   645            case 9:  $m .= 'September'; break;
       
   646            case 10: $m .= 'October'; break;
       
   647            case 11: $m .= 'November'; break;
       
   648            case 12: $m .= 'December'; break;
       
   649            default: $m .= 'Fuhrober'; break;
       
   650          }
       
   651          if ( $month == $i )
       
   652            echo '         <option selected="selected" value="' . $i . '">'.$m.'</option>';
       
   653          else
       
   654            echo '         <option value="' . $i . '">'.$m.'</option>';
       
   655        }
       
   656        echo '         </select>
       
   657                       <input name="pub_day" type="text" size="3" value="' . $day . '" />, time:
       
   658                       <input name="pub_hour" type="text" size="3" value="' . $hour . '" />&nbsp;:&nbsp;<input name="pub_minute" type="text" size="3" value="' . $minute . '" />&nbsp;:&nbsp;<input name="pub_second" type="text" size="3" value="' . $second . '" /><br />
       
   659                       <small>Note: Hours are in 24-hour format.</small>
       
   660                     </td>
       
   661                   </tr>
       
   662                   <!-- Inline developer blog, episode 1:
       
   663                        Right about the time I got here, I started sneezing like crazy. Must have caught it Friday night. Great... now
       
   664                        my life is officially stuck on pause for the next 3 days. I\'d swear here but (a) Mommy taught me better, and
       
   665                        (b) I wouldn\'t want to offend you hackers. (j/k)
       
   666                        
       
   667                        Oh crap. And no, I don\'t give towels with my showers.
       
   668                        
       
   669                        -Dan
       
   670                        -->
       
   671                   <tr>
       
   672                     <td class="row1">Publish article:</td><td class="row2"><label><input name="published" type="checkbox" ' . ( $page_info['visible'] == 1 ? 'checked="checked"' : '' ) . ' /> Article is published (shown to the public)</label></td>
       
   673                   </tr>
       
   674                   <tr>
       
   675                     <td class="row1">Article author:</td><td class="row2">' . $template->username_field('author', $author) . '</td></tr>
       
   676                   </tr>
       
   677                   <tr>
       
   678                     <td class="row3" style="text-align: center;" colspan="2">
       
   679                       <a href="#" onclick="var frm = document.getElementById(\'nb_edit_form\'); frm.submit(); return false;">Save changes</a>&nbsp;&nbsp;<a href="#" onclick="ajaxPage(\'' . $paths->cpage['module'] . '\');">Return to main menu</a>
       
   680                     </td>
       
   681                   </tr>
       
   682                 </table>
       
   683               </div>
       
   684               <input type="hidden" name="submitting" value="yes" />
       
   685               <input type="hidden" name="page_id" value="' . $_GET['id'] . '" />';
       
   686         echo '</form>';
       
   687         $done = true;
       
   688         break;
       
   689       case 'del':
       
   690         if ( isset( $_POST['confirmed'] ) )
       
   691         {
       
   692           $page_id = $_POST['page_id'];
       
   693           $namespace = 'NewsBoy';
       
   694           
       
   695           $e = $db->sql_query('INSERT INTO '.table_prefix.'logs(time_id,date_string,log_type,action,page_id,namespace,author) VALUES('.time().', \''.date('d M Y h:i a').'\', \'page\', \'delete\', \''.$page_id.'\', \''.$namespace.'\', \''.$session->username.'\')');
       
   696           if(!$e) $db->_die('The page log entry could not be inserted.');
       
   697           $e = $db->sql_query('DELETE FROM '.table_prefix.'categories WHERE page_id=\''.$page_id.'\' AND namespace=\''.$namespace.'\'');
       
   698           if(!$e) $db->_die('The page categorization entries could not be deleted.');
       
   699           $e = $db->sql_query('DELETE FROM '.table_prefix.'comments WHERE page_id=\''.$page_id.'\' AND namespace=\''.$namespace.'\'');
       
   700           if(!$e) $db->_die('The page comments could not be deleted.');
       
   701           $e = $db->sql_query('DELETE FROM '.table_prefix.'page_text WHERE page_id=\''.$page_id.'\' AND namespace=\''.$namespace.'\'');
       
   702           if(!$e) $db->_die('The page text entry could not be deleted.');
       
   703           $e = $db->sql_query('DELETE FROM '.table_prefix.'pages WHERE urlname=\''.$page_id.'\' AND namespace=\''.$namespace.'\'');
       
   704           if(!$e) $db->_die('The page entry could not be deleted.');
       
   705           $e = $db->sql_query('DELETE FROM '.table_prefix.'files WHERE page_id=\''.$page_id.'\'');
       
   706           if(!$e) $db->_die('The file entry could not be deleted.');
       
   707           
       
   708           $result = 'This page has been deleted. Note that there is still a log of edits and actions in the database, and anyone with admin rights can raise this page from the dead unless the log is cleared. If the deleted file is an image, there may still be cached thumbnails of it in the cache/ directory, which is inaccessible to users.';
       
   709           
       
   710           echo $result . '<br />
       
   711                <br />
       
   712                <a href="#" onclick="ajaxPage(\'' . $paths->cpage['module'] . '\');">Return to Newsboy</a>';
       
   713         }
       
   714         else
       
   715         {
       
   716           echo '<form id="nb_delete_form" action="'.makeUrlNS('Special', 'Administration', (( isset($_GET['sqldbg'])) ? 'sqldbg&amp;' : '') .'module='.$paths->cpage['module'] . '&act=del').'" method="post">';
       
   717           echo '<div class="tblholder">
       
   718                   <table border="0" cellspacing="1" cellpadding="4">
       
   719                     <tr>
       
   720                       <th>Confirm deletion</th>
       
   721                      </tr>
       
   722                      <tr>
       
   723                        <td class="row1" style="text-align: center;">
       
   724                          <p>Are you sure you want to delete this news article?</p>
       
   725                        </td>
       
   726                      </tr>
       
   727                      <tr>
       
   728                        <td class="row3" style="text-align: center;">
       
   729                          <a href="#" onclick="var frm = document.getElementById(\'nb_delete_form\'); frm.submit(); return false;">Delete</a>&nbsp;&nbsp;<a href="#" onclick="ajaxPage(\'' . $paths->cpage['module'] . '\');">Cancel</a>
       
   730                        </td>
       
   731                      </tr>
       
   732                   </table>
       
   733                 </div>
       
   734                 <input type="hidden" name="confirmed" value="yes" />
       
   735                 <input type="hidden" name="page_id" value="' . intval ( $_GET['id'] ) . '" />';
       
   736           echo '</form>';
       
   737         }
       
   738         $done = true;
       
   739         break;
       
   740       case 'create':
       
   741         
       
   742         // Error list
       
   743         $errors = Array();
       
   744         
       
   745         if ( isset ( $_POST['submitting'] ) )
       
   746         {
       
   747           // Generate timestamp
       
   748           $year = intval($_POST['pub_year']);
       
   749           $month = intval($_POST['pub_month']);
       
   750           $day = intval($_POST['pub_day']);
       
   751           $hour = intval($_POST['pub_hour']);
       
   752           $minute = intval($_POST['pub_minute']);
       
   753           $second = intval($_POST['pub_second']);
       
   754           
       
   755           // Validation
       
   756           if ( $year < 1500 || $year > 10000 )
       
   757             $errors[] = 'Invalid year.';
       
   758           
       
   759           if ( $month < 1 || $month > 12 )
       
   760             $errors[] = 'Invalid month.';
       
   761           
       
   762           if ( $day < 1 || $day > 31 )
       
   763             $errors[] = 'Invalid day.';
       
   764           
       
   765           if ( $hour < 0 || $hour > 23 )
       
   766             $errors[] = 'Invalid hour.';
       
   767           
       
   768           if ( $minute < 0 || $minute > 60 )
       
   769             $errors[] = 'Invalid minute.';
       
   770           
       
   771           if ( $second < 0 || $second > 60 )
       
   772             $errors[] = 'Invalid second.';
       
   773           
       
   774           $name = $_POST['article_name'];
       
   775           $name = $db->escape($name);
       
   776           
       
   777           $author = $_POST['author'];
       
   778           $author = $db->escape($author);
       
   779           
       
   780           if ( count($errors) < 1 )
       
   781           {
       
   782             $time = mktime($hour, $minute, $second, $month, $day, $year);
       
   783           }
       
   784           
       
   785           if ( isset($paths->pages[ $paths->nslist['NewsBoy'] . $time ]) && $paths->pages[ $paths->nslist['NewsBoy'] . $time ] != $paths->pages[ $paths->nslist['NewsBoy'] . $_POST['page_id'] ] )
       
   786             $errors[] = 'You cannot have two news articles with the same publish time.';
       
   787           
       
   788           if ( count($errors) < 1 )
       
   789           {
       
   790             $publ = ( isset($_POST['published']) ) ? 1 : 0;
       
   791             $result = PageUtils::createpage( (string)$time, 'NewsBoy', $name, $publ );
       
   792             
       
   793             // Set content
       
   794             $content = RenderMan::preprocess_text($_POST['content'], true); // this also SQL-escapes it
       
   795             
       
   796             $q = $db->sql_query('UPDATE '.table_prefix.'page_text SET page_text=\'' . $content . '\' WHERE page_id=\'' . $time . '\' AND namespace=\'NewsBoy\';');
       
   797             if ( !$q )
       
   798               $db->_die();
       
   799             
       
   800             if ( $result )
       
   801               echo '<div class="info-box">Your changes have been saved.</div>';
       
   802             else
       
   803               $errors[] = 'PageUtils::createpage returned an error.';
       
   804             
       
   805             break;
       
   806           }
       
   807         }
       
   808         
       
   809         if ( count($errors) > 0 )
       
   810           echo '<div class="warning-box">Errors encountered while preparing data:<ul><li>' . implode('</li><li>', $errors) . '</li></ul></div>';
       
   811         
       
   812         $time = time();;
       
   813         
       
   814         // Get author
       
   815         $author = $session->username;
       
   816         
       
   817         if ( empty($author) )
       
   818           $author = 'Anonymous';
       
   819         
       
   820         // Set date & time
       
   821         $month  = date('n', $time);
       
   822         $year   = date('Y', $time);
       
   823         $day    = date('j', $time);
       
   824         $hour   = date('G', $time);
       
   825         $minute = date('m', $time);
       
   826         $second = date('s', $time);
       
   827         
       
   828         echo '<form id="nb_create_form" action="'.makeUrlNS('Special', 'Administration', (( isset($_GET['sqldbg'])) ? 'sqldbg&amp;' : '') .'module='.$paths->cpage['module'] . '&act=create').'" method="post" onsubmit="if ( !submitAuthorized ) return false;">';
       
   829         echo '<div class="tblholder">
       
   830                 <table border="0" cellspacing="1" cellpadding="4">
       
   831                   <tr>
       
   832                     <th colspan="2">Creating news article</th>
       
   833                   </tr>
       
   834                   <tr>
       
   835                     <td class="row1">Article name:</td><td class="row2"><input name="article_name" value="" /></td>
       
   836                   </tr>
       
   837                   <tr>
       
   838                     <td class="row1">Published datestamp:</td>
       
   839                     <td class="row2">
       
   840                       <input name="pub_year" type="text" size="5" value="'.$year.'" />-<select name="pub_month">';
       
   841        for ( $i = 1; $i <= 12; $i++ )
       
   842        {
       
   843          $m = "[$i] ";
       
   844          switch ( $i )
       
   845          {
       
   846            case 1:  $m .= 'January'; break;
       
   847            case 2:  $m .= 'February'; break;
       
   848            case 3:  $m .= 'March'; break;
       
   849            case 4:  $m .= 'April'; break;
       
   850            case 5:  $m .= 'May'; break;
       
   851            case 6:  $m .= 'June'; break;
       
   852            case 7:  $m .= 'July'; break;
       
   853            case 8:  $m .= 'August'; break;
       
   854            case 9:  $m .= 'September'; break;
       
   855            case 10: $m .= 'October'; break;
       
   856            case 11: $m .= 'November'; break;
       
   857            case 12: $m .= 'December'; break;
       
   858            default: $m .= 'Fuhrober'; break;
       
   859          }
       
   860          if ( $month == $i )
       
   861            echo '         <option selected="selected" value="' . $i . '">'.$m.'</option>';
       
   862          else
       
   863            echo '         <option value="' . $i . '">'.$m.'</option>';
       
   864        }
       
   865        echo '         </select>
       
   866                       <input name="pub_day" type="text" size="3" value="' . $day . '" />, time:
       
   867                       <input name="pub_hour" type="text" size="3" value="' . $hour . '" />&nbsp;:&nbsp;<input name="pub_minute" type="text" size="3" value="' . $minute . '" />&nbsp;:&nbsp;<input name="pub_second" type="text" size="3" value="' . $second . '" /><br />
       
   868                       <small>Note: Hours are in 24-hour format.</small>
       
   869                     </td>
       
   870                   </tr>
       
   871                   <tr>
       
   872                     <td class="row1">Publish article:</td><td class="row2"><label><input name="published" type="checkbox" /> Article is published (shown to the public)</label></td>
       
   873                   </tr>
       
   874                   <tr>
       
   875                     <td class="row1">Article author:</td><td class="row2">' . $template->username_field('author', $author) . '</td></tr>
       
   876                   </tr>
       
   877                   <tr>
       
   878                     <td class="row1">Initial content:<br /><small>You can always edit this later.</small></td><td class="row2"><textarea name="content" rows="15" cols="60" style="width: 100%;"></textarea></td>
       
   879                   </tr>
       
   880                   <tr>
       
   881                     <td class="row3" style="text-align: center;" colspan="2">
       
   882                       <a href="#" onclick="var frm = document.getElementById(\'nb_create_form\'); frm.submit(); return false;">Create article</a>&nbsp;&nbsp;<a href="#" onclick="ajaxPage(\'' . $paths->cpage['module'] . '\');">Return to main menu</a>
       
   883                     </td>
       
   884                   </tr>
       
   885                 </table>
       
   886               </div>
       
   887               <input type="hidden" name="submitting" value="yes" />';
       
   888         echo '</form>';
       
   889         
       
   890         $done = true;
       
   891         break;
       
   892     }
       
   893   }
       
   894   
       
   895   if ( !$done )
       
   896   {
       
   897   
       
   898     // Start output
       
   899     echo '<div class="tblholder">
       
   900       <table border="0" cellspacing="1" cellpadding="4">
       
   901         <tr>
       
   902           <th>Name</th>
       
   903           <th>Date published</th>
       
   904           <th colspan="3">Actions</th>
       
   905         </tr>';
       
   906         
       
   907     $row_class = 'row2';
       
   908     
       
   909     // List existing news entries
       
   910     $q = $db->sql_query('SELECT name,urlname FROM '.table_prefix.'pages WHERE namespace="NewsBoy" AND urlname!="Announce" ORDER BY name ASC;');
       
   911     
       
   912     if ( !$q )
       
   913       $db->_die();
       
   914     
       
   915     if ( $row = $db->fetchrow($q) )
       
   916     {
       
   917       do {
       
   918         $row_class = ( $row_class == 'row1' ) ? 'row2' : 'row1';
       
   919         $ts = intval($row['urlname']);
       
   920         $date = date('F d, Y h:i a', $ts);
       
   921         $edit_url = makeUrlNS('Special', 'Administration', "module={$paths->cpage['module']}&act=edit&id={$row['urlname']}", true);
       
   922         $dele_url = makeUrlNS('Special', 'Administration', "module={$paths->cpage['module']}&act=del&id={$row['urlname']}", true);
       
   923         $page_url = makeUrlNS('NewsBoy', $row['urlname']);
       
   924         echo "<tr>
       
   925                 <td class='$row_class' style='width: 50%;'>
       
   926                   {$row['name']}
       
   927                 </td>
       
   928                 <td class='$row_class' style='width: 40%;'>
       
   929                   $date
       
   930                 </td>
       
   931                 <td class='$row_class'>
       
   932                   <a href='$edit_url'>Settings</a>
       
   933                 </td>
       
   934                 <td class='$row_class'>
       
   935                   <a href='$page_url' onclick='window.open(this.href); return false;'>Page</a>
       
   936                 </td>
       
   937                 <td class='$row_class'>
       
   938                   <a href='$dele_url'>Delete</a>
       
   939                 </td>
       
   940               </tr>";
       
   941       } while ( $row = $db->fetchrow($q) );
       
   942     }
       
   943     else
       
   944     {
       
   945       echo '<tr><td class="row3" colspan="5" style="text-align: center;">No news items yet.</td></tr>';
       
   946     }
       
   947     echo '<tr><th class="subhead" colspan="5"><a href="' . makeUrlNS('Special', 'Administration', "module={$paths->cpage['module']}&act=create", true) . '" style="color: inherit;">Create new entry</a></th></tr>
       
   948           </table></div>';
       
   949     $db->free_result();
       
   950     
       
   951   }
       
   952   
       
   953 }
       
   954 
       
   955 function page_Admin_NewsboyConfiguration()
       
   956 {
       
   957   global $db, $session, $paths, $template, $plugins; if($session->auth_level < USER_LEVEL_ADMIN || $session->user_level < USER_LEVEL_ADMIN) { redirect(makeUrlNS('Special', 'Administration', 'noheaders', true), '', '', 0); die('Hacking attempt'); }
       
   958   if ( isset($_POST['submit']) )
       
   959   {
       
   960     setConfig('nb_portal_title', $_POST['portal_name']);
       
   961     if ( isPage($_POST['announce_page']) )
       
   962       setConfig('nb_announce_page', $_POST['announce_page']);
       
   963     else
       
   964       setConfig('nb_announce_page', '');
       
   965     // Submit
       
   966     echo '<div class="info-box">Your changes have been saved.</div>';
       
   967   }
       
   968   echo '<form name="main" action="'.htmlspecialchars(makeUrl($paths->nslist['Special'].'Administration', 'module='.$paths->cpage['module'])).'" method="post">';
       
   969   echo '<div class="tblholder">
       
   970           <table border="0" cellspacing="1" cellpadding="4">
       
   971             <tr>
       
   972               <th colspan="2">
       
   973                 Newsboy portal: General configuration
       
   974               </th>
       
   975             </tr>
       
   976             <tr>
       
   977               <td class="row2">
       
   978                 Portal title:<br />
       
   979                 <small>This is the text that will be shown as the page title on the<br />
       
   980                 portal. If you don\'t enter anything here, a default will be used.</small>
       
   981               </td>
       
   982               <td class="row1"><input type="text" size="30" name="portal_name" value="' . htmlspecialchars(getConfig('nb_portal_title')) . '"></td>
       
   983             </tr>
       
   984             <tr>
       
   985               <td class="row2">
       
   986                 Page to embed as announcement:<br />
       
   987                 <small>The page you enter here will always be shown at the top of the<br />
       
   988                 portal. The default is "' . $paths->nslist['NewsBoy'] . 'Announce".</small>
       
   989               </td>
       
   990               <td class="row1">
       
   991                 ' . $template->pagename_field('announce_page', htmlspecialchars(getConfig('nb_announce_page'))) . '
       
   992               </td>
       
   993             </tr>
       
   994             <tr>
       
   995               <th class="subhead" colspan="2">
       
   996                 <input type="submit" name="submit" value="Save changes" />
       
   997               </th>
       
   998             </tr>
       
   999           </table>
       
  1000         </div>';
       
  1001   echo '</form>';
       
  1002 }
       
  1003 
       
  1004 /**
       
  1005  * Trims a wad of text to the specified length.
       
  1006  * @todo make HTML friendly (don't break tags)
       
  1007  * @param string The text to trim
       
  1008  * @param int The maximum length to trim the text to.
       
  1009  * @param bool Reference. Set to true if the text was trimmed, otherwise set to false.
       
  1010  */
       
  1011 
       
  1012 function nb_trim_paragraph($text, $len = 500, &$trimmed = false)
       
  1013 {
       
  1014   $trimmed = false;
       
  1015   if ( strlen($text) <= $len )
       
  1016     return $text;
       
  1017   $trimmed = true;
       
  1018   $text = substr($text, 0, $len);
       
  1019   for ( $i = $len; $i > 0; $i-- )
       
  1020   {
       
  1021     $chr = $text{$i-1};
       
  1022     if ( preg_match('/[\s]/', $chr) )
       
  1023     {
       
  1024       $text = substr($text, 0, $i - 1);
       
  1025       $text .= '...';
       
  1026       return $text;
       
  1027     }
       
  1028     $text = substr($text, 0, $i);
       
  1029   }
       
  1030   return $text;
       
  1031 }
       
  1032 
       
  1033 ?>