All pastes #75121 Raw Edit

Anonymous

public text v1 · immutable
#75121 ·published 2006-06-29 20:24 UTC
rendered paste body
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);
	}
}