/**
  * Save a fogbugz ticket
  * @requestParam type $category
  * @requestParam type $message
  * @responseParam string result [OK/error]
  * @responseParam string error (error message)
  */
 public function saveFeedback()
 {
     $user = $this->wg->User;
     $feature = $this->getVal('feature');
     $category = $this->getVal('category');
     $message = $this->getVal('message');
     if (!$user->isLoggedIn()) {
         $this->result = 'error';
         $this->error = $this->wf->Msg('wikifeatures-error-permission');
     }
     // TODO: validate feature_id
     if (!array_key_exists($feature, WikiFeaturesHelper::$feedbackAreaIDs)) {
         $this->result = 'error';
         $this->error = $this->wf->Msg('wikifeatures-error-invalid-parameter', 'feature');
     } else {
         if (!array_key_exists($category, WikiFeaturesHelper::$feedbackCategories) || $category == 0) {
             $this->result = 'error';
             $this->error = $this->wf->Msg('wikifeatures-error-invalid-category');
         } else {
             if (!$message || strlen($message) < 10 || strlen($message) > 1000) {
                 $this->result = 'error';
                 $this->error = $this->wf->Msg('wikifeatures-error-message');
             } else {
                 if (WikiFeaturesHelper::getInstance()->isSpam($user->getName(), $feature)) {
                     $this->result = 'error';
                     $this->error = $this->wf->Msg('wikifeatures-error-spam-attempt');
                 }
             }
         }
     }
     // Passed validations, actually do something useful
     if (is_null($this->error)) {
         $this->result = 'ok';
         $bugzdata = WikiFeaturesHelper::getInstance()->sendFeedback($feature, $user, $message, $category);
         $this->msg = wfMsg('wikifeatures-feedback-success');
     }
 }