Dokeos PHP Cross Reference Learning Management Systems

Source: /main/admin/user_edit.php - 455 lines - 19987 bytes - Summary - Text - Print

   1  <?php
   2  /* For licensing terms, see /dokeos_license.txt */
   3  
   4  /**
   5  * @package dokeos.admin
   6  */
   7  
   8  
   9  // Language files that should be included
  10  $language_file = array('admin', 'registration');
  11  
  12  $cidReset = true;
  13  
  14  include  '../inc/global.inc.php';
  15  
  16  $this_section = SECTION_PLATFORM_ADMIN;
  17  
  18  api_protect_admin_script();
  19  
  20  $htmlHeadXtra[] = '
  21  <script type="text/javascript">
  22  <!--
  23  function enable_expiration_date() { //v2.0
  24      document.user_edit.radio_expiration_date[0].checked=false;
  25      document.user_edit.radio_expiration_date[1].checked=true;
  26  }
  27  
  28  function password_switch_radio_button(){
  29      var input_elements = document.getElementsByTagName("input");
  30      for (var i = 0; i < input_elements.length; i++) {
  31          if(input_elements.item(i).name == "reset_password" && input_elements.item(i).value == "2") {
  32              input_elements.item(i).checked = true;
  33          }
  34      }
  35  }
  36  
  37  function display_drh_list(){
  38      if(document.getElementById("status_select").value=='.STUDENT.')
  39      {
  40          document.getElementById("drh_list").style.display="block";
  41      }
  42      else
  43      {
  44          document.getElementById("drh_list").style.display="none";
  45          document.getElementById("drh_select").options[0].selected="selected";
  46      }
  47  }
  48  
  49  function show_image(image,width,height) {
  50      width = parseInt(width) + 20;
  51      height = parseInt(height) + 20;
  52      window_x = window.open(image,\'windowX\',\'width=\'+ width + \', height=\'+ height + \' , resizable=0\');
  53  }
  54  //-->
  55  </script>';
  56  
  57  $libpath = api_get_path(LIBRARY_PATH);
  58  require_once $libpath.'fileManage.lib.php';
  59  require_once $libpath.'fileUpload.lib.php';
  60  require_once $libpath.'usermanager.lib.php';
  61  require_once $libpath.'formvalidator/FormValidator.class.php';
  62  require_once $libpath.'image.lib.php';
  63  require_once $libpath.'mail.lib.inc.php';
  64  
  65  $user_id = isset($_GET['user_id']) ? intval($_GET['user_id']) : intval($_POST['user_id']);
  66  $noPHP_SELF = true;
  67  $tool_name = get_lang('ModifyUserInfo');
  68  
  69  $interbreadcrumb[] = array('url' => 'index.php',"name" => get_lang('PlatformAdmin'));
  70  $interbreadcrumb[] = array('url' => "user_list.php","name" => get_lang('UserList'));
  71  
  72  $table_user = Database::get_main_table(TABLE_MAIN_USER);
  73  $table_admin = Database::get_main_table(TABLE_MAIN_ADMIN);
  74  $sql = "SELECT u.*, a.user_id AS is_admin FROM $table_user u LEFT JOIN $table_admin a ON a.user_id = u.user_id WHERE u.user_id = '".$user_id."'";
  75  $res = Database::query($sql, __FILE__, __LINE__);
  76  if (Database::num_rows($res) != 1) {
  77      header('Location: user_list.php');
  78      exit;
  79  }
  80  
  81  $user_data = Database::fetch_array($res, 'ASSOC');
  82  $user_data['platform_admin'] = is_null($user_data['is_admin']) ? 0 : 1;
  83  $user_data['send_mail'] = 0;
  84  $user_data['old_password'] = $user_data['password'];
  85  unset($user_data['password']);
  86  
  87  $user_data = array_merge($user_data, Usermanager :: get_extra_user_data($user_id, true));
  88  
  89  // Create the form
  90  $form = new FormValidator('user_edit', 'post', '', '', array('style' => 'width: 60%; float: '.($text_dir == 'rtl' ? 'right;' : 'left;')));
  91  $form->addElement('header', '', $tool_name);
  92  $form->addElement('hidden', 'user_id', $user_id);
  93  
  94  if (api_is_western_name_order()) {
  95      // Firstname
  96      $form->addElement('text', 'firstname', get_lang('FirstName'),'class="focus"');
  97      $form->applyFilter('firstname', 'html_filter');
  98      $form->applyFilter('firstname', 'trim');
  99      $form->addRule('firstname', get_lang('ThisFieldIsRequired'), 'required');
 100      // Lastname
 101      $form->addElement('text', 'lastname', get_lang('LastName'));
 102      $form->applyFilter('lastname', 'html_filter');
 103      $form->applyFilter('lastname', 'trim');
 104      $form->addRule('lastname', get_lang('ThisFieldIsRequired'), 'required');
 105  } else {
 106      // Lastname
 107      $form->addElement('text', 'lastname', get_lang('LastName'));
 108      $form->applyFilter('lastname', 'html_filter');
 109      $form->applyFilter('lastname', 'trim');
 110      $form->addRule('lastname', get_lang('ThisFieldIsRequired'), 'required');
 111      // Firstname
 112      $form->addElement('text', 'firstname', get_lang('FirstName'));
 113      $form->applyFilter('firstname', 'html_filter');
 114      $form->applyFilter('firstname', 'trim');
 115      $form->addRule('firstname', get_lang('ThisFieldIsRequired'), 'required');
 116  }
 117  
 118  // Official code
 119  $form->addElement('text', 'official_code', get_lang('OfficialCode'), array('size' => '40'));
 120  $form->applyFilter('official_code', 'html_filter');
 121  $form->applyFilter('official_code', 'trim');
 122  
 123  // Email
 124  $form->addElement('text', 'email', get_lang('Email'), array('size' => '40'));
 125  $form->addRule('email', get_lang('EmailWrong'), 'email');
 126  $form->addRule('email', get_lang('EmailWrong'), 'required');
 127  
 128  // OpenID
 129  if (api_get_setting('openid_authentication') == 'true') {
 130      $form->addElement('text', 'openid', get_lang('OpenIDURL'), array('size' => '40'));
 131  }
 132  
 133  // Phone
 134  $form->addElement('text', 'phone', get_lang('PhoneNumber'));
 135  
 136  // Picture
 137  $form->addElement('file', 'picture', get_lang('AddPicture'));
 138  $allowed_picture_types = array ('jpg', 'jpeg', 'png', 'gif');
 139  $form->addRule('picture', get_lang('OnlyImagesAllowed').' ('.implode(',', $allowed_picture_types).')', 'filetype', $allowed_picture_types);
 140  if (strlen($user_data['picture_uri']) > 0) {
 141      $form->addElement('checkbox', 'delete_picture', '', get_lang('DelImage'));
 142  }
 143  
 144  // Username
 145  $form->addElement('text', 'username', get_lang('LoginName'), array('maxlength' => USERNAME_MAX_LENGTH));
 146  $form->addRule('username', get_lang('ThisFieldIsRequired'), 'required');
 147  $form->addRule('username', sprintf(get_lang('UsernameMaxXCharacters'), (string)USERNAME_MAX_LENGTH), 'maxlength', USERNAME_MAX_LENGTH);
 148  $form->addRule('username', get_lang('OnlyLettersAndNumbersAllowed'), 'username');
 149  $form->addRule('username', get_lang('UserTaken'), 'username_available', $user_data['username']);
 150  
 151  // Password
 152  $form->addElement('radio', 'reset_password', get_lang('Password'), get_lang('DontResetPassword'), 0);
 153  if (count($extAuthSource) > 0)
 154  {
 155      $group[] =& HTML_QuickForm::createElement('radio', 'reset_password', null, get_lang('ExternalAuthentication').' ', 3);
 156      $auth_sources = array();
 157      foreach($extAuthSource as $key => $info) {
 158          $auth_sources[$key] = $key;
 159      }
 160      $group[] =& HTML_QuickForm::createElement('select', 'auth_source', null, $auth_sources);
 161      $group[] =& HTML_QuickForm::createElement('static', '', '', '<br />');
 162      $form->addGroup($group, 'password', null, '', false);
 163  }
 164  $form->addElement('radio', 'reset_password', null, get_lang('AutoGeneratePassword'), 1);
 165  $group = array();
 166  $group[] =& HTML_QuickForm::createElement('radio', 'reset_password', null, null, 2);
 167  $group[] =& HTML_QuickForm::createElement('password', 'password', null, array('onkeydown' => 'javascript: password_switch_radio_button();'));
 168  $form->addGroup($group, 'password', null, '', false);
 169  
 170  // Status
 171  $status = api_get_status_langvars();
 172  $form->addElement('select', 'status', get_lang('Status'), $status, array('id' => 'status_select', 'onchange' => 'javascript: display_drh_list();'));
 173  
 174  //Language
 175  $form->addElement('select_language', 'language', get_lang('Language'));
 176  
 177  $display = $user_data['status'] == STUDENT || $_POST['status'] == STUDENT ? 'block' : 'none';
 178  $form->addElement('html', '<div id="drh_list" style="display:'.$display.';">');
 179  $drh_select = $form->addElement('select', 'hr_dept_id', get_lang('Drh'), array(), 'id="drh_select"');
 180  $drh_list = UserManager :: get_user_list(array('status' => DRH), api_sort_by_first_name() ? array('firstname', 'lastname') : array('lastname', 'firstname'));
 181  
 182  if (count($drh_list) == 0) {
 183      $drh_select->addOption('- '.get_lang('ThereIsNotStillAResponsible', '').' -', 0);
 184  } else {
 185      $drh_select->addOption('- '.get_lang('SelectAResponsible').' -', 0);
 186  }
 187  
 188  foreach($drh_list as $drh) {
 189      $drh_select->addOption(api_get_person_name($drh['firstname'], $drh['lastname']), $drh['user_id']);
 190  }
 191  $form->addElement('html', '</div>');
 192  
 193  // Platform admin
 194  // Only when changing another user!
 195  if ($user_id != $_SESSION['_uid']) {
 196      $group = array();
 197      $group[] =& HTML_QuickForm::createElement('radio', 'platform_admin', null, get_lang('Yes'), 1);
 198      $group[] =& HTML_QuickForm::createElement('radio', 'platform_admin', null, get_lang('No'), 0);
 199      if ($user_data['status'] <> 5) {
 200          $form->addGroup($group, 'admin', get_lang('PlatformAdmin'), '&nbsp;', false);
 201      }
 202  }
 203  
 204  // Send email
 205  $group = array();
 206  $group[] =& HTML_QuickForm::createElement('radio', 'send_mail', null, get_lang('Yes'), 1);
 207  $group[] =& HTML_QuickForm::createElement('radio', 'send_mail', null, get_lang('No'), 0);
 208  $form->addGroup($group, 'mail', get_lang('SendMailToNewUser'), '&nbsp;', false);
 209  
 210  // Registration Date
 211  $form->addElement('static', 'registration_date', get_lang('RegistrationDate'), $user_data['registration_date']);
 212  
 213  if (!$user_data['platform_admin']) {
 214      // Expiration Date
 215      $form->addElement('radio', 'radio_expiration_date', get_lang('ExpirationDate'), get_lang('NeverExpires'), 0);
 216      $group = array ();
 217      $group[] = & $form->createElement('radio', 'radio_expiration_date', null, get_lang('On'), 1);
 218      $group[] = & $form->createElement('datepicker', 'expiration_date', null, array('form_name' => $form->getAttribute('name'), 'onchange' => 'javascript: enable_expiration_date();'));
 219      $form->addGroup($group, 'max_member_group', null, '', false);
 220  
 221      // Active account or inactive account
 222      $form->addElement('radio', 'active', get_lang('ActiveAccount'), get_lang('Active'), 1);
 223      $form->addElement('radio', 'active', '', get_lang('Inactive'), 0);
 224  }
 225  
 226  
 227  // EXTRA FIELDS
 228  $extra = UserManager::get_extra_fields(0, 50, 5, 'ASC');
 229  foreach ($extra as $id => $field_details) {
 230      if ($field_details[6] == 0) {
 231          continue;
 232      }
 233      switch ($field_details[2]) {
 234          case USER_FIELD_TYPE_TEXT:
 235              $form->addElement('text', 'extra_'.$field_details[1], $field_details[3], array('size' => 40));
 236              $form->applyFilter('extra_'.$field_details[1], 'stripslashes');
 237              $form->applyFilter('extra_'.$field_details[1], 'trim');
 238              break;
 239          case USER_FIELD_TYPE_TEXTAREA:
 240              $form->add_html_editor('extra_'.$field_details[1], $field_details[3], false, false, array('ToolbarSet' => 'Profile', 'Width' => '100%', 'Height' => '130'));
 241              //$form->addElement('textarea', 'extra_'.$field_details[1], $field_details[3], array('size' => 80));
 242              $form->applyFilter('extra_'.$field_details[1], 'stripslashes');
 243              $form->applyFilter('extra_'.$field_details[1], 'trim');
 244              break;
 245          case USER_FIELD_TYPE_RADIO:
 246              $group = array();
 247              foreach ($field_details[9] as $option_id => $option_details) {
 248                  $options[$option_details[1]] = $option_details[2];
 249                  $group[] =& HTML_QuickForm::createElement('radio', 'extra_'.$field_details[1], $option_details[1], $option_details[2].'<br />', $option_details[1]);
 250              }
 251              $form->addGroup($group, 'extra_'.$field_details[1], $field_details[3], '');
 252              break;
 253          case USER_FIELD_TYPE_SELECT:
 254              $options = array();
 255              foreach ($field_details[9] as $option_id => $option_details) {
 256                  $options[$option_details[1]] = $option_details[2];
 257              }
 258              $form->addElement('select', 'extra_'.$field_details[1], $field_details[3], $options, '');
 259              break;
 260          case USER_FIELD_TYPE_SELECT_MULTIPLE:
 261              $options = array();
 262              foreach ($field_details[9] as $option_id => $option_details) {
 263                  $options[$option_details[1]] = $option_details[2];
 264              }
 265              $form->addElement('select', 'extra_'.$field_details[1], $field_details[3], $options, array('multiple' => 'multiple'));
 266              break;
 267          case USER_FIELD_TYPE_DATE:
 268              $form->addElement('datepickerdate', 'extra_'.$field_details[1], $field_details[3], array('form_name' => 'user_edit'));
 269              $form->_elements[$form->_elementIndex['extra_'.$field_details[1]]]->setLocalOption('minYear', 1900);
 270              $defaults['extra_'.$field_details[1]] = date('Y-m-d 12:00:00');
 271              $form -> setDefaults($defaults);
 272              $form->applyFilter('theme', 'trim');
 273              break;
 274          case USER_FIELD_TYPE_DATETIME:
 275              $form->addElement('datepicker', 'extra_'.$field_details[1], $field_details[3], array('form_name' => 'user_edit'));
 276              $form->_elements[$form->_elementIndex['extra_'.$field_details[1]]]->setLocalOption('minYear', 1900);
 277              $defaults['extra_'.$field_details[1]] = date('Y-m-d 12:00:00');
 278              $form -> setDefaults($defaults);
 279              $form->applyFilter('theme', 'trim');
 280              break;
 281      }
 282  }
 283  
 284  // Submit button
 285  $form->addElement('style_submit_button', 'submit', get_lang('ModifyInformation'), 'class="save"');
 286  
 287  // Set default values
 288  $user_data['reset_password'] = 0;
 289  $expiration_date = $user_data['expiration_date'];
 290  if ($expiration_date == '0000-00-00 00:00:00') {
 291      $user_data['radio_expiration_date'] = 0;
 292      $user_data['expiration_date'] = array();
 293      $user_data['expiration_date']['d'] = date('d');
 294      $user_data['expiration_date']['F'] = date('m');
 295      $user_data['expiration_date']['Y'] = date('Y');
 296  } else {
 297      $user_data['radio_expiration_date'] = 1;
 298      $user_data['expiration_date'] = array();
 299      $user_data['expiration_date']['d'] = substr($expiration_date, 8, 2);
 300      $user_data['expiration_date']['F'] = substr($expiration_date, 5, 2);
 301      $user_data['expiration_date']['Y'] = substr($expiration_date, 0, 4);
 302  }
 303  $form->setDefaults($user_data);
 304  
 305  // Validate form
 306  if ( $form->validate()) {
 307      $user = $form->exportValues();
 308  
 309      $picture_element = & $form->getElement('picture');
 310      $picture = $picture_element->getValue();
 311  
 312      $picture_uri = $user_data['picture_uri'];
 313      if ($user['delete_picture']) {
 314          $picture_uri = UserManager::delete_user_picture($user_id);
 315          }
 316      elseif (!empty($picture['name'])) {
 317          $picture_uri = UserManager::update_user_picture($user_id, $_FILES['picture']['name'], $_FILES['picture']['tmp_name']);
 318      }
 319  
 320      $lastname = $user['lastname'];
 321      $firstname = $user['firstname'];
 322      $official_code = $user['official_code'];
 323      $email = $user['email'];
 324      $phone = $user['phone'];
 325      $username = $user['username'];
 326      $status = intval($user['status']);
 327      $platform_admin = intval($user['platform_admin']);
 328      $send_mail = intval($user['send_mail']);
 329      $reset_password = intval($user['reset_password']);
 330      $hr_dept_id = intval($user['hr_dept_id']);
 331      $language = $user['language'];
 332      if ($user['radio_expiration_date'] == '1' && !$user_data['platform_admin']) {
 333          $expiration_date=$user['expiration_date'];
 334      } else {
 335          $expiration_date='0000-00-00 00:00:00';
 336      }
 337      $active = $user_data['platform_admin'] ? 1 : intval($user['active']);
 338  
 339      if ($reset_password == 0) {
 340          $password = null;
 341          $auth_source = $user_data['auth_source'];
 342      }
 343      elseif($reset_password == 1) {
 344          $password = api_generate_password();
 345          $auth_source = PLATFORM_AUTH_SOURCE;
 346      }
 347      elseif($reset_password == 2) {
 348          $password = $user['password'];
 349          $auth_source = PLATFORM_AUTH_SOURCE;
 350      }
 351      elseif($reset_password == 3) {
 352          $password = $user['password'];
 353          $auth_source = $user['auth_source'];
 354      }
 355      UserManager::update_user($user_id, $firstname, $lastname, $username, $password, $auth_source, $email, $status, $official_code, $phone, $picture_uri, $expiration_date, $active, null, $hr_dept_id, null, $language);
 356      if (api_get_setting('openid_authentication') == 'true' && !empty($user['openid'])) {
 357          $up = UserManager::update_openid($user_id,$user['openid']);
 358      }
 359      if ($user_id != $_SESSION['_uid']) {
 360          if ($platform_admin == 1) {
 361              $sql = "INSERT IGNORE INTO $table_admin SET user_id = '".$user_id."'";
 362              Database::query($sql, __FILE__, __LINE__);
 363          } else {
 364              $sql = "DELETE FROM $table_admin WHERE user_id = '".$user_id."'";
 365              Database::query($sql, __FILE__, __LINE__);
 366          }
 367      }
 368  
 369      $extras = array();
 370      foreach($user as $key => $value) {
 371          if(substr($key, 0, 6) == 'extra_') { //an extra field
 372              $myres = UserManager::update_extra_field_value($user_id, substr($key, 6), $value);
 373          }
 374      }
 375  
 376      if (!empty ($email) && $send_mail) {
 377          $recipient_name = api_get_person_name($firstname, $lastname, null, PERSON_NAME_EMAIL_ADDRESS);
 378          $emailsubject = '['.api_get_setting('siteName').'] '.get_lang('YourReg').' '.api_get_setting('siteName');
 379          $sender_name = api_get_person_name(api_get_setting('administratorName'), api_get_setting('administratorSurname'), null, PERSON_NAME_EMAIL_ADDRESS);
 380          $email_admin = api_get_setting('emailAdministrator');
 381  
 382  
 383          $emailbody = get_lang('Dear')." ".stripslashes("$firstname $lastname").",\n\n".get_lang('YouAreReg')." ". api_get_setting('siteName') ." ".get_lang('WithTheFollowingSettings')."\n\n".get_lang('Username')." : ". $username;
 384          // Send password by e-mail if it has been modified, even if encrypted in DB (it doesn't make sense to send an e-mail with login info without the password, even if the password is encrypted)
 385          if ($reset_password > 0) {
 386              $emailbody .= "\n".get_lang('Pass')." : ".stripslashes($password);
 387          }
 388      
 389          if ($_configuration['multiple_access_urls'] == true) {
 390              $access_url_id = api_get_current_access_url_id();
 391              if ($access_url_id != -1) {
 392                  $url = api_get_access_url($access_url_id);
 393                  $emailbody .= "\n\n" .get_lang('Address') ." ". api_get_setting('siteName') ." ". get_lang('Is') ." : ". $url['url'] ."\n\n". get_lang('Problem'). "\n\n". get_lang('Formula').",\n\n".api_get_person_name(api_get_setting('administratorName'), api_get_setting('administratorSurname'))."\n". get_lang('Manager'). " ".api_get_setting('siteName')."\nT. ".api_get_setting('administratorTelephone')."\n" .get_lang('Email') ." : ".api_get_setting('emailAdministrator');
 394              }
 395          }
 396          else {
 397              $emailbody .= "\n\n" .get_lang('Address') ." ". api_get_setting('siteName') ." ". get_lang('Is') ." : ". $_configuration['root_web'] ."\n\n". get_lang('Problem'). "\n\n". get_lang('Formula').",\n\n".api_get_person_name(api_get_setting('administratorName'), api_get_setting('administratorSurname'))."\n". get_lang('Manager'). " ".api_get_setting('siteName')."\nT. ".api_get_setting('administratorTelephone')."\n" .get_lang('Email') ." : ".api_get_setting('emailAdministrator');
 398          }
 399          @api_mail($recipient_name, $email, $emailsubject, $emailbody, $sender_name, $email_admin);
 400      }
 401      $tok = Security::get_token();
 402      header('Location: user_list.php?action=show_message&message='.urlencode(get_lang('UserUpdated')).'&sec_token='.$tok);
 403      exit();
 404  }
 405  
 406  // display the header
 407  Display::display_header($tool_name);
 408  
 409  // start the content div
 410  echo '<div id="content" class="admin_user_edit">';
 411  
 412  echo '<div class="actions">';
 413  echo '<a href="'.api_get_path(WEB_CODE_PATH).'admin/user_list.php">'.Display::return_icon('pixel.gif',get_lang('UserList'),array('class'=>'toolactionplaceholdericon toolactionadminusers')).get_lang('UserList').'</a>';
 414  echo '<a href="'.api_get_path(WEB_CODE_PATH).'admin/user_export.php">'.Display::return_icon('pixel.gif',get_lang('Export'),array('class'=>'toolactionplaceholdericon toolactionexportcourse')).get_lang('Export').'</a>';
 415  echo '<a href="'.api_get_path(WEB_CODE_PATH).'admin/user_import.php">'.Display::return_icon('pixel.gif',get_lang('Import'),array('class'=>'toolactionplaceholdericon toolactionimportcourse')).get_lang('Import').'</a>';
 416  echo '<a href="'.api_get_path(WEB_CODE_PATH).'admin/user_fields.php">'.Display::return_icon('pixel.gif',get_lang('ManageUserFields'),array('class'=>'toolactionplaceholdericon toolactionsprofile')).get_lang('ManageUserFields').'</a>';
 417  echo '</div>';
 418  
 419  // USER PICTURE
 420  $image_path = UserManager::get_user_picture_path_by_id($user_id,'web');
 421  $image_dir = $image_path['dir'];
 422  $image = $image_path['file'];
 423  $image_file = ($image != '' ? $image_dir.$image : api_get_path(WEB_CODE_PATH).'img/unknown.jpg');
 424  $image_size = api_getimagesize($image_file);
 425  
 426  $img_attributes = 'src="'.$image_file.'?rand='.time().'" '
 427      .'alt="'.api_get_person_name($user_data['firstname'], $user_data['lastname']).'" '
 428      .'style="float:'.($text_dir == 'rtl' ? 'left' : 'right').'; padding:5px;" ';
 429  
 430  if ($image_size[0] > 300) { //limit display width to 300px
 431      $img_attributes .= 'width="300" ';
 432  }
 433  
 434  // get the path,width and height from original picture
 435  $big_image = $image_dir.'big_'.$image;
 436  $big_image_size = api_getimagesize($big_image);
 437  $big_image_width = $big_image_size[0];
 438  $big_image_height = $big_image_size[1];
 439  $url_big_image = $big_image.'?rnd='.time();
 440  
 441  if ($image == '') {
 442      echo '<img '.$img_attributes.' />';
 443  } else {
 444      echo '<input type="image" '.$img_attributes.' onclick="javascript: return show_image(\''.$url_big_image.'\',\''.$big_image_width.'\',\''.$big_image_height.'\');"/>';
 445  }
 446  
 447  // Display form
 448  $form->display();
 449  
 450  // close the content div
 451  echo '<div class="clear"> </div>';
 452  echo '</div>';
 453  
 454  // Footer
 455  Display::display_footer();

title

Description

title

Description

title

Description

title

title

Body