package com.tootsville.tootsbook.client.pages;

import org.gwtwidgets.client.style.Color;
import org.gwtwidgets.client.wrap.Callback;
import org.gwtwidgets.client.wrap.Effect;
import org.gwtwidgets.client.wrap.EffectOption;

import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.FocusEvent;
import com.google.gwt.event.dom.client.FocusHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.tootsville.tootsbook.client.BookServiceAsync;
import com.tootsville.tootsbook.client.TootsBook;
import com.tootsville.tootsbook.client.exception.PrivilegeRequiredException;
import com.tootsville.tootsbook.client.exception.SessionTimedOutException;
import com.tootsville.tootsbook.client.panel.AdPopupPanel;
import com.tootsville.tootsbook.client.panel.AvatarBox;
import com.tootsville.tootsbook.client.panel.Box;
import com.tootsville.tootsbook.client.panel.ErrorMessage;
import com.tootsville.tootsbook.client.panel.LinkPanel;
import com.tootsville.tootsbook.client.panel.wallobjects.PostPanel;
import com.tootsville.tootsbook.client.panel.wallobjects.WallObject;
import com.tootsville.tootsbook.client.util.Advertisement;
import com.tootsville.tootsbook.client.util.DisplayText;
import com.tootsville.tootsbook.client.util.Post;
import com.tootsville.tootsbook.client.util.UserProfile;
import com.tootsville.tootsbook.client.util.tasks.Task;

/**
 * @author twheys@gmail.com
 */
public final class HomePage extends HorizontalPanel {

	/**
	 * WRITEME: Document this type.
	 *
	 * @author brpocock@star-hope.org
	 *
	 */
	private static final class RemovePostEffect implements ClickHandler {
		/**
		 * WRITEME: Document this brpocock@star-hope.org
		 */
		final Anchor myLink;
		/**
		 * WRITEME: Document this brpocock@star-hope.org
		 */
		private final HomePage myHomePage;
		/**
		 * WRITEME
		 */
		final FlexTable myPostContainer;
		
		/**
		 * WRITEME: Document this constructor brpocock@star-hope.org
		 * 
		 * @param link WRITEME
		 * @param container WRITEME
		 * @param owner WRITEME
		 */
		 RemovePostEffect (final Anchor link,
				final FlexTable container, final HomePage owner) {
			myLink = link;
			myHomePage = owner;
			myPostContainer = container;
		}

		@Override
		public void onClick (final ClickEvent event) {
			myHomePage.getOlderPosts ();
			final EffectOption [] opts = new EffectOption [] { new EffectOption (
					"onCompletion", new Callback () {

						@Override
						public void execute () {
							myPostContainer.remove (myLink);
						}
					}) };
			Effect.puff (myLink, opts);
		}
	}

	/**
	 * WRITEME
	 */
	public static final String COMMENT_FIELD_DEFAULT_TEXT = "What are you doing?";
	/**
	 * WRITEME
	 */
	private static UserProfile user;

	/**
	 * @return The profile user
	 */
	public static UserProfile getUser () {
		return HomePage.user;
	}

	/**
	 * WRITEME
	 */
	private Box adBox;

	/**
	 * WRITEME
	 */
	TextArea addCommentField;

	/**
	 * WRITEME
	 */
	private AvatarBox avatarPanel;

	/**
	 * WRITEME
	 */
	private VerticalPanel centerContents;

	/**
	 * WRITEME
	 */
	private Box collectionBox;

	/**
	 * WRITEME
	 */
	private final BlurHandler comemntBlur = new BlurHandler () {
		/**
		 * @see com.google.gwt.event.dom.client.BlurHandler#onBlur(com.google.gwt.event.dom.client.BlurEvent)
		 */
		@Override
		public void onBlur (final BlurEvent event) {
			if (addCommentField.getText ().equals ("")) {
				addCommentField
						.setText (HomePage.COMMENT_FIELD_DEFAULT_TEXT);
				addCommentField.addStyleName ("greyed-text");
			}
		}
	};

	/**
	 * WRITEME
	 */
	private final FocusHandler commentFocus = new FocusHandler () {
		/**
		 * @see com.google.gwt.event.dom.client.FocusHandler#onFocus(com.google.gwt.event.dom.client.FocusEvent)
		 */
		@Override
		public void onFocus (final FocusEvent event) {
			if (HomePage.COMMENT_FIELD_DEFAULT_TEXT
					.equals (addCommentField.getText ())) {
				addCommentField.setText ("");
				addCommentField.removeStyleName ("greyed-text");
			}
		}
	};

	/**
	 * WRITEME
	 */
	private VerticalPanel leftContents;

	/**
	 * WRITEME
	 */
	private Box linkBox;

	/**
	 * WRITEME
	 */
	private Label loadingPostsMessage;

	/**
	 * Highest ID of displayed posts. Used to retrieve updated posts on
	 * a timer.
	 */
	private int newestPostID;

	/**
	 * WRITEME
	 */
	private int numberOfDisplayedPosts;

	/**
	 * WRITEME
	 */
	private Box postBox;

	/**
	 * WRITEME
	 */
	private FlexTable postContainer;

	/**
	 * WRITEME
	 */
	private SimplePanel postDiv;

	/**
	 * WRITEME
	 */
	private VerticalPanel rightContents;

	/**
	 * WRITEME
	 */
	private Box textBox;

	/**
	 * WRITEME
	 */
	private Box titleBox;

	/**
	 * WRITEME
	 */
	private HTML titlePanel;

	/**
	 * <pre>
	 * twheys@gmail.com Jan 15, 2010
	 * </pre>
	 * 
	 * A HomePage WRITEME...
	 */
	public HomePage () {
		if (TootsBook.isLoggedIn ()) {
			buildHomePage ();
			listenForPosts ();
		} else {
			History.newItem ("login");
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 15, 2010
	 * </pre>
	 * 
	 * TO addComment WRITEME...
	 * 
	 * @param post WRITEME twheys@gmail.com
	 */
	public void addComment (final Post post) {
		if (null != post.getParent ()) {
			((PostPanel) post.getParent ().getContainingPanel ())
					.addComment (post);
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO addCommentsToPosts WRITEME...
	 * 
	 * @param posts WRITEME twheys@gmail.com
	 */
	private void addCommentsToPosts (final Post [] posts) {
		for (final Post post : posts) {
			if (null != post.getParent ()) {
				((PostPanel) post.getParent ().getContainingPanel ())
						.addComment (post);
			}
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO addMorePostsLink WRITEME...
	 */
	private void addMorePostsLink () {
		final Anchor getMorePostsLink = new Anchor (
				DisplayText.SHOW_MORE_POSTS, "javascript:;");
		getMorePostsLink.setStyleName ("primary-text");
		getMorePostsLink.addClickHandler (new RemovePostEffect (
				getMorePostsLink, postContainer, this));
		postContainer.setWidget (postContainer.getRowCount (), 0,
				getMorePostsLink);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 17, 2010
	 * </pre>
	 * 
	 * TO addNewPostsToWall WRITEME...
	 * 
	 * @param posts WRITEME twheys@gmail.com
	 */
	private void addNewPostsToWall (final Post [] posts) {
		numberOfDisplayedPosts += posts.length - 1;
		for (final Post post : posts) {
			if (null == post.getParent ()) {
				final WallObject wallObject = post.getPanel ();
				wallObject.setVisible (false);
				postContainer.insertRow (0);
				postContainer.setWidget (0, 0, wallObject);
				newestPostID = post.getId () > newestPostID ? post
						.getId () : newestPostID;
				Effect.blindDown (wallObject
				// , new EffectOption [] { new EffectOption (
				// "direction", "top-left") }
				);
			}
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 15, 2010
	 * </pre>
	 * 
	 * TO addPost WRITEME...
	 * 
	 * @param post WRITEME twheys@gmail.com
	 */
	 void addPost (final Post post) {
		updateStatus (post);
		if (null != loadingPostsMessage) {
			loadingPostsMessage.removeFromParent ();
		}
		addCommentField.setText (HomePage.COMMENT_FIELD_DEFAULT_TEXT);
		addCommentField.addStyleName ("greyed-text");
		final PostPanel postPanel = new PostPanel (post);
		final int rowBefore = 0;
		postPanel.getElement ()
				.setAttribute ("style", "display: none;");
		postContainer.insertRow (rowBefore);
		postContainer.setWidget (rowBefore, 0, postPanel);
		Effect.blindDown (postPanel,
				new EffectOption [] { new EffectOption ("direction",
						"top-left") });
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO addPostsToWall WRITEME...
	 * 
	 * @param posts WRITEME twheys@gmail.com
	 */
	private void addPostsToWall (final Post [] posts) {
		numberOfDisplayedPosts += posts.length - 1;
		for (final Post post : posts) {
			if (null == post.getParent ()) {
				final WallObject wallObject = post.getPanel ();
				postContainer.setWidget (postContainer.getRowCount (),
						0, wallObject);
				newestPostID = post.getId () > newestPostID ? post
						.getId () : newestPostID;
			}
		}
		// If there might be more posts add a link to retrieve them.
		if (posts.length >= TootsBook.NUMBER_OF_POSTS) {
			addMorePostsLink ();
		}
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO buildAdPanel WRITEME...
	 */
	private void buildAdPanel () {
		final Advertisement adPanel = new Advertisement ();
		adBox = new Box (adPanel, "Advertisment", "<br />", "");
		adBox.pack ();
	}

	/**
	 * Adds a panel for showing collections. Currently this is
	 * unsupported because the backend has not been developed for most
	 * of its components
	 */
	@SuppressWarnings ("unused")
	private void buildCollectionPanel () {
		final VerticalPanel collectionPanel = new VerticalPanel ();
		collectionPanel.setStyleName ("collection-panel");

		final String [][] collectionsList = new String [] [] {
				{ "Pivitz", "#pivitz?id=" + HomePage.user.getUserID () },
				{ "PivitPals",
						"#pivitpals?id=" + HomePage.user.getUserID () },
				{ "KaTootels",
						"#katootels?id=" + HomePage.user.getUserID () },
				{ "Posters",
						"#posters?id=" + HomePage.user.getUserID () },
				{ "Tootfinds",
						"#finds?id=" + HomePage.user.getUserID () } };

		for (final String [] collectionItem : collectionsList) {
			final HorizontalPanel item = new HorizontalPanel ();
			final Anchor link = new Anchor (collectionItem [0],
					collectionItem [1]);
			link.setStyleName ("collection-link");

			item.add (new Image (HomePage.user.getIconBaseURL ()
					+ "bullet.png"));
			item.add (link);
			collectionPanel.add (item);
		}

		collectionBox = new Box (collectionPanel, "Collections",
				"<br />", "");

		collectionBox.addRelImage (
				new Image (HomePage.user.getIconBaseURL ()
						+ "icon3.png"), 128, -315);
		collectionBox.addRelImage (
				new Image (HomePage.user.getIconBaseURL ()
						+ "icon4.png"), 80, -70);

		collectionBox.pack ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 15, 2010
	 * </pre>
	 * 
	 * TO buildHomePage WRITEME...
	 */
	private void buildHomePage () {
		Window.setTitle ("Home - TootsBook® www.Tootsville.com");
		HomePage.user = TootsBook.getUser ();

		TootsBook.loadBoxStylesStyleSheet (HomePage.user
				.getBoxStyleURL ());
		TootsBook.loadPageBGStyleSheet (HomePage.user
				.getPageStyleURL ());
		TootsBook.loadTitleBGStyleSheet (HomePage.user
				.getTitleStyleURL ());

		leftContents = new VerticalPanel ();
		centerContents = new VerticalPanel ();
		rightContents = new VerticalPanel ();

		leftContents
				.setHorizontalAlignment (HasHorizontalAlignment.ALIGN_CENTER);
		centerContents
				.setHorizontalAlignment (HasHorizontalAlignment.ALIGN_CENTER);
		rightContents
				.setHorizontalAlignment (HasHorizontalAlignment.ALIGN_CENTER);

		buildLinkPanel ();
		linkBox.addStyleName ("home-left-panel");
		leftContents.add (linkBox);

		// buildCollectionPanel ();
		// leftContents.add (collectionBox);

		buildTitlePanel ();
		titleBox.addStyleName ("home-center-panel");
		centerContents.add (titleBox);

		buildTextPanel ();
		textBox.addStyleName ("home-center-panel");
		centerContents.add (textBox);

		buildPostPanel ();
		postBox.addStyleName ("home-center-panel");
		centerContents.add (postBox);

		buildAdPanel ();
		adBox.addStyleName ("home-right-panel");
		rightContents.add (adBox);

		// space filler
		leftContents.add (new HTMLPanel (""));

		leftContents.setStyleName ("leftContent");

		centerContents.setStyleName ("centerContent");

		rightContents.setStyleName ("rightContent");

		add (leftContents);
		setCellWidth (leftContents, "220px");
		add (centerContents);
		add (rightContents);
		setCellWidth (rightContents, "180px");

		// setBorderWidth (1);

		setStyleName ("main-panel");

		if (TootsBook.isLoggedIn () && !TootsBook.getUser ().isPaid ()
				&& !TootsBook.isAdShown ()) {
			TootsBook.showPopup (new AdPopupPanel ());
			TootsBook.setAdShown (true);
		}

		getPostsFromServer ();
		TootsBook.hideLoadingBar ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 15, 2010
	 * </pre>
	 * 
	 * TO buildLinkPanel WRITEME...
	 */
	private void buildLinkPanel () {
		final LinkPanel links = new LinkPanel ();
		linkBox = new Box (links, "Cool Links!");
		linkBox.pack ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO buildPostPanel WRITEME...
	 */
	private void buildPostPanel () {
		postContainer = new FlexTable ();
		postContainer.getElement ().setAttribute ("width", "100%");

		postDiv = new SimplePanel ();
		postDiv.setStyleName ("wall-panel");
		postDiv.setWidget (postContainer);

		postBox = new Box (postDiv, "Comments");
		postBox.pack ();

		// TODO: externalise this string
		loadingPostsMessage = new Label (DisplayText.LOADING_COMMENTS);

		postContainer.setWidget (postContainer.getRowCount (), 0,
				loadingPostsMessage);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO buildTextPanel WRITEME...
	 */
	private void buildTextPanel () {
		final VerticalPanel textPanel = new VerticalPanel ();
		textPanel.getElement ()
				.setAttribute ("style", "padding: 10px;");
		final HorizontalPanel addPostPanel = new HorizontalPanel ();
		addPostPanel.setStyleName ("text-panel");

		textPanel.add (addPostPanel);
		textPanel.add (new HTMLPanel ("<br />"));

		final String textBoxHeader = "Make a new post!";

		textBox = new Box (textPanel, textBoxHeader);
		textBox.addRelImage (new Image (HomePage.user.getIconBaseURL ()
				+ "icon1.png"), 400, -185);
		textBox.pack ();

		final Button submit = 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) {
				try {
					submitText ();
				} catch (final PrivilegeRequiredException caught) {
					TootsBook.showError (caught);
				}
			}
		});
		final Button cancel = 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) {
				addCommentField
						.setText (HomePage.COMMENT_FIELD_DEFAULT_TEXT);
				addCommentField.addStyleName ("greyed-text");
			}
		});

		final VerticalPanel submitBox = new VerticalPanel ();
		submit.setStyleName ("confirm-button-small");
		submit.getElement ().setId ("submit-button-small");
		cancel.setStyleName ("confirm-button-small");
		cancel.getElement ().setId ("cancel-button-small");
		submit.setTitle ("SUBMIT");
		cancel.setTitle ("CANCEL");
		submitBox.add (cancel);
		submitBox.add (submit);
		submitBox.setSpacing (2);

		addCommentField = new TextArea ();
		addCommentField.setStyleName ("text-area");
		if (TootsBook.isLoggedIn ()) {
			addCommentField
					.setText (HomePage.COMMENT_FIELD_DEFAULT_TEXT);
			addCommentField.addStyleName ("greyed-text");
			addCommentField.setVisibleLines (1);
		} else {
			addCommentField
					.setText (DisplayText.LOGGED_IN_FOR_COMMENTS);
			addCommentField.getElement ().setAttribute ("disabled",
					"disabled");
			addCommentField.setVisibleLines (2);
		}
		addCommentField.getElement ().setAttribute ("cols", "25");
		addCommentField.getElement ().setAttribute ("wrap", "hard");
		addCommentField.getElement ().setAttribute ("maxlength",
				String.valueOf (TootsBook.MAX_CHAR_LENGTH));
		addCommentField.addFocusHandler (commentFocus);
		addCommentField.addBlurHandler (comemntBlur);
		addCommentField.getSelectionLength ();
		addCommentField.addKeyPressHandler (new KeyPressHandler () {
			/**
			 * @see com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google.gwt.event.dom.client.KeyPressEvent)
			 */
			@Override
			public void onKeyPress (final KeyPressEvent event) {
				if ( !TootsBook.filterKeys (
						event.getCharCode (),
						(addCommentField.getText ().length () >= TootsBook.MAX_CHAR_LENGTH))) {
					addCommentField.cancelKey ();
					return;
				}
				if (15 > addCommentField.getVisibleLines ()
						&& addCommentField.getText ().length () / 48 >= addCommentField
								.getVisibleLines ()) {
					addCommentField.setVisibleLines (addCommentField
							.getVisibleLines () + 1);
				}
			}
		});

		addPostPanel
				.setVerticalAlignment (HasVerticalAlignment.ALIGN_MIDDLE);
		addPostPanel.add (addCommentField);
		addPostPanel.add (submitBox);
		addPostPanel.setCellWidth (addCommentField, "415px");
		addPostPanel.setBorderWidth (0);

	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 31, 2009
	 * </pre>
	 * 
	 * TO buildTitlePanel WRITEME...
	 */
	private void buildTitlePanel () {
		titlePanel = new HTML ("<div class=\"header-text-container\">"
				+ "<div class=\"header-box\">"
				+ "<span class=\"header-name\">"
				+ HomePage.user.getUserName ()
				+ " </span><span class=\"header-text\">"
				+ HomePage.user.getStatus () + "</span></div></div>");
		titlePanel.setStyleName ("title-panel");
		titleBox = new Box (titlePanel);
		titleBox.useBackground ();
		titleBox.pack ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO getMostPosts WRITEME...
	 */
	 void getNewPosts () {
		final BookServiceAsync service = TootsBook.initService ();

		final AsyncCallback <Post []> callback = new AsyncCallback <Post []> () {

			@Override
			public void onFailure (final Throwable caught) {
				if (caught instanceof SessionTimedOutException) {
					TootsBook.showError (caught);
				}
				listenForPosts ();
			}

			@Override
			public void onSuccess (final Post [] result) {
				if (0 == result.length) {
					// no op
				} else {
					HomePage.this.loadNewPosts (result);
				}
				listenForPosts ();
			}
		};

		service.getNewHomePosts (newestPostID, callback);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO getMostPosts WRITEME...
	 */
	protected void getOlderPosts () {
		final BookServiceAsync service = TootsBook.initService ();

		final AsyncCallback <Post []> callback = new AsyncCallback <Post []> () {

			@Override
			public void onFailure (final Throwable caught) {
				TootsBook.showPopup (new ErrorMessage (ProfilePage
						.getUser ().getUserName ()
						+ " does not have any more posts to view!"));
			}

			@Override
			public void onSuccess (final Post [] result) {
				if (0 == result.length) {
					TootsBook
							.showPopup (new ErrorMessage (
									ProfilePage.getUser ()
											.getUserName ()
											+ " does not have any more posts to view!"));
				} else {
					HomePage.this.loadPosts (result);
				}
			}
		};

		service.getMoreBuddyPosts (HomePage.user.getUserID (),
				numberOfDisplayedPosts, callback);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 15, 2010
	 * </pre>
	 * 
	 * TO getPostsFromServer WRITEME...
	 */
	private void getPostsFromServer () {
		final BookServiceAsync service = TootsBook.initService ();

		// Set up the callback object.
		final AsyncCallback <Post []> callback = new AsyncCallback <Post []> () {
			@Override
			public void onFailure (final Throwable caught) {
				TootsBook.showError (caught);
			}

			@Override
			public void onSuccess (final Post [] result) {
				HomePage.this.loadPosts (result);
			}
		};

		// Make the call to the search service.
		service.getBuddyPosts (HomePage.user.getUserID (), callback);
		TootsBook.displayLoadingBar ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Feb 18, 2010
	 * </pre>
	 * 
	 * TO listenForPosts WRITEME...
	 */
	protected void listenForPosts () {
		TootsBook.clientMetronome.addOneTimeTask (new Task () {
			@Override
			public void execute () {
				getNewPosts ();
			}
		});
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO loadPosts WRITEME...
	 * 
	 * @param posts WRITEME twheys@gmail.com
	 */
	protected void loadNewPosts (final Post [] posts) {
		addNewPostsToWall (posts);
		addCommentsToPosts (posts);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO loadPosts WRITEME...
	 * 
	 * @param posts WRITEME
	 */
	protected void loadPosts (final Post [] posts) {
		if (0 == posts.length) {
			showNoCommentsToDisplayMessage ();
			return;
		}
		loadingPostsMessage.removeFromParent ();
		addPostsToWall (posts);
		addCommentsToPosts (posts);
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO showNoCommentsToDisplayMessage WRITEME...
	 */
	private void showNoCommentsToDisplayMessage () {
		loadingPostsMessage
				.setText ("There are no comments to read.  Add your buddies in Tootsville.");
	}

	/**
	 * <pre>
	 * twheys@gmail.com Jan 15, 2010
	 * </pre>
	 * 
	 * TO submitText WRITEME...
	 * 
	 * @throws PrivilegeRequiredException WRITEME
	 */
	protected void submitText () throws PrivilegeRequiredException {
		if ( !TootsBook.isLoggedIn ()) {
			throw new PrivilegeRequiredException (
					"You must be logged in to leave comments!");
		}
		final String newMessage = addCommentField.getText ().trim ();
		if (HomePage.COMMENT_FIELD_DEFAULT_TEXT.equals (newMessage)
				|| "".equals (newMessage)) {
			Effect.highlight (addCommentField, Color.RED, Color.WHITE,
					0.5);
			return;
		}
		addCommentField.setText ("");

		final Post newComment = new Post (TootsBook.getUser (),
				newMessage);

		final BookServiceAsync service = TootsBook.initService ();

		// Set up the callbacUserInfo.k object.
		final AsyncCallback <Post> callback = new AsyncCallback <Post> () {
			@Override
			public void onFailure (final Throwable caught) {
				TootsBook.hideLoadingBar ();
				TootsBook.showError (caught);
			}

			@Override
			public void onSuccess (final Post successfulComment) {
				TootsBook.hideLoadingBar ();
				HomePage.this.addPost (successfulComment);
			}
		};

		// Make the call to the search service.
		service.addPost (HomePage.user.getUserID (), newComment,
				callback);
		TootsBook.displayLoadingBar ();
	}

	/**
	 * <pre>
	 * twheys@gmail.com Dec 18, 2009
	 * </pre>
	 * 
	 * TO updateStatus WRITEME...
	 * 
	 * @param post WRITEME
	 */
	private void updateStatus (final Post post) {
		if (HomePage.user.getUserID () == post.getAuthor ()
				.getUserID ()) {
			HomePage.user.setStatus (post.getMessage ());
			titlePanel.setHTML ("<div class=\"header-text-container\">"
					+ "<span class=\"header-name\">"
					+ HomePage.user.getUserName ()
					+ " </span><span class=\"header-text\">"
					+ HomePage.user.getStatus () + "</span></div>");
		}
	}
}
