function checkFields() {
  var fields = ['email', 'password', 'password_confirmation', 'captcha', 'phone', 'title'];
  var error_description = ['Введите email', 'Введите пароль', 'Введите пароль ещё раз, для проверки', 'Введите текст, изображённый на картинке', 'Контактный телефон не может быть пустым', 'Название сообщества не может быть пустым'];
  var valid = true;
  var wasFocused = false;
  for (var i = 0; i < fields.length; ++i) {
    if (!$(fields[i]) || $(fields[i]).nodeName == 'META') {
      // For phone field
      continue;
    }
    var input = $F(fields[i]);
    var errors = $(fields[i] + '_error');
    var verified = $(fields[i] + '_verified');
    if ( '' == input ) {
      valid = false;
      showFieldValidationResult( fields[i], { result:false, description:error_description[i]} );
      if ( !wasFocused ) {
        $( fields[i] ).focus();
        wasFocused = true;
      }
    }
    else if (errors.visible() || verified && !verified.visible() || fields[i] == 'email') {
      checkFieldValue(fields[i], false);
      if (errors.visible() ||  verified && !verified.visible()) {
        valid = false;
        if (!wasFocused) {
          $(fields[i]).focus();
          wasFocused = true;
        }
      }
    }
  }

  return valid;
}

function checkFieldValue(fieldName, asynchronous) {
  validateBothPasswords = false;
  if (asynchronous == undefined)
    asynchronous = true
  else
    validateBothPasswords = true;

  var input = $(fieldName);
  if ( '' != input.value ) {
    if ('captcha' == fieldName || 'email' == fieldName || 'password' == fieldName) {
      var passwordValidationResult = true;
      if ( 'password' == fieldName ) {
        passwordValidationResult = validatePasswords();
      }

      new Ajax.Request('/users/check_field', {
        asynchronous:asynchronous,
        evalScripts:true,
        parameters:Form.serialize( $('form') ) + '&field_to_check=' + fieldName,
        onComplete: function( request ) {
          response = request.responseJSON;
          if ( 'password' == fieldName  &&  response.result) {
            showPasswordsValidation( fieldName, passwordValidationResult );
          }
          else {
            showFieldValidationResult( fieldName, response );
          }
        }
      });
    }
    if ('password_confirmation' == fieldName) {
      showPasswordsValidation(fieldName, validatePasswords(validateBothPasswords));
    }

    if ('phone' == fieldName || 'title' == fieldName) {
      showFieldValidationResult(fieldName, { result: true});
    }
  }
  else {
    if ('phone' == fieldName) {
      showFieldValidationResult(fieldName, { result: false, description: 'Контактный телефон не может быть пустым' });
    }

    if ('title' == fieldName) {
      showFieldValidationResult(fieldName, { result: false, description: 'Название сообщества не может быть пустым' });
    }

    if ($(fieldName + '_error') && !$(fieldName + '_error').visible()) {
      if ($(fieldName + '_verified')) {
        $(fieldName + '_verified').hide();
      }
    }
  }
}

function checkCaptcha()
{
  if ( 6 <= $F('captcha').length ) {
    checkFieldValue( 'captcha' );
  }
}

function validatePasswords( validateBoth )
{
  if (validateBoth == undefined)
    validateBoth = false;

  var password = $F('password');
  var password_confirmation = $F('password_confirmation');
  if ( ( !password  ||  !password_confirmation )  &&  !validateBoth ) {
    return true;
  }
  else {
    return password == password_confirmation  &&  password  &&  password_confirmation;
  }
}

function showPasswordsValidation( fieldName, result ) {
  var toogle = ( 'password' == fieldName ) ? 'password_confirmation' : 'password';
  if ( result ) {
    showFieldValidationResult( fieldName, { result: true } );
    if ( $( toogle + "_error").visible()  &&  $( toogle + "_error_body").innerHTML[0] == "П" ) {
      showFieldValidationResult( toogle, { result: true } );
    }
  }
  else
    if ( !$( toogle + '_error').visible() ) {
      showFieldValidationResult( fieldName, { result: false, description: "Пароли не совпадают" } );
    }
}

function showFieldValidationResult( fieldName, response ) {
  if (response.result) {
    if ($(fieldName + '_error')) {
      $(fieldName + '_error').hide();
    }

    if ($(fieldName + '_verified')) {
      $(fieldName + '_verified').show();
    }
  } else {
    if ($(fieldName + '_error_body')) {
      $(fieldName + '_error_body').innerHTML = response.description;
    }

    if ($(fieldName + '_verified')) {
      $(fieldName + '_verified').hide();
    }

    if ($(fieldName + '_error')) {
      $(fieldName + '_error').show();
    }
  }
}
