package org.jblooming.waf.html.state;
import org.jblooming.PlatformRuntimeException;
import org.jblooming.waf.constants.Fields;
import org.jblooming.waf.html.core.HtmlBootstrap;
import org.jblooming.waf.html.core.JspHelper;
import org.jblooming.waf.html.core.UrlComposer;
import org.jblooming.waf.view.PageSeed;
import org.jblooming.waf.view.PageState;
import javax.servlet.ServletException;
import javax.servlet.jsp.PageContext;
import java.io.IOException;
import java.util.Set;
import java.util.HashSet;
public class Form extends UrlComposer {
public boolean w3cCompliant = false;
private boolean closeFormCalled;
private boolean openFormCalled;
private Drawer drawer;
public String target;
public static final String MULTIPART_FORM_DATA = "multipart/form-data";
public static final String APPLICATION_X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded";
public static final String FORM_START = "FORM_START";
public static final String FORM_END = "FORM_END";
/**
* do not use, if you need to add CE use form.usr not this
*/
public Set<String> entriesCarrier = null;
public boolean usePost = true;
public String encType = Form.APPLICATION_X_WWW_FORM_URLENCODED;
public boolean alertOnChange = false;
public static final String FLD_FORM_ORDER_BY = Fields.FORM_PREFIX + "FR_OBY";
public Form(PageSeed v) {
super(v);
if (v instanceof PageState)
throw new PlatformRuntimeException("NO PAGESTATE BUT PAGESEED IN THE FORM COSTRUCTOR!");
outputModality = UrlComposer.OUTPUT_AS_FORM;
this.drawer = new Drawer(this);
}
/**
* @deprecated use start and end
*/
public String toHtml() {
return toHtmlStringBuffer().toString();
}
/**
* @deprecated use start and end
*/
public StringBuffer toHtmlStringBuffer() {
StringBuffer bv = new StringBuffer(512);
bv.append(" enctype=\"").append(encType + "\"");
bv.append(" method=\"").append((this.usePost ? "POST" : "GET")).append("\" action=\"");
if (this.debug)
bv.append(request.getContextPath() + "/commons/administration/debug.jsp");
else
bv.append(url.getHref());
bv.append("\" name=\"").append(getUniqueName()).append('\"');
if (alertOnChange)
bv.append("\" alertOnChange=\"true\"");
if (launchedJsOnActionListened != null) {
bv.append(' ' + actionListened + "= \"if (event.keyCode==" + keyToHandle + " && " + (checkCtrlKey ? " event.ctrlKey==true " : " event.ctrlKey==false ") + ") { " + launchedJsOnActionListened);
bv.append("return false;}\"");
}
// bv.append(" id=\"").append(getUniqueName()).append("\" savedAction=\"\" savedTarget=\"\">\n");
bv.append(" id=\"").append(getUniqueName());
if(! w3cCompliant)
bv.append("\" savedAction=\"\" savedTarget=\"\"");
bv.append(">\n");
final String href = getHref();
if (href.endsWith(">"))
bv.append(href.substring(0, href.length() - 1));
else if (href.endsWith(">\n")) {
bv.append(href.substring(0, href.length() - 2)).append("\n");
} else
throw new PlatformRuntimeException("Form must end with >");
return bv;
}
public void start(PageContext pageContext) {
PageState.getCurrentPageState().htmlBootstrappers.add(this.drawer);
openFormCalled = true;
pageContext.getRequest().setAttribute(Drawer.ACTION, FORM_START);
drawer.toHtml(pageContext);
entriesCarrier = new HashSet(url.getClientEntries().getEntryKeys());
}
public void end(PageContext pageContext) {
if (!openFormCalled)
throw new PlatformRuntimeException("Call start before end. Form id:" + id);
if (!closeFormCalled) {
closeFormCalled = true;
pageContext.getRequest().setAttribute(Drawer.ACTION, FORM_END);
Set tmp = new HashSet(url.getClientEntries().getEntryKeys());
tmp.removeAll(entriesCarrier);
entriesCarrier = tmp;
drawer.toHtml(pageContext);
}
}
public class Drawer extends JspHelper implements HtmlBootstrap {
public Form form;
public Drawer(Form f) {
this.form = f;
this.urlToInclude = "/commons/layout/partForm.jsp";
}
public String getId() {
return id;
}
public String getDiscriminator() {
return getId();
}
public boolean validate(PageState pageState) throws IOException, ServletException {
return form.openFormCalled && form.closeFormCalled;
}
}
}