rendered paste bodypackage com.loomis.jsf.component.clientsidevalidatedinput;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;
import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
import com.loomis.jsf.component.javascriptvalidatorfunction.JavaScriptValidatorFunction;
public class ClientSideValidatedInputRenderer extends Renderer {
@Override
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
if ((context == null) || (component == null)) throw new NullPointerException();
if (!component.isRendered()) return;
ClientSideValidatedInput csvi = (ClientSideValidatedInput) component;
HtmlInputText input = new HtmlInputText();
ResponseWriter writer = context.getResponseWriter();
input.getAttributes().put("on" + csvi.getValidatesOn(),
generateUpdateFunctionName(csvi) + "(this.value)");
input.setId(csvi.getId());
input.encodeBegin(context);
input.encodeChildren(context);
input.encodeEnd(context);
writer.startElement(HTML.SCRIPT_ELEM, null);
writer.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
writer.writeText(generateJavascript(context, component), null);
writer.endElement(HTML.SCRIPT_ELEM);
}
public String generateJavascript(FacesContext context, UIComponent component) throws IOException {
if ((context == null) || (component == null)) throw new NullPointerException();
ClientSideValidatedInput csvi = (ClientSideValidatedInput) component;
String idOfMessageElement = csvi.getIdOfMessageElement();
String messageIfAllTrue = csvi.getMessageIfAllTrue();
String elementsToDisable = csvi.getElementsToDisable();
String updateFunction = generateUpdateFunctionName(csvi);
String validationSuit = generateValidationSuitName(csvi);
StringBuffer jsBuff = new StringBuffer("function " + validationSuit + "(str){");
for (Object child : csvi.getChildren()) {
if (child instanceof JavaScriptValidatorFunction) {
JavaScriptValidatorFunction jsvf = (JavaScriptValidatorFunction) child;
jsBuff.append(String.format("if (!%s(str, %s)) return '%s'; ",
jsvf.getFunctionName(), jsvf.getAdditionalParameters(),
jsvf.getMessageIfFalse()));
}
}
jsBuff.append("return '" + messageIfAllTrue + "';");
jsBuff.append("}");
jsBuff.append("function " + updateFunction + "(str) {");
jsBuff.append("var elementToDisable = document.getElementById('" +
elementsToDisable + "');");
jsBuff.append("var idOfMessageElement = '" + idOfMessageElement + "';");
jsBuff.append("var message = " + validationSuit + "(str);");
jsBuff.append("var messageSpan = document.createElement('span');");
jsBuff.append("var div = document.getElementById(idOfMessageElement);");
jsBuff.append("messageSpan.setAttribute('id', 'message_for_' + idOfMessageElement);");
jsBuff.append("while(div.firstChild) div.removeChild(div.firstChild);");
jsBuff.append("messageSpan.appendChild(document.createTextNode(message));");
jsBuff.append("div.appendChild(messageSpan); ");
jsBuff.append("if (message != '" + messageIfAllTrue + "')");
jsBuff.append("{ elementToDisable.disabled = true;} " +
"else {elementToDisable.disabled = false;}");
jsBuff.append("}");
jsBuff.append("alert(document.getElementById('" +
elementsToDisable + "').disabled);");
return jsBuff.toString();
}
private String generateUpdateFunctionName(ClientSideValidatedInput csvi) {
return "CSVI_" + csvi.getId() + "_updating_" + csvi.getIdOfMessageElement() +
"_" + csvi.hashCode();
}
private String generateValidationSuitName(ClientSideValidatedInput csvi) {
return "validation_for_" + generateUpdateFunctionName(csvi);
}
@Override
public void decode(FacesContext context, UIComponent component) {
super.decode(context, component);
}
}