/**
  * Sends an email with a personal message and the selected
  * review attachements to the author. Also marks review attachments
  * selected by the editor as "viewable" for the author.
  * @param $submission Submission
  * @param $emailKey string An email template.
  * @param $request PKPRequest
  */
 function _sendReviewMailToAuthor($submission, $emailKey, $request)
 {
     // Send personal message to author.
     import('lib.pkp.classes.mail.SubmissionMailTemplate');
     $email = new SubmissionMailTemplate($submission, $emailKey, null, null, null, false);
     $email->setBody($this->getData('personalMessage'));
     $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO');
     $userDao = DAORegistry::getDAO('UserDAO');
     $submitterAssignments = $stageAssignmentDao->getBySubmissionAndRoleId($submission->getId(), ROLE_ID_AUTHOR);
     while ($submitterAssignment = $submitterAssignments->next()) {
         $submitterUser = $userDao->getById($submitterAssignment->getUserId());
         $email->addRecipient($submitterUser->getEmail(), $submitterUser->getFullName());
     }
     DAORegistry::getDAO('SubmissionEmailLogDAO');
     // Load constants
     $email->setEventType(SUBMISSION_EMAIL_EDITOR_NOTIFY_AUTHOR);
     // Get review round.
     $reviewRound = $this->getReviewRound();
     if (is_a($reviewRound, 'ReviewRound')) {
         // Retrieve review indexes.
         $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO');
         /* @var $reviewAssignmentDao ReviewAssignmentDAO */
         $reviewIndexes = $reviewAssignmentDao->getReviewIndexesForRound($submission->getId(), $reviewRound->getId());
         assert(is_array($reviewIndexes));
         // Add a review index for review attachments not associated with
         // a review assignment (i.e. attachments uploaded by the editor).
         $lastIndex = end($reviewIndexes);
         $reviewIndexes[-1] = $lastIndex + 1;
         // Attach the selected reviewer attachments to the email.
         $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
         /* @var $submissionFileDao SubmissionFileDAO */
         $selectedAttachments = $this->getData('selectedAttachments');
         if (is_array($selectedAttachments)) {
             foreach ($selectedAttachments as $fileId) {
                 // Retrieve the submission file.
                 $submissionFile = $submissionFileDao->getLatestRevision($fileId);
                 assert(is_a($submissionFile, 'SubmissionFile'));
                 // Check the association information.
                 if ($submissionFile->getAssocType() == ASSOC_TYPE_REVIEW_ASSIGNMENT) {
                     // The review attachment has been uploaded by a reviewer.
                     $reviewAssignmentId = $submissionFile->getAssocId();
                     assert(is_numeric($reviewAssignmentId));
                 } else {
                     // The review attachment has been uploaded by the editor.
                     $reviewAssignmentId = -1;
                 }
                 // Identify the corresponding review index.
                 assert(isset($reviewIndexes[$reviewAssignmentId]));
                 $reviewIndex = $reviewIndexes[$reviewAssignmentId];
                 assert(!is_null($reviewIndex));
                 // Add the attachment to the email.
                 $email->addAttachment($submissionFile->getFilePath(), String::enumerateAlphabetically($reviewIndex) . '-' . $submissionFile->getOriginalFileName());
                 // Update submission file to set viewable as true, so author
                 // can view the file on their submission summary page.
                 $submissionFile->setViewable(true);
                 $submissionFileDao->updateObject($submissionFile);
             }
         }
     }
     // Send the email.
     if (!$this->getData('skipEmail')) {
         $router = $request->getRouter();
         $dispatcher = $router->getDispatcher();
         $context = $request->getContext();
         $email->assignParams(array('submissionUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'authorDashboard', 'submission', $submission->getId()), 'contextName' => $context->getLocalizedName()));
         $email->send($request);
     }
 }