// This may look like C code, but it's really -*- C++ -*-
/*
 * Copyright (C) 2011 Emweb bvba, Kessel-Lo, Belgium.
 *
 * See the LICENSE file for terms of use.
 */
#ifndef WT_AUTH_UPDATE_PASSWORD_WIDGET_H_
#define WT_AUTH_UPDATE_PASSWORD_WIDGET_H_

#include <Wt/WTemplate>
#include <Wt/Auth/RegistrationModel>

namespace Wt {
  namespace Auth {

class AbstractPasswordAuth;
class EnterPasswordFields;
class Login;

/*! \class UpdatePasswordWidget Auth/UpdatePasswordWidget
 *  \brief A widget which allows a user to choose a new password.
 *
 * This widget lets a user choose a new password.
 *
 * The widget renders the <tt>"Wt.Auth.template.update-password"</tt>
 * template. Optionally, it asks for the current password, as well as
 * a new password.
 *
 * \sa AuthWidget::createUpdatePasswordView()
 *
 * \ingroup auth
 */
class WT_API UpdatePasswordWidget : public WTemplate
{
public:
  /*! \brief Constructor.
   *
   * If \p promptPassword is \c true, the user also has to enter his
   * current password.
   */
  UpdatePasswordWidget(const User& user, const AbstractPasswordService& auth,
		       Login& login, bool promptPassword,
		       WContainerWidget *parent = 0);

private:
  User user_;
  bool promptPassword_;
  bool validated_;

  RegistrationModel *model_;
  EnterPasswordFields *enterPasswordFields_;

  void updateModel(const std::string& var, RegistrationModel::Field field);
  void updateView(const std::string& var, RegistrationModel::Field field);
  void checkPassword();
  void checkPassword2();
  bool validate();
  void doUpdate();
  void close();
};

  }
}

#endif // WT_AUTH_UPDATE_PASSWORD_WIDGET_H_
