package 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); } }