Dokeos PHP Cross Reference Learning Management Systems

Source: /main/blog/blog.php - 575 lines - 19047 bytes - Summary - Text - Print

   1  <?php //$Id: announcements.php 16702 2008-11-10 13:02:30Z elixir_inter $
   2  /*
   3  ==============================================================================
   4      Dokeos - elearning and course management software
   5  
   6      Copyright (c) 2004-2008 Dokeos SPRL
   7      Copyright (c) 2003 Ghent University (UGent)
   8      Copyright (c) 2001 Universite catholique de Louvain (UCL)
   9      Copyright (c) various contributors
  10  
  11      For a full list of contributors, see "credits.txt".
  12      The full license can be read in "license.txt".
  13  
  14      This program is free software; you can redistribute it and/or
  15      modify it under the terms of the GNU General Public License
  16      as published by the Free Software Foundation; either version 2
  17      of the License, or (at your option) any later version.
  18  
  19      See the GNU General Public License for more details.
  20  
  21      Contact address: Dokeos, rue du Corbeau, 108, B-1030 Brussels, Belgium
  22      info@dokeos.com
  23  
  24  ==============================================================================
  25  
  26      BLOG HOMEPAGE
  27  
  28      This file takes care of all blog navigation and displaying.
  29  
  30      @package dokeos.blogs
  31  ==============================================================================
  32  */
  33  
  34  /*
  35  ==============================================================================
  36      INIT
  37  ==============================================================================
  38  */
  39  // name of the language file that needs to be included
  40  $language_file = "blog";
  41  $blog_id = intval($_GET['blog_id']);
  42  
  43  include  ('../inc/global.inc.php');
  44  $this_section=SECTION_COURSES;
  45  
  46  
  47  /* ------------    ACCESS RIGHTS ------------ */
  48  // notice for unauthorized people.
  49  api_protect_course_script(true);
  50  
  51  
  52  //session
  53  if(isset($_GET['id_session']))
  54  {
  55      $_SESSION['id_session'] = $_GET['id_session'];
  56  }
  57  
  58  $lib_path = api_get_path(LIBRARY_PATH);
  59  require_once ($lib_path.'/display.lib.php');
  60  require_once ($lib_path.'/text.lib.php');
  61  require_once ($lib_path.'/blog.lib.php');
  62  require_once ($lib_path.'/fckeditor/fckeditor.php');
  63  
  64  $blog_table_attachment     = Database::get_course_table(TABLE_BLOGS_ATTACHMENT);
  65  
  66  $nameTools = get_lang('Blogs');
  67  $DaysShort = api_get_week_days_short();
  68  $DaysLong = api_get_week_days_long();
  69  $MonthsLong = api_get_months_long();
  70  
  71  $current_page = $_GET['action'];
  72  
  73  /*
  74  ==============================================================================
  75      PROCESSING
  76  ==============================================================================
  77  */
  78  
  79  $safe_post_title = Security::remove_XSS($_POST['post_title']);
  80  $safe_post_file_comment = Security::remove_XSS($_POST['post_file_comment']);
  81  $safe_post_full_text = Security::remove_XSS(stripslashes(api_html_entity_decode($_POST['post_full_text'])), COURSEMANAGERLOWSECURITY);
  82  $safe_comment_text = Security::remove_XSS(stripslashes(api_html_entity_decode($_POST['comment_text'])), COURSEMANAGERLOWSECURITY);
  83  $safe_comment_title = Security::remove_XSS($_POST['comment_title']);
  84  $safe_task_name = Security::remove_XSS($_POST['task_name']);
  85  $safe_task_description = Security::remove_XSS($_POST['task_description']);
  86  
  87  if (!empty($_POST['new_post_submit']) AND !empty($_POST['post_title']))
  88  {
  89      Blog :: create_post($safe_post_title, $safe_post_full_text, $safe_post_file_comment,$blog_id);
  90      $return_message = array('type' => 'confirmation', 'message' => get_lang('BlogAdded'));
  91  }
  92  if (!empty($_POST['edit_post_submit']))
  93  {
  94      $safe_post_title = Security::remove_XSS($_POST['post_title']);
  95      Blog :: edit_post($_POST['post_id'], $safe_post_title, $safe_post_full_text, $blog_id);
  96      $return_message = array('type' => 'confirmation', 'message' => get_lang('BlogEdited'));
  97  }
  98  if (!empty($_POST['new_comment_submit']))
  99  {
 100      Blog :: create_comment($safe_comment_title, $safe_comment_text, $safe_post_file_comment,$blog_id, (int)$_GET['post_id'], $_POST['comment_parent_id']);
 101      $return_message = array('type' => 'confirmation', 'message' => get_lang('CommentAdded'));
 102  }
 103  
 104  if (!empty($_POST['new_task_submit']))
 105  {
 106      Blog :: create_task($blog_id, $safe_task_name, $safe_task_description, $_POST['chkArticleDelete'], $_POST['chkArticleEdit'], $_POST['chkCommentsDelete'], $_POST['task_color']);
 107      $return_message = array('type' => 'confirmation', 'message' => get_lang('TaskCreated'));
 108  }
 109  
 110  if (isset($_POST['edit_task_submit']))
 111  {
 112      Blog :: edit_task($_POST['blog_id'], $_POST['task_id'], $safe_task_name, $safe_task_description, $_POST['chkArticleDelete'], $_POST['chkArticleEdit'],$_POST['chkCommentsDelete'], $_POST['task_color']);
 113      $return_message = array('type' => 'confirmation', 'message' => get_lang('TaskEdited'));
 114  }
 115  if (!empty($_POST['assign_task_submit']))
 116  {
 117      Blog :: assign_task($blog_id, $_POST['task_user_id'], $_POST['task_task_id'], $_POST['task_year']."-".$_POST['task_month']."-".$_POST['task_day']);
 118      $return_message = array('type' => 'confirmation', 'message' => get_lang('TaskAssigned'));
 119  }
 120  
 121  if (isset($_POST['assign_task_edit_submit']))
 122  {
 123      Blog :: edit_assigned_task($blog_id, $_POST['task_user_id'], $_POST['task_task_id'], $_POST['task_year']."-".$_POST['task_month']."-".$_POST['task_day'], $_POST['old_user_id'], $_POST['old_task_id'], $_POST['old_target_date']);
 124      $return_message = array('type' => 'confirmation', 'message' => get_lang('AssignedTaskEdited'));
 125  }
 126  if (!empty($_POST['new_task_execution_submit']))
 127  {
 128      Blog :: create_comment($safe_comment_title, $safe_comment_text, $blog_id, (int)$_GET['post_id'], $_POST['comment_parent_id'], $_POST['task_id']);
 129      $return_message = array('type' => 'confirmation', 'message' => get_lang('CommentCreated'));
 130  }
 131  if (!empty($_POST['register']))
 132  {
 133      if (is_array($_POST['user'])) {
 134          foreach ($_POST['user'] as $index => $user_id)
 135          {
 136              Blog :: set_user_subscribed((int)$_GET['blog_id'], $user_id);
 137          }
 138      }
 139  }
 140  if (!empty($_POST['unregister']))
 141  {
 142      if (is_array($_POST['user'])) {
 143          foreach ($_POST['user'] as $index => $user_id)
 144          {
 145              Blog :: set_user_unsubscribed((int)$_GET['blog_id'], $user_id);
 146          }
 147      }
 148  }
 149  if (!empty($_GET['register']))
 150  {
 151      Blog :: set_user_subscribed((int)$_GET['blog_id'], (int)$_GET['user_id']);
 152      $return_message = array('type' => 'confirmation', 'message' => get_lang('UserRegistered'));
 153      $flag = 1;
 154  }
 155  if (!empty($_GET['unregister']))
 156  {
 157      Blog :: set_user_unsubscribed((int)$_GET['blog_id'], (int)$_GET['user_id']);
 158  }
 159  
 160  if (isset($_GET['action']) && $_GET['action'] == 'manage_tasks')
 161  {
 162      if (isset($_GET['do']) && $_GET['do'] == 'delete')
 163      {
 164          Blog :: delete_task($blog_id, (int)$_GET['task_id']);
 165          $return_message = array('type' => 'confirmation', 'message' => get_lang('TaskDeleted'));
 166      }
 167  
 168      if (isset($_GET['do']) && $_GET['do'] == 'delete_assignment')
 169      {
 170          Blog :: delete_assigned_task($blog_id, Database::escape_string((int)$_GET['task_id']), Database::escape_string((int)$_GET['user_id']));
 171          $return_message = array('type' => 'confirmation', 'message' => get_lang('TaskAssignmentDeleted'));
 172      }
 173  
 174  }
 175  
 176  if (isset($_GET['action']) && $_GET['action'] == 'view_post')
 177  {
 178      $task_id = (isset ($_GET['task_id']) && is_numeric($_GET['task_id'])) ? $_GET['task_id'] : 0;
 179  
 180      if (isset($_GET['do']) && $_GET['do'] == 'delete_comment')
 181      {
 182          if (api_is_allowed('BLOG_'.$blog_id, 'article_comments_delete', $task_id))
 183          {
 184              Blog :: delete_comment($blog_id, (int)$_GET['post_id'],(int)$_GET['comment_id']);
 185              $return_message = array('type' => 'confirmation', 'message' => get_lang('CommentDeleted'));
 186          }
 187          else
 188          {
 189              $error = true;
 190              $message = get_lang('ActionNotAllowed');
 191          }
 192      }
 193  
 194      if (isset($_GET['do']) && $_GET['do'] == 'delete_article')
 195      {
 196          if (api_is_allowed('BLOG_'.$blog_id, 'article_delete', $task_id))
 197          {
 198              Blog :: delete_post($blog_id, (int)$_GET['article_id']);
 199              $current_page = ''; // Article is gone, go to blog home
 200              $return_message = array('type' => 'confirmation', 'message' => get_lang('BlogDeleted'));
 201          }
 202          else
 203          {
 204              $error = true;
 205              $message = get_lang('ActionNotAllowed');
 206          }
 207      }
 208      if (isset($_GET['do']) && $_GET['do'] == 'rate')
 209      {
 210          if (isset($_GET['type']) && $_GET['type'] == 'post')
 211          {
 212              if (api_is_allowed('BLOG_'.$blog_id, 'article_rate'))
 213              {
 214                  Blog :: add_rating('post', $blog_id, (int)$_GET['post_id'], (int)$_GET['rating']);
 215                  $return_message = array('type' => 'confirmation', 'message' => get_lang('RatingAdded'));
 216              }
 217          }
 218          if (isset($_GET['type']) && $_GET['type'] == 'comment')
 219          {
 220              if (api_is_allowed('BLOG_'.$blog_id, 'article_comments_add'))
 221              {
 222                  Blog :: add_rating('comment', $blog_id, (int)$_GET['comment_id'], (int)$_GET['rating']);
 223                  $return_message = array('type' => 'confirmation', 'message' => get_lang('RatingAdded'));
 224              }
 225          }
 226      }
 227  }
 228  /*
 229  ==============================================================================
 230      DISPLAY
 231  ==============================================================================
 232  */
 233  $htmlHeadXtra[] = '<script src="tbl_change.js" type="text/javascript" language="javascript"></script>';
 234  
 235  // Set bredcrumb
 236  switch ($current_page)
 237  {
 238      case 'new_post' :
 239          $nameTools = get_lang('NewPost');
 240          $interbreadcrumb[] = array ('url' => "blog.php?blog_id=$blog_id", "name" => Blog :: get_blog_title($blog_id));
 241          Display :: display_tool_header($nameTools, 'Blogs');
 242          break;
 243      case 'manage_tasks' :
 244          $nameTools = get_lang('TaskManager');
 245          $interbreadcrumb[] = array ('url' => "blog.php?blog_id=$blog_id", "name" => Blog :: get_blog_title($blog_id));
 246          Display :: display_tool_header($nameTools, 'Blogs');
 247          break;
 248      case 'manage_members' :
 249          $nameTools = get_lang('MemberManager');
 250          $interbreadcrumb[] = array ('url' => "blog.php?blog_id=$blog_id", "name" => Blog :: get_blog_title($blog_id));
 251          Display :: display_tool_header($nameTools, 'Blogs');
 252          break;
 253      case 'manage_rights' :
 254          $nameTools = get_lang('RightsManager');
 255          $interbreadcrumb[] = array ('url' => "blog.php?blog_id=$blog_id", 'name' => Blog :: get_blog_title($blog_id));
 256          Display :: display_tool_header($nameTools, 'Blogs');
 257          break;
 258      case 'view_search_result' :
 259          $nameTools = get_lang('SearchResults');
 260          $interbreadcrumb[] = array ('url' => "blog.php?blog_id=$blog_id", 'name' => Blog :: get_blog_title($blog_id));
 261          Display :: display_tool_header($nameTools, 'Blogs');
 262          break;
 263      case 'execute_task' :
 264          $nameTools = get_lang('ExecuteThisTask');
 265          $interbreadcrumb[] = array ('url' => "blog.php?blog_id=$blog_id", 'name' => Blog :: get_blog_title($blog_id));
 266          Display :: display_tool_header($nameTools, 'Blogs');
 267          break;
 268      default :
 269          $nameTools = Blog :: get_blog_title($blog_id);
 270          Display :: display_tool_header($nameTools, 'Blogs');
 271  }
 272  
 273  // feedback messages
 274  if (!empty($return_message))
 275  {
 276      if ($return_message['type'] == 'confirmation')
 277      {
 278          Display::display_confirmation_message($return_message['message']);
 279      }
 280      if ($return_message['type'] == 'error')
 281      {
 282          Display::display_error_message($return_message['message']);
 283      }
 284  }
 285  
 286  
 287  // actions
 288  echo '<div class="actions">';
 289  ?>
 290      <a href="<?php echo api_get_self(); ?>?blog_id=<?php echo $blog_id ?>" title="<?php echo get_lang('Home') ?>"><?php echo Display::return_icon('pixel.gif', get_lang('Home'),array('class'=>'toolactionplaceholdericon toolactionblog-home')).get_lang('Home') ?></a>
 291      <?php if(api_is_allowed('BLOG_'.$blog_id, 'article_add')) { ?><a href="<?php echo api_get_self(); ?>?action=new_post&amp;blog_id=<?php echo $blog_id ?>" title="<?php echo get_lang('NewPost') ?>"><?php echo Display::return_icon('pixel.gif', get_lang('NewPost'),array('class'=>'toolactionplaceholdericon toolactiondocumentcreate')).get_lang('NewPost') ?></a><?php } ?>
 292      <?php if(api_is_allowed('BLOG_'.$blog_id, 'task_management')) { ?><a href="<?php echo api_get_self(); ?>?action=manage_tasks&amp;blog_id=<?php echo $blog_id ?>" title="<?php echo get_lang('ManageTasks') ?>"><?php echo Display::return_icon('pixel.gif', get_lang('TaskManager'),array('class'=>'toolactionplaceholdericon toolactionroles_management')).get_lang('TaskManager') ?></a><?php } ?>
 293      <?php if(api_is_allowed('BLOG_'.$blog_id, 'member_management')) { ?><a href="<?php echo api_get_self(); ?>?action=manage_members&amp;blog_id=<?php echo $blog_id ?>" title="<?php echo get_lang('ManageMembers') ?>"><?php echo Display::return_icon('pixel.gif', get_lang('MemberManager'),array('class'=>'toolactionplaceholdericon toolactionunknown')).get_lang('MemberManager') ?></a><?php } ?>
 294  <?php
 295  echo '</div>';
 296  
 297  echo '<div id="content">';
 298  
 299  // Tool introduction
 300  Display::display_introduction_section(TOOL_BLOG);
 301  
 302  //Display::display_tool_header($nameTools,'Blogs');
 303  ?>
 304  <div class="quiz_content_actions"><table width="100%"><tr><td class="blog_fontcolor"><?php echo Blog::get_blog_title($blog_id); ?></td></tr>
 305  <tr><td><?php echo Blog::get_blog_subtitle($blog_id); ?></td></tr></table></div>
 306  
 307  <table width="100%">
 308  <tr>
 309      <td width="10%" style="float:left;" class="blog_left" valign="top">
 310          <?php
 311  
 312  $month = (int)$_GET['month'] ? (int)$_GET['month'] : (int) date('m');
 313  $year = (int)$_GET['year'] ? (int)$_GET['year'] : date('Y');
 314  Blog :: display_minimonthcalendar($month, $year, $blog_id);
 315  ?>
 316          <br />
 317  
 318          <br />
 319          <table width="100%" class="actions">
 320              <tr>
 321                  <td><div class="blog_fontcolor"><?php echo get_lang('Search'); ?></div></td>
 322              </tr>
 323              <tr>
 324                  <td class="blog_menu">
 325                      <form action="blog.php" method="get" enctype="multipart/form-data">
 326                          <input type="hidden" name="blog_id" value="<?php echo $blog_id ?>" />
 327                          <input type="hidden" name="action" value="view_search_result" />
 328                          <input type="text" size="20" name="q" value="<?php echo (isset($_GET['q']) ? $_GET['q'] : ''); ?>" />
 329                  </td>
 330              </tr>
 331              <tr><td>
 332              <button class="search" type="submit"><?php echo get_lang('Search'); ?></button>
 333                      </form>
 334              </td></tr>
 335          </table>
 336          <br />
 337          <table width="100%" class="actions">
 338              <tr>
 339                  <td><div class="blog_fontcolor"><?php echo get_lang('MyTasks') ?></div></td>
 340              </tr>
 341              <tr>
 342                  <td class="blog_menu">
 343                      <?php Blog::get_personal_task_list(); ?>
 344                  </td>
 345              </tr>
 346          </table>
 347          <!--
 348          <br />
 349          <table width="100%">
 350              <tr>
 351                  <td class="blog_menu_title"><?php echo get_lang('FavoriteBlogs') ?></td>
 352              </tr>
 353              <tr>
 354                  <td class="blog_menu">
 355                      <ul>
 356                          <li>Favorite 1</li>
 357                          <li>Favorite 2</li>
 358                          <li>Favorite 3</li>
 359                      </ul>
 360                  </td>
 361              </tr>
 362          </table>
 363          <br />
 364          <table width="100%">
 365              <tr>
 366                  <td class="blog_menu_title"><?php echo get_lang('TopTen') ?></td>
 367              </tr>
 368              <tr>
 369                  <td class="blog_menu">
 370                      <ul>
 371                          <li>Blog 1</li>
 372                          <li>Blog 2</li>
 373                          <li>Blog 3</li>
 374                      </ul>
 375                  </td>
 376              </tr>
 377          </table>
 378      -->
 379      </td>
 380      <td valign="top" class="blog_right">
 381          <?php
 382  if(!empty($current_page))
 383  {    
 384      echo '<div class="quiz_content_actions blog_margintop">';
 385  }
 386  
 387  if ($error)
 388      Display :: display_error_message($message);
 389  
 390  if ($flag == '1')
 391  {
 392      $current_page = "manage_tasks";
 393      Blog :: display_assign_task_form($blog_id);
 394  }
 395  
 396  $user_task = false;
 397  
 398  if (isset ($_GET['task_id']) && is_numeric($_GET['task_id']))
 399      $task_id = (int)$_GET['task_id'];
 400  else
 401  {
 402      $task_id = 0;
 403  
 404      $tbl_blogs_tasks_rel_user = Database :: get_course_table(TABLE_BLOGS_TASKS_REL_USER);
 405  
 406      $sql = "
 407                              SELECT COUNT(*) as number
 408                              FROM ".$tbl_blogs_tasks_rel_user."
 409                              WHERE
 410                                  blog_id = ".$blog_id." AND
 411                                  user_id = ".api_get_user_id()." AND
 412                                  task_id = ".$task_id;
 413  
 414      $result = Database::query($sql, __LINE__, __FILE__);
 415      $row = Database::fetch_array($result);
 416  
 417      if ($row['number'] == 1)
 418          $user_task = true;
 419  }
 420  
 421  switch ($current_page)
 422  {
 423      case 'new_post' :
 424          if (api_is_allowed('BLOG_'.$blog_id, 'article_add', $user_task ? $task_id : 0))
 425          {
 426              // we show the form if
 427              // 1. no post data
 428              // 2. there is post data and the required field is empty
 429              if (!$_POST OR (!empty($_POST) AND empty($_POST['post_title'])))
 430              {
 431                  // if there is post data there is certainly an error in the form
 432                  if ($_POST)
 433                  {
 434                      Display::display_error_message(get_lang('FormHasErrorsPleaseComplete'));
 435                  }
 436              Blog :: display_form_new_post($blog_id);
 437          }
 438          else
 439          {
 440                  if (isset ($_GET['filter']) && !empty ($_GET['filter']))
 441                  {
 442                      Blog :: display_day_results($blog_id, Database::escape_string($_GET['filter']));
 443                  }
 444                  else
 445                  {
 446                      Blog :: display_blog_posts($blog_id);
 447                  }
 448              }
 449          }
 450          else
 451          {
 452              api_not_allowed();
 453          }
 454          break;
 455      case 'view_post' :
 456          Blog :: display_post($blog_id, Database::escape_string((int)$_GET['post_id']));
 457          break;
 458      case 'edit_post' :
 459          $task_id = (isset ($_GET['task_id']) && is_numeric($_GET['task_id'])) ? $_GET['task_id'] : 0;
 460  
 461          if (api_is_allowed('BLOG_'.$blog_id, 'article_edit', $task_id))
 462          {
 463              // we show the form if
 464              // 1. no post data
 465              // 2. there is post data and the required field is empty
 466              if (!$_POST OR (!empty($_POST) AND empty($_POST['post_title'])))
 467              {
 468                  // if there is post data there is certainly an error in the form
 469                  if ($_POST)
 470                  {
 471                      Display::display_error_message(get_lang('FormHasErrorsPleaseComplete'));
 472                  }
 473              Blog :: display_form_edit_post($blog_id, Database::escape_string((int)$_GET['post_id']));
 474              }
 475              else
 476              {
 477                  if (isset ($_GET['filter']) && !empty ($_GET['filter']))
 478                  {
 479                      Blog :: display_day_results($blog_id, Database::escape_string($_GET['filter']));
 480                  }
 481                  else
 482                  {
 483                      Blog :: display_blog_posts($blog_id);
 484                  }
 485              }
 486          }
 487          else
 488          {
 489              api_not_allowed();
 490          }
 491  
 492          break;
 493      case 'manage_members' :
 494          if (api_is_allowed('BLOG_'.$blog_id, 'member_management'))
 495          {
 496              Blog :: display_form_user_subscribe($blog_id);
 497              echo '<br /><br />';
 498              Blog :: display_form_user_unsubscribe($blog_id);
 499          }
 500          else
 501              api_not_allowed();
 502  
 503          break;
 504      case 'manage_rights' :
 505          Blog :: display_form_user_rights($blog_id);
 506          break;
 507      case 'manage_tasks' :
 508          if (api_is_allowed('BLOG_'.$blog_id, 'task_management'))
 509          {
 510              if (isset($_GET['do']) && $_GET['do'] == 'add')
 511              {
 512                  Blog :: display_new_task_form($blog_id);
 513              }
 514              if (isset($_GET['do']) && $_GET['do'] == 'assign')
 515              {
 516                  Blog :: display_assign_task_form($blog_id);
 517              }
 518              if (isset($_GET['do']) && $_GET['do'] == 'edit')
 519              {
 520                  Blog :: display_edit_task_form($blog_id, Database::escape_string($_GET['task_id']));
 521              }
 522              if (isset($_GET['do']) && $_GET['do'] == 'edit_assignment')
 523              {
 524                  Blog :: display_edit_assigned_task_form($blog_id, Database::escape_string((int)$_GET['task_id']), Database::escape_string((int)$_GET['user_id']));
 525              }
 526              Blog :: display_task_list($blog_id);
 527              echo '<br /><br />';
 528              Blog :: display_assigned_task_list($blog_id);
 529              echo '<br /><br />';
 530          }
 531          else
 532              api_not_allowed();
 533  
 534          break;
 535      case 'execute_task' :
 536          if (isset ($_GET['post_id']))
 537              Blog :: display_post($blog_id, Database::escape_string((int)$_GET['post_id']));
 538          else
 539              Blog :: display_select_task_post($blog_id, Database::escape_string((int)$_GET['task_id']));
 540  
 541          break;
 542      case 'view_search_result' :
 543          Blog :: display_search_results($blog_id, Database::escape_string($_GET['q']));
 544          break;
 545      case '' :
 546      default :
 547          if (isset ($_GET['filter']) && !empty ($_GET['filter']))
 548          {
 549              Blog :: display_day_results($blog_id, Database::escape_string($_GET['filter']));
 550          }
 551          else
 552          {
 553              Blog :: display_blog_posts($blog_id);
 554          }
 555  }
 556  if(!empty($current_page))
 557  {
 558      echo '</div>';
 559  }
 560  ?>
 561      </td>
 562  </tr>
 563  </table>
 564  
 565  <?php
 566  // ending div#content
 567  echo '</div>';
 568  
 569  // bottom actions bar
 570  echo '<div class="actions">';
 571  echo '</div>';
 572  
 573  // Display the footer
 574  Display::display_footer();
 575  ?>

title

Description

title

Description

title

Description

title

title

Body