package com.iambookmaster.client.player;
import com.google.gwt.dom.client.Document;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.NamedFrame;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.iambookmaster.client.beans.Paragraph;
import com.iambookmaster.client.common.JSONParser;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppLocale;
import com.iambookmaster.client.locale.AppMessages;
import com.iambookmaster.client.model.Model;
public abstract class FeedbackPanel extends VerticalPanel implements Feedback{
private static AppConstants appConstants = AppLocale.getAppConstants();
private static AppMessages appMessages = AppLocale.getAppMessages();
private static int COUNTER;
private FeedbackLevel story;
private FeedbackLevel complexity;
private FeedbackLevel view;
private TextArea note;
private HTML otherBooks;
private HTML otherAuthors;
private Button submit;
private HTML submitMail;
private FormPanel form;
private VerticalPanel formPanel;
private Model model;
// private boolean asEmail;
private String url;
private NamedFrame frame;
public FeedbackPanel(boolean viewOthers,String url,Paragraph paragraph,Model model,boolean asEmail, String allBooksURL) {
this.model = model;
// this.asEmail = asEmail;
this.url = url;
setSpacing(5);
setSize("100%", "100%");
setStyleName(PlayerStyles.ABOUT_PANEL);
Label label = new Label(appConstants.feedbackPleaseProvide());
add(label);
setCellHeight(label, "1%");
setCellWidth(label, "100%");
Grid grid = new Grid(3,2);
story = addItem(grid,appConstants.feedbackStory(),0);
complexity = addItem(grid,appConstants.feedbackComplexity(),1);
view = addItem(grid,appConstants.feedbackView(),2);
add(grid);
setCellHeight(grid, "1%");
setCellWidth(grid, "100%");
note = new TextArea();
note.setSize("100%","100%");
if (viewOthers) {
if (model.getGameKey()==null) {
//no game key, use gameId
otherBooks = new HTML(appMessages.feedbackViewOtherBooks("otherBooksKey",model.getGameKey()));
} else {
otherBooks = new HTML(appMessages.feedbackViewOtherBooks("otherBooksId",model.getGameId()));
}
add(otherBooks);
setCellHeight(otherBooks, "1%");
setCellWidth(otherBooks, "100%");
}
if (asEmail) {
ChangeHandler changeHandler = new ChangeHandler() {
public void onChange(ChangeEvent event) {
applyEmail();
}
};
story.addChangeHandler(changeHandler);
complexity.addChangeHandler(changeHandler);
view.addChangeHandler(changeHandler);
note.addChangeHandler(changeHandler);
}
otherAuthors = new HTML(appMessages.feedbackViewOthersAuthors(allBooksURL));
add(otherAuthors);
setCellHeight(otherAuthors, "1%");
setCellWidth(otherAuthors, "100%");
label = new Label(appConstants.feedbackAddNote());
add(label);
setCellHeight(label, "1%");
setCellWidth(label, "100%");
add(note);
setCellHeight(note, "99%");
setCellWidth(note, "100%");
DeferredCommand.addCommand(new Command(){
public void execute() {
int h = note.getOffsetHeight();
if (h<40) {
note.setVisibleLines(3);
}
}
});
HorizontalPanel horizontalPanel = new HorizontalPanel();
horizontalPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
horizontalPanel.setSize("100%", "100%");
add(horizontalPanel);
setCellHeight(horizontalPanel, "1%");
setCellWidth(horizontalPanel, "100%");
if (asEmail) {
submitMail = new HTML();
horizontalPanel.add(submitMail);
horizontalPanel.setCellWidth(submitMail, "50%");
horizontalPanel.setCellHorizontalAlignment(submitMail, HasHorizontalAlignment.ALIGN_CENTER);
applyEmail();
} else {
frame = new NamedFrame(FeedbackPanel.class.getName()+String.valueOf(++COUNTER));
frame.setHeight("1px");
frame.setWidth("1px");
frame.setVisible(false);
Document.get().getBody().appendChild(frame.getElement());
submit = new Button(appConstants.feedbackSubmit());
submit.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
submitFeedback();
DeferredCommand.addCommand(new Command(){
public void execute() {
onClose();
}
});
}
});
horizontalPanel.add(submit);
horizontalPanel.setCellWidth(submit, "50%");
horizontalPanel.setCellHorizontalAlignment(submit, HasHorizontalAlignment.ALIGN_CENTER);
form = new FormPanel(frame);
form.setVisible(false);
form.setAction(url);
form.setEncoding(FormPanel.ENCODING_URLENCODED);
formPanel = new VerticalPanel();
form.setMethod(FormPanel.METHOD_GET);
if (paragraph != null) {
formPanel.add(new Hidden(PARAGRAPH,paragraph.getId()));
}
formPanel.add(new Hidden(GAME_ID,model.getGameId()));
if (model.getGameKey() != null) {
formPanel.add(new Hidden(GAME_KEY,model.getGameKey()));
}
formPanel.add(new Hidden(GAME_TITLE,model.getSettings().getBookTitle()));
formPanel.add(new Hidden(GAME_AUTHORS,model.getSettings().getBookAuthors()));
form.setMethod(FormPanel.METHOD_POST);
form.add(formPanel);
horizontalPanel.add(form);
horizontalPanel.setCellWidth(form,"1px");
}
Button closeButton = new Button(AppLocale.getAppConstants().buttonClose(),new ClickHandler() {
public void onClick(ClickEvent event) {
onClose();
}
});
horizontalPanel.add(closeButton);
horizontalPanel.setCellHorizontalAlignment(closeButton,HasHorizontalAlignment.ALIGN_CENTER);
horizontalPanel.setCellWidth(closeButton,"100%");
}
protected abstract void onClose();
private void applyEmail() {
StringBuffer buffer = new StringBuffer();
buffer.append('\n');
buffer.append(model.getSettings().getBookTitle());
buffer.append('\n');
buffer.append(model.getSettings().getBookAuthors());
buffer.append('\n');
buffer.append(appConstants.feedbackBodyHead());
buffer.append('\n');
buffer.append(STORY_RATING);
buffer.append('=');
buffer.append(String.valueOf(story.getValue()));
buffer.append('\n');
buffer.append(COMPLEXITY_RATING);
buffer.append('=');
buffer.append(String.valueOf(complexity.getValue()));
buffer.append('\n');
buffer.append(APPEARENCE_RATING);
buffer.append('=');
buffer.append(String.valueOf(view.getValue()));
buffer.append('\n');
if (model.getGameKey() == null) {
buffer.append(GAME_ID);
buffer.append('=');
buffer.append(model.getGameId());
} else {
buffer.append(GAME_KEY);
buffer.append('=');
buffer.append(model.getGameKey());
}
if (note.getText().trim().length()>0) {
buffer.append('\n');
buffer.append(NOTE);
buffer.append('=');
buffer.append(note.getText().trim());
}
submitMail.setHTML(appMessages.feedbackSubmitMail(url,JSONParser.mailToEncode(appConstants.feedbackSubject())+(model.getSettings().getFeedbackEmail() != null ? "&cc="+model.getSettings().getFeedbackEmail():""),JSONParser.mailToEncode(buffer.toString())));
}
private void submitFeedback() {
formPanel.add(new Hidden(STORY_RATING,String.valueOf(story.getValue())));
formPanel.add(new Hidden(COMPLEXITY_RATING,String.valueOf(complexity.getValue())));
formPanel.add(new Hidden(APPEARENCE_RATING,String.valueOf(view.getValue())));
formPanel.add(new Hidden(NOTE,note.getText().trim()));
form.submit();
}
private FeedbackLevel addItem(Grid grid, String title,int row) {
Label label = new Label(title,false);
grid.setWidget(row, 0, label);
grid.getRowFormatter().setStyleName(row, PlayerStyles.FEEDBACK_ROW);
FeedbackLevel level = new FeedbackLevel();
grid.setWidget(row, 1, level);
return level;
}
}