/**
  * List all attachments, and manage attachments
  *
  * @param void
  * @return null
  */
 function attachments()
 {
     if (!$this->active_object->canEdit($this->logged_user)) {
         $this->httpError(HTTP_ERR_FORBIDDEN, null, true, $this->request->isApiCall());
     }
     // if
     $attachemts = $this->active_object->getAttachments();
     $this->smarty->assign(array('attachments' => $attachemts));
     if ($this->request->isSubmitted()) {
         $async = (bool) $this->request->get('async');
         db_begin_work();
         $file = array_shift($_FILES);
         $this->active_object->attachUploadedFile($file, $this->logged_user);
         $save = $this->active_object->save();
         if ($save && !is_error($save)) {
             $attachment = Attachments::findLastByObject($this->active_object);
             if (instance_of($attachment, 'Attachment')) {
                 db_commit();
                 if ($async) {
                     $this->smarty->assign(array('_attachment' => $attachment, '_object_attachments_cycle_name' => 'object_attachments_cycle_' . $attachment->getId()));
                     // jQuery acts a bit weird here. Insted of providing response as
                     // a string it tries to append it to the BODY so some markup
                     // (tr, td) gets discarded. That is why we need to use temp table
                     // in order to get properly marked-up row
                     die('<table style="display: none">' . $this->smarty->fetch(get_template_path('_object_attachments_row', 'attachments', RESOURCES_MODULE))) . '</table>';
                 } elseif ($this->request->isApiCall()) {
                     $this->serveData($attachment, 'attachment');
                 } else {
                     flash_success('File ":file" has been added', array('file' => $file['name']));
                     $this->redirectToUrl($this->active_object->getAttachmentsUrl());
                 }
                 // if
             }
             // if
         }
         // if
         db_rollback();
         if ($async) {
             $this->httpError(HTTP_ERR_OPERATION_FAILED);
         } elseif ($this->request->isApiCall()) {
             $this->httpError(HTTP_ERR_OPERATION_FAILED, null, true, true);
         } else {
             flash_error('File ":file" has not been added', array('file' => $file['name']));
             $this->redirectToUrl($this->active_object->getAttachmentsUrl());
         }
         // if
     } else {
         if ($this->request->isApiCall()) {
             $this->serveData($attachemts, 'attachments');
         }
         // if
     }
     // if
 }