/**
 *
 */
package com.tootsville.tootsbook.client.pages;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.tootsville.tootsbook.client.TootsBook;
import com.tootsville.tootsbook.client.panel.Box;

/**
 * WRITEME: Document this type. twheys@gmail.com Jan 19, 2010
 * 
 * @author <a href="mailto:twheys@gmail.com@resinteractive.com">Tim
 *         Heys</a>
 */
public class LoginPage extends VerticalPanel {

	/**
	 * WRITEME: Document this brpocock@star-hope.org
	 */
	private final Image footerSafetyInfo = new Image (
			"/tootbook-resource/images/ui/safetyfirst-footer.png");

	/**
	 * Main page element.
	 */
	private final Box loginBox;

	/**
	 * Button for logging in
	 */
	protected Button loginButton;

	/**
	 * Field for user to enter password.
	 */
	private PasswordTextBox password;

	/**
	 * Button for creating a new account
	 */
	protected Button registerButton;

	/**
	 * Check Box for user to set a cookie for login.
	 */
	private CheckBox rememberMeCheckBox;

	/**
	 * Field for user to enter username.
	 */
	private TextBox username;

	/**
	 * Build a page where users can enter their login information
	 */
	public LoginPage () {
		TootsBook
				.loadBoxStylesStyleSheet ("/tootbook-resource/themes/box-styles/1359/style.css");
		TootsBook
				.loadPageBGStyleSheet ("/tootbook-resource/themes/page-bg/1361/style.css");
		TootsBook
				.loadTitleBGStyleSheet ("/tootbook-resource/themes/title-bg/login/style.css");
		Window.setTitle ("Login - TootsBook® www.Tootsville.com");

		final SimplePanel content = buildContentPanel ();
		loginBox = new Box (content, "");
		loginBox.useBackground ();
		loginBox.useHeaderBackground ();
		// loginBox.useHeaderBorder ();
		loginBox.removeMargin ();
		loginBox.setHeaderHeight (165);
		loginBox.pack ();
		loginBox.setWidth ("900px");

		setHorizontalAlignment (HasHorizontalAlignment.ALIGN_CENTER);

		add (loginBox);
		add (new HTML ("<br /><br />"));
		add (footerSafetyInfo);

		TootsBook.hideLoadingBar ();
	}

	/**
	 * Builds the content of the login page.
	 * 
	 * @return The content in a SimplePanel
	 */
	private SimplePanel buildContentPanel () {
		final SimplePanel contentPanel = new SimplePanel ();
		final VerticalPanel topLayer = new VerticalPanel ();

		username = new TextBox ();
		username.setStyleName ("login-box");

		password = new PasswordTextBox ();
		password.setStyleName ("login-box");

		rememberMeCheckBox = new CheckBox ("Remember Me");
		rememberMeCheckBox.setValue (Boolean.TRUE);
		rememberMeCheckBox.setStyleName ("primary-text");

		final Anchor forgotPassword = new Anchor (
				"Forgot Your Password?",
				"https://members.tootsville.com/membership/forgotPassword/",
				"_blank");
		forgotPassword
				.setStyleName ("primary-text forgot-password-link");

		final KeyPressHandler keyAction = new KeyPressHandler () {
			/*
			 * (non-Javadoc)
			 * 
			 * @see
			 * com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress
			 * (com .google.gwt.event.dom.client.KeyPressEvent)
			 */
			@Override
			public void onKeyPress (final KeyPressEvent event) {
				if (event.getCharCode () == KeyCodes.KEY_ENTER) {
					loginButton.click ();
				}
			}
		};

		username.addKeyPressHandler (keyAction);
		password.addKeyPressHandler (keyAction);

		loginButton = new Button ("", new ClickHandler () {
			/*
			 * (non-Javadoc)
			 * 
			 * @see
			 * com.google.gwt.event.dom.client.ClickHandler#onClick(
			 * com.google .gwt.event.dom.client.ClickEvent)
			 */
			@Override
			public void onClick (final ClickEvent event) {
				login ();
			}
		});
		loginButton.setStyleName ("login-page-button");
		loginButton.getElement ().setId ("login-button");

		registerButton = new Button ("", new ClickHandler () {
			/*
			 * (non-Javadoc)
			 * 
			 * @see
			 * com.google.gwt.event.dom.client.ClickHandler#onClick(
			 * com.google .gwt.event.dom.client.ClickEvent)
			 */
			@Override
			public void onClick (final ClickEvent event) {
				register ();
			}
		});
		registerButton.setStyleName ("login-page-button");
		registerButton.getElement ().setId ("register-button");

		username.setTabIndex (1);
		password.setTabIndex (2);
		loginButton.setTabIndex (3);
		registerButton.setTabIndex (4);
		forgotPassword.setTabIndex (5);

		final FlexTable loginArea = new FlexTable ();

		loginArea.setSize ("100%", "100%");
		loginArea.setCellSpacing (15);
		loginArea
				.setWidget (
						0,
						0,
						new Image (
								"/tootbook-resource/images/icons/tootbook-children.png"));

		loginArea.getFlexCellFormatter ().setRowSpan (0, 0, 4);

		loginArea
				.setWidget (
						0,
						1,
						new Image (
								"/tootbook-resource/images/text/tootbook-username-text.png"));
		loginArea
				.setWidget (
						1,
						0,
						new Image (
								"/tootbook-resource/images/text/tootbook-password-text.png"));
		loginArea.setWidget (2, 0, forgotPassword);

		loginArea.setWidget (0, 2, username);
		loginArea.setWidget (1, 1, password);

		loginArea.setWidget (2, 1, loginButton);
		loginArea.setWidget (3, 1, registerButton);

		for (int col = 0; col < 3; col++ ) {
			for (int row = 0; row < 4; row++ ) {
				loginArea.getCellFormatter ().setAlignment (
						row,
						col,
						HasHorizontalAlignment.ALIGN_RIGHT,
						3 == row ? HasVerticalAlignment.ALIGN_BOTTOM
								: HasVerticalAlignment.ALIGN_TOP);
			}
		}

		contentPanel.add (topLayer);
		contentPanel.getElement ().setAttribute ("style",
				"padding: 0px 15px 10px 15px;");

		topLayer.setHorizontalAlignment (HasHorizontalAlignment.ALIGN_CENTER);
		topLayer.setWidth ("100%");
		topLayer.add (loginArea);
		topLayer.add (TootsBook.getLinks ());
		return contentPanel;
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 19, 2010
	 * </pre>
	 * 
	 * TO login WRITEME...
	 */
	protected void login () {
		TootsBook.login (username.getText (), password.getText ());
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 19, 2010
	 * </pre>
	 * 
	 * TO register WRITEME...
	 */
	protected void register () {
		Window.open (
				"https://members.tootsville.com/membership/register/",
				"Tootsville Registration", "");

	}
}
