public function signupForm($errors = array())
 {
     $fields = $this->signupFields($errors);
     $html = '<div class="wa-form"><form action="' . $this->signupUrl() . '" method="post">';
     foreach ($fields as $field_id => $field) {
         if ($field) {
             $f = $field[0];
             /**
              * @var waContactField $f
              */
             if (isset($errors[$field_id])) {
                 $field_error = is_array($errors[$field_id]) ? implode(', ', $errors[$field_id]) : $errors[$field_id];
             } else {
                 $field_error = false;
             }
             $field[1]['id'] = $field_id;
             if ($f instanceof waContactCompositeField) {
                 foreach ($f->getFields() as $sf) {
                     /**
                      * @var waContactField $sf
                      */
                     $html .= $this->signupFieldHTML($sf, array('parent' => $field_id, 'id' => $sf->getId()), $field_error);
                 }
             } else {
                 $html .= $this->signupFieldHTML($f, $field[1], $field_error);
             }
         } else {
             $html .= '<div class="wa-field wa-separator"></div>';
         }
     }
     $config = $this->wa->getAuthConfig();
     if (isset($config['signup_captcha']) && $config['signup_captcha']) {
         $html .= '<div class="wa-field"><div class="wa-value">';
         $html .= $this->wa->getCaptcha()->getHtml(isset($errors['captcha']) ? $errors['captcha'] : '');
         if (isset($errors['captcha'])) {
             $html .= '<em class="wa-error-msg">' . $errors['captcha'] . '</em>';
         }
         $html .= '</div></div>';
     }
     $html .= '<div class="wa-field"><div class="wa-value wa-submit">
         <input type="submit" value="' . _ws('Sign up') . '"> ' . sprintf(_ws('or <a href="%s">login</a> if you already have an account'), $this->getUrl('/login')) . '
     </div></div>';
     $html .= '</form></div>';
     return $html;
 }