package page.tools.admin;
import java.io.IOException;
import org.wikiwebserver.core.Privilege;
import org.wikiwebserver.core.WareHouse;
import org.wikiwebserver.handler.http.FormData;
import org.wikiwebserver.handler.http.HTTPHandler;
import org.wikiwebserver.handler.http.interfaces.HTTPResponder;
import page.tools.entity.Browser;
import page.tools.entity.User;
import static org.wikiwebserver.html.HTMLHelper.*;
public class JQueryQuickSignIn implements HTTPResponder {
private static final String emailField = "qsi_email";
private static final String passwordField = "qsi_password";
private static final String signinButton = "qsi_signin_button";
private static final String signoutButton = "qsi_signout_button";
private static final String resetButton = "qsi_reset_button";
public Object respond(HTTPHandler conn) throws IOException {
String registerUrl = WareHouse.getUrlPathForClass(UserProfile.class);
User user = User.getUserById(conn.getRequest().getHeaders().getRequestCookies().get("userID"));
Browser browser = Browser.getBrowser(conn);
User authenticatedUser = User.getUser(conn.getRequest());
String error = null;
FormData formData = conn.getRequest().getFormData();
if (formData != null) {
String button = formData.getFirst("button");
String email = formData.getFirst(emailField);
String password = formData.getFirst(passwordField);
user = User.getUserByEmail(email);
if (button == null) {
} else if (authenticatedUser != null && button.equals(signoutButton)) {
authenticatedUser.endSession(conn.getRequest(), conn.getResponse());
authenticatedUser = null;
} else if (button.equals(resetButton)) {
try {
user.resetPassword(conn);
} catch (Exception ex) {
error = "Failed to reset password: " + ex.getMessage();
}
} else if (button.equals(signinButton)) {
if (user == null) {
error = "Account not found. " +
a(registerUrl, "Register a new user account") + "." +
javaScript("$('#" + emailField + "').css('border-color', 'red');");
}
else if (!user.isCorrectPassword(password)) {
error = "Incorrect password. " +
submitbutton(resetButton, "Email a new password") + " to " + email + "." +
javaScript(buttonActionJavaScript(resetButton, emailField) +
"$('#" + passwordField + "').css('border-color', 'red');");
}
else {
user.startSession(password, conn);
}
authenticatedUser = User.getUser(conn.getRequest());
}
}
StringBuilder body = new StringBuilder();
if (authenticatedUser != null) {
body.append(getSignOutForm());
body.append("Signed in as " + authenticatedUser.getEmail());
String userID = authenticatedUser.getId();
String develop = WareHouse.getUrlPathForClass(page.tools.management.SandBox.class);
String upload = WareHouse.getUrlPathForClass(page.tools.management.FileUploadPage.class);
String edit = WareHouse.getUrlPathForClass(page.example.UserFiles.class) + "?userID=" + userID;
String details = WareHouse.getUrlPathForClass(page.tools.stats.BrowserInfo.class) + "?userID=" + userID;
body.append(" [ ");
body.append(a(develop, "Develop") + " | ");
body.append(a(upload, "Upload") + " | ");
body.append(a(edit, "My Files") + " | ");
body.append(a(details, "My Details") + " ");
body.append("]");
if (authenticatedUser.getPrivilege().isAbove(Privilege.PREMIUM_USER)) {
body.append(" (" + authenticatedUser.getPrivilege().getLabel() + ")");
}
}
else if (authenticatedUser == null) {
String email = (user == null) ? "" : user.getEmail();
body.append(getSignInForm(email));
if (error != null) {
body.append(error);
} else if (browser == null) {
body.append("Welcome, please enable cookie support to sign in.");
} else {
body.append("Welcome ");
String details = WareHouse.getUrlPathForClass(page.tools.stats.BrowserInfo.class)
+ "?browserID=" + browser.getId();
body.append(a(details, "guest") + ", please sign in or ");
body.append(a(registerUrl, "register a new user account") + ".");
}
}
return body.toString();
}
private String getSignInForm(String email) {
StringBuilder form = new StringBuilder();
form.append(div("signin",
textfield(emailField, email) +
passwordfield(passwordField, "") +
submitbutton(signinButton, "Sign in")
));
form.append(javaScript(
buttonActionJavaScript(signinButton, emailField, passwordField) +
"populateElement('#" + emailField + "', 'Email address');"));
return form.toString();
}
private String getSignOutForm() {
StringBuilder form = new StringBuilder();
form.append(div("signin", submitbutton(signoutButton, "Sign out")));
form.append(javaScript(buttonActionJavaScript(signoutButton)));
return form.toString();
}
private String buttonActionJavaScript(String buttonId, String... fieldNames) {
String thisUrl = WareHouse.getUrlPathForClass(this.getClass());
return
"$('#" + buttonId + "').click(function(){" +
" $('#quick-signin').slideUp(200, function(){" +
" var button = '" + buttonId + "';" +
" $.post('" + thisUrl + "', { " +
"button: button" + getFieldData(fieldNames) +
" }, function(html) {" +
" $('#quick-signin').html(html);" +
" $('#quick-signin').slideDown(500);" +
" });" +
" });" +
"});";
}
private String getFieldData(String... fieldNames) {
StringBuilder js = new StringBuilder();
for (int i=0; i